diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c4f2ee1726a..2cfff788538 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -7,6 +7,7 @@ "workspaceFolder": "/workspace", "shutdownAction": "stopCompose", "postCreateCommand": "/docker-init.sh", + "postStartCommand": "/docker-start.sh", "containerEnv": { "EDITOR_VSCODE": "true" }, @@ -22,7 +23,7 @@ "dbaeumer.vscode-eslint", "eamodio.gitlens", "editorconfig.editorconfig", - "vue.volar", + "vue.volar@2.2.10", "mrmlnc.vscode-duplicate", "ms-azuretools.vscode-docker", "ms-playwright.playwright", @@ -32,23 +33,16 @@ "oderwat.indent-rainbow", "redhat.vscode-yaml", "spmeesseman.vscode-taskexplorer", - "visualstudioexptteam.vscodeintellicode" + "ms-python.pylint", + "charliermarsh.ruff" ], "settings": { "terminal.integrated.defaultProfile.linux": "zsh", "python.pythonPath": "/usr/local/bin/python", "python.languageServer": "Default", - "python.linting.enabled": true, - "python.linting.pylintEnabled": true, "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", "python.formatting.blackPath": "/usr/local/py-utils/bin/black", "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", - "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", - "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", - "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", - "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", - "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", - "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint", "python.testing.pytestArgs": [ "ietf" ], @@ -66,7 +60,7 @@ }, // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [8000, 5432, 5433], + "forwardPorts": [3000, 5432, 8000], "portsAttributes": { "3000": { @@ -77,13 +71,13 @@ "label": "PostgreSQL", "onAutoForward": "silent" }, - "5433": { - "label": "pgAdmin", - "onAutoForward": "silent" - }, "8000": { - "label": "Datatracker", + "label": "NGINX", "onAutoForward": "notify" + }, + "8001": { + "label": "Datatracker", + "onAutoForward": "ignore" } }, diff --git a/.devcontainer/docker-compose.extend.yml b/.devcontainer/docker-compose.extend.yml index b9b5a2764d8..a92f42bc6d4 100644 --- a/.devcontainer/docker-compose.extend.yml +++ b/.devcontainer/docker-compose.extend.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: app: environment: @@ -14,9 +12,10 @@ services: # - datatracker-vscode-ext:/root/.vscode-server/extensions # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function. network_mode: service:db - - pgadmin: - network_mode: service:db + blobstore: + ports: + - '9000' + - '9001' volumes: datatracker-vscode-ext: diff --git a/.editorconfig b/.editorconfig index d6eafe8d8f2..7e5ce6236af 100644 --- a/.editorconfig +++ b/.editorconfig @@ -50,3 +50,9 @@ indent_size = 2 [ietf/**.html] insert_final_newline = false + +# Settings for Kubernetes yaml +# --------------------------------------------------------- +# Use 2-space indents +[k8s/**.yaml] +indent_size = 2 diff --git a/.gitattributes b/.gitattributes index 937c0eb3795..62f4aae4323 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,280 @@ -/.yarn/releases/** binary -/.yarn/plugins/** binary +# Auto detect text files and perform LF normalization +* text=auto + +# --------------------------------------------------- +# Python Projects +# --------------------------------------------------- + +# Source files +*.pxd text diff=python +*.py text diff=python +*.py3 text diff=python +*.pyw text diff=python +*.pyx text diff=python +*.pyz text diff=python +*.pyi text diff=python + +# Binary files +*.db binary +*.p binary +*.pkl binary +*.pickle binary +*.pyc binary export-ignore +*.pyo binary export-ignore +*.pyd binary + +# Jupyter notebook +*.ipynb text eol=lf + +# --------------------------------------------------- +# Web Projects +# --------------------------------------------------- + +# Source code +*.bash text eol=lf +*.bat text eol=crlf +*.cmd text eol=crlf +*.coffee text +*.css text diff=css +*.htm text diff=html +*.html text diff=html +*.inc text +*.ini text +*.js text +*.mjs text +*.cjs text +*.json text +*.jsx text +*.less text +*.ls text +*.map text -diff +*.od text +*.onlydata text +*.php text diff=php +*.pl text +*.ps1 text eol=crlf +*.py text diff=python +*.rb text diff=ruby +*.sass text +*.scm text +*.scss text diff=css +*.sh text eol=lf +.husky/* text eol=lf +*.sql text +*.styl text +*.tag text +*.ts text +*.tsx text +*.xml text +*.xhtml text diff=html + +# Docker +Dockerfile text + +# Documentation +*.ipynb text eol=lf +*.markdown text diff=markdown +*.md text diff=markdown +*.mdwn text diff=markdown +*.mdown text diff=markdown +*.mkd text diff=markdown +*.mkdn text diff=markdown +*.mdtxt text +*.mdtext text +*.txt text +AUTHORS text +CHANGELOG text +CHANGES text +CONTRIBUTING text +COPYING text +copyright text +*COPYRIGHT* text +INSTALL text +license text +LICENSE text +NEWS text +readme text +*README* text +TODO text + +# Templates +*.dot text +*.ejs text +*.erb text +*.haml text +*.handlebars text +*.hbs text +*.hbt text +*.jade text +*.latte text +*.mustache text +*.njk text +*.phtml text +*.pug text +*.svelte text +*.tmpl text +*.tpl text +*.twig text +*.vue text + +# Configs +*.cnf text +*.conf text +*.config text +.editorconfig text +.env text +.gitattributes text +.gitconfig text +.htaccess text +*.lock text -diff +package.json text eol=lf +package-lock.json text eol=lf -diff +pnpm-lock.yaml text eol=lf -diff +.prettierrc text +yarn.lock text -diff +*.toml text +*.yaml text +*.yml text +browserslist text +Makefile text +makefile text +# Fixes syntax highlighting on GitHub to allow comments +tsconfig.json linguist-language=JSON-with-Comments + +# Heroku +Procfile text + +# Graphics +*.ai binary +*.bmp binary +*.eps binary +*.gif binary +*.gifv binary +*.ico binary +*.jng binary +*.jp2 binary +*.jpg binary +*.jpeg binary +*.jpx binary +*.jxr binary +*.pdf binary +*.png binary +*.psb binary +*.psd binary +*.svg text +*.svgz binary +*.tif binary +*.tiff binary +*.wbmp binary +*.webp binary + +# Audio +*.kar binary +*.m4a binary +*.mid binary +*.midi binary +*.mp3 binary +*.ogg binary +*.ra binary + +# Video +*.3gpp binary +*.3gp binary +*.as binary +*.asf binary +*.asx binary +*.avi binary +*.fla binary +*.flv binary +*.m4v binary +*.mng binary +*.mov binary +*.mp4 binary +*.mpeg binary +*.mpg binary +*.ogv binary +*.swc binary +*.swf binary +*.webm binary + +# Archives +*.7z binary +*.gz binary +*.jar binary +*.rar binary +*.tar binary +*.zip binary + +# Fonts +*.ttf binary +*.eot binary +*.otf binary +*.woff binary +*.woff2 binary + +# Executables +*.exe binary +*.pyc binary +# Prevents massive diffs caused by vendored, minified files +**/.yarn/releases/** binary +**/.yarn/plugins/** binary + +# RC files (like .babelrc or .eslintrc) +*.*rc text + +# Ignore files (like .npmignore or .gitignore) +*.*ignore text + +# Prevents massive diffs from built files +dist/* binary + +# --------------------------------------------------- +# Common +# --------------------------------------------------- + +# Documents +*.bibtex text diff=bibtex +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain +*.md text diff=markdown +*.mdx text diff=markdown +*.tex text diff=tex +*.adoc text +*.textile text +*.mustache text +*.csv text eol=crlf +*.tab text +*.tsv text +*.txt text +*.sql text +*.epub diff=astextplain + +# Text files where line endings should be preserved +*.patch -text + +# --------------------------------------------------- +# Vzic specific +# --------------------------------------------------- + +*.pl text diff=perl +*.pm text diff=perl + +# C/C++ +*.c text diff=cpp +*.cc text diff=cpp +*.cxx text diff=cpp +*.cpp text diff=cpp +*.cpi text diff=cpp +*.c++ text diff=cpp +*.hpp text diff=cpp +*.h text diff=cpp +*.h++ text diff=cpp +*.hh text diff=cpp \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 5e27af9fed9..320614b17ec 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ -blank_issues_enabled: false -contact_links: - - name: Help and questions - url: https://github.com/ietf-tools/datatracker/discussions/categories/help-questions - about: Need help? Have a question on setting up the project or its usage? - - name: Discuss new ideas - url: https://github.com/ietf-tools/datatracker/discussions/categories/ideas - about: Submit ideas for new features or improvements to be discussed. +blank_issues_enabled: false +contact_links: + - name: Help and questions + url: https://github.com/ietf-tools/datatracker/discussions/categories/help-questions + about: Need help? Have a question on setting up the project or its usage? + - name: Discuss new ideas + url: https://github.com/ietf-tools/datatracker/discussions/categories/ideas + about: Submit ideas for new features or improvements to be discussed. diff --git a/.github/ISSUE_TEMPLATE/new-feature.yml b/.github/ISSUE_TEMPLATE/new-feature.yml index ddf0b575e84..285081e1c8b 100644 --- a/.github/ISSUE_TEMPLATE/new-feature.yml +++ b/.github/ISSUE_TEMPLATE/new-feature.yml @@ -1,6 +1,7 @@ name: Suggest new feature or enhancement description: Propose a new idea to be implemented. labels: ["enhancement"] +type: Feature body: - type: markdown attributes: diff --git a/.github/ISSUE_TEMPLATE/report-a-bug.yml b/.github/ISSUE_TEMPLATE/report-a-bug.yml index d5b725d7213..47fa1185b40 100644 --- a/.github/ISSUE_TEMPLATE/report-a-bug.yml +++ b/.github/ISSUE_TEMPLATE/report-a-bug.yml @@ -1,6 +1,7 @@ name: Report a Datatracker bug description: Something in the datatracker's behavior isn't right? File a bug report. Don't use this to report RFC errata or issues with the content of Internet-Drafts. labels: ["bug"] +type: Bug body: - type: markdown attributes: diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4687d04aa9a..17d89f1aab6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,3 +17,45 @@ updates: directory: "/" schedule: interval: "weekly" + reviewers: + - "rjsparks" + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + groups: + yarn: + patterns: + - "*" + - package-ecosystem: "npm" + directory: "/playwright" + schedule: + interval: "weekly" + groups: + npm: + patterns: + - "*" + - package-ecosystem: "npm" + directory: "/dev/coverage-action" + schedule: + interval: "weekly" + groups: + npm: + patterns: + - "*" + - package-ecosystem: "npm" + directory: "/dev/deploy-to-container" + schedule: + interval: "weekly" + groups: + npm: + patterns: + - "*" + - package-ecosystem: "npm" + directory: "/dev/diff" + schedule: + interval: "weekly" + groups: + npm: + patterns: + - "*" diff --git a/.github/workflows/build-base-app.yml b/.github/workflows/build-base-app.yml index 1be6d802fd9..4a4394fca0c 100644 --- a/.github/workflows/build-base-app.yml +++ b/.github/workflows/build-base-app.yml @@ -1,42 +1,67 @@ -name: Build Base App Docker Image - -on: - push: - branches: - - 'main' - paths: - - 'docker/base.Dockerfile' - - workflow_dispatch: - -jobs: - publish: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - uses: actions/checkout@v3 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Docker Build & Push - uses: docker/build-push-action@v4 - with: - context: . - file: docker/base.Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ghcr.io/ietf-tools/datatracker-app-base:latest +name: Build Base App Docker Image + +on: + push: + branches: + - 'main' + paths: + - 'docker/base.Dockerfile' + - 'requirements.txt' + + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GH_COMMON_TOKEN }} + + - name: Set Version + run: | + printf -v CURDATE '%(%Y%m%dT%H%M)T' -1 + echo "IMGVERSION=$CURDATE" >> $GITHUB_ENV + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Docker Build & Push + uses: docker/build-push-action@v6 + env: + DOCKER_BUILD_SUMMARY: false + with: + context: . + file: docker/base.Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: | + ghcr.io/ietf-tools/datatracker-app-base:${{ env.IMGVERSION }} + ghcr.io/ietf-tools/datatracker-app-base:py312 + ${{ github.ref == 'refs/heads/main' && 'ghcr.io/ietf-tools/datatracker-app-base:latest' || '' }} + + - name: Update version references + run: | + sed -i "1s/.*/FROM ghcr.io\/ietf-tools\/datatracker-app-base:${{ env.IMGVERSION }}/" dev/build/Dockerfile + echo "${{ env.IMGVERSION }}" > dev/build/TARGET_BASE + + - name: Commit CHANGELOG.md + uses: stefanzweifel/git-auto-commit-action@v6 + with: + branch: ${{ github.ref_name }} + commit_message: 'ci: update base image target version to ${{ env.IMGVERSION }}' + file_pattern: dev/build/Dockerfile dev/build/TARGET_BASE diff --git a/.github/workflows/build-celery-worker.yml b/.github/workflows/build-celery-worker.yml deleted file mode 100644 index be0fc131a50..00000000000 --- a/.github/workflows/build-celery-worker.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Build Celery Worker Docker Image - -on: - push: - branches: - - 'main' - paths: - - 'requirements.txt' - - 'dev/celery/**' - - '.github/workflows/build-celery-worker.yml' - - workflow_dispatch: - -jobs: - publish: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - uses: actions/checkout@v3 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Docker Build & Push - uses: docker/build-push-action@v4 - with: - context: . - file: dev/celery/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ghcr.io/ietf-tools/datatracker-celery:latest - diff --git a/.github/workflows/build-devblobstore.yml b/.github/workflows/build-devblobstore.yml new file mode 100644 index 00000000000..f49a11af19c --- /dev/null +++ b/.github/workflows/build-devblobstore.yml @@ -0,0 +1,47 @@ +name: Build Dev/Test Blobstore Docker Image + +on: + push: + branches: + - 'main' + paths: + - '.github/workflows/build-devblobstore.yml' + + workflow_dispatch: + +env: + MINIO_VERSION: latest + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Docker Build & Push + uses: docker/build-push-action@v6 + env: + DOCKER_BUILD_SUMMARY: false + with: + context: . + file: docker/devblobstore.Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + build-args: MINIO_VERSION=${{ env.MINIO_VERSION }} + tags: | + ghcr.io/ietf-tools/datatracker-devblobstore:${{ env.MINIO_VERSION }} + ghcr.io/ietf-tools/datatracker-devblobstore:latest diff --git a/.github/workflows/build-mq-broker.yml b/.github/workflows/build-mq-broker.yml index 03df98d123e..4de861dbcd3 100644 --- a/.github/workflows/build-mq-broker.yml +++ b/.github/workflows/build-mq-broker.yml @@ -8,7 +8,13 @@ on: - 'dev/mq/**' - '.github/workflows/build-mq-broker.yml' - workflow_dispatch: + workflow_dispatch: + inputs: + rabbitmq_version: + description: 'RabbitMQ Version' + default: '3.13-alpine' + required: true + type: string jobs: publish: @@ -18,27 +24,31 @@ jobs: packages: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Docker Build & Push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 + env: + DOCKER_BUILD_SUMMARY: false with: context: . file: dev/mq/Dockerfile platforms: linux/amd64,linux/arm64 push: true - tags: ghcr.io/ietf-tools/datatracker-mq:latest - + build-args: RABBITMQ_VERSION=${{ inputs.rabbitmq_version }} + tags: | + ghcr.io/ietf-tools/datatracker-mq:${{ inputs.rabbitmq_version }} + ghcr.io/ietf-tools/datatracker-mq:latest diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a2ac8bd7ae3..5e91445202b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,26 +7,35 @@ on: workflow_dispatch: inputs: - summary: - description: 'Release Summary' - required: false - type: string - default: '' - sandbox: - description: 'Deploy to Sandbox' + deploy: + description: 'Deploy to K8S' + default: 'Skip' + required: true + type: choice + options: + - Skip + - Staging Only + - Staging + Prod + dev: + description: 'Deploy to Dev' default: true required: true type: boolean - legacySandbox: - description: 'Deploy to Legacy Sandbox' + devNoDbRefresh: + description: 'Dev Disable Daily DB Refresh' default: false - required: false + required: true type: boolean skiptests: description: 'Skip Tests' default: false required: true type: boolean + skiparm: + description: 'Skip ARM64 Build' + default: false + required: true + type: boolean ignoreLowerCoverage: description: 'Ignore Lower Coverage' default: false @@ -38,6 +47,10 @@ on: required: true type: boolean +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: # ----------------------------------------------------------------- # PREPARE @@ -50,259 +63,147 @@ jobs: pkg_version: ${{ steps.buildvars.outputs.pkg_version }} from_tag: ${{ steps.semver.outputs.nextStrict }} to_tag: ${{ steps.semver.outputs.current }} + base_image_version: ${{ steps.baseimgversion.outputs.base_image_version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 1 + fetch-tags: false - - name: Get Next Version + - name: Get Next Version (Prod) if: ${{ github.ref_name == 'release' }} id: semver uses: ietf-tools/semver-action@v1 with: token: ${{ github.token }} - branch: main + branch: release skipInvalidTags: true - - - name: Set Next Version Env Var + patchList: fix, bugfix, perf, refactor, test, tests, chore + + - name: Get Dev Version + if: ${{ github.ref_name != 'release' }} + id: semverdev + uses: ietf-tools/semver-action@v1 + with: + token: ${{ github.token }} + branch: release + skipInvalidTags: true + noVersionBumpBehavior: 'current' + noNewCommitBehavior: 'current' + + - name: Set Release Flag if: ${{ github.ref_name == 'release' }} run: | - echo "NEXT_VERSION=$nextStrict" >> $GITHUB_ENV + echo "IS_RELEASE=true" >> $GITHUB_ENV - name: Create Draft Release - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.18.0 if: ${{ github.ref_name == 'release' }} with: prerelease: true draft: false commit: ${{ github.sha }} - tag: ${{ env.NEXT_VERSION }} - name: ${{ env.NEXT_VERSION }} + tag: ${{ steps.semver.outputs.nextStrict }} + name: ${{ steps.semver.outputs.nextStrict }} body: '*pending*' token: ${{ secrets.GITHUB_TOKEN }} - name: Set Build Variables id: buildvars run: | - if [[ $NEXT_VERSION ]]; then - echo "Using AUTO SEMVER mode: $NEXT_VERSION" + if [[ $IS_RELEASE ]]; then + echo "Using AUTO SEMVER mode: ${{ steps.semver.outputs.nextStrict }}" echo "should_deploy=true" >> $GITHUB_OUTPUT - echo "pkg_version=$NEXT_VERSION" >> $GITHUB_OUTPUT - echo "::notice::Release $NEXT_VERSION created using branch $GITHUB_REF_NAME" + echo "pkg_version=${{ steps.semver.outputs.nextStrict }}" >> $GITHUB_OUTPUT + echo "::notice::Release ${{ steps.semver.outputs.nextStrict }} created using branch $GITHUB_REF_NAME" else - echo "Using TEST mode: 10.0.0-dev.$GITHUB_RUN_NUMBER" + echo "Using TEST mode: ${{ steps.semverdev.outputs.nextMajorStrict }}.0.0-dev.$GITHUB_RUN_NUMBER" echo "should_deploy=false" >> $GITHUB_OUTPUT - echo "pkg_version=10.0.0-dev.$GITHUB_RUN_NUMBER" >> $GITHUB_OUTPUT - echo "::notice::Non-production build 10.0.0-dev.$GITHUB_RUN_NUMBER created using branch $GITHUB_REF_NAME" + echo "pkg_version=${{ steps.semverdev.outputs.nextMajorStrict }}.0.0-dev.$GITHUB_RUN_NUMBER" >> $GITHUB_OUTPUT + echo "::notice::Non-production build ${{ steps.semverdev.outputs.nextMajorStrict }}.0.0-dev.$GITHUB_RUN_NUMBER created using branch $GITHUB_REF_NAME" fi + - name: Get Base Image Target Version + id: baseimgversion + run: | + echo "base_image_version=$(sed -n '1p' dev/build/TARGET_BASE)" >> $GITHUB_OUTPUT + # ----------------------------------------------------------------- # TESTS # ----------------------------------------------------------------- - tests-python: - name: Run Tests (Python) + + tests: + name: Run Tests + uses: ./.github/workflows/tests.yml if: ${{ github.event.inputs.skiptests == 'false' || github.ref_name == 'release' }} needs: [prepare] - runs-on: ubuntu-latest - container: ghcr.io/ietf-tools/datatracker-app-base:latest - - services: - db: - image: ghcr.io/ietf-tools/datatracker-db:latest - - steps: - - uses: actions/checkout@v3 - - - name: Prepare for tests - run: | - chmod +x ./dev/tests/prepare.sh - sh ./dev/tests/prepare.sh - - - name: Ensure DB is ready - run: | - /usr/local/bin/wait-for db:5432 -- echo "DB ready" - - - name: Run all tests - shell: bash - run: | - echo "Running checks..." - ./ietf/manage.py check - ./ietf/manage.py migrate --fake-initial - echo "Validating migrations..." - if ! ( ietf/manage.py makemigrations --dry-run --check --verbosity 3 ) ; then - echo "Model changes without migrations found." - exit 1 - fi - echo "Running tests..." - if [[ "x${{ github.event.inputs.ignoreLowerCoverage }}" == "xtrue" ]]; then - echo "Lower coverage failures will be ignored." - ./ietf/manage.py test --settings=settings_postgrestest --ignore-lower-coverage - else - ./ietf/manage.py test --settings=settings_postgrestest - fi - coverage xml - - - name: Upload Coverage Results to Codecov - uses: codecov/codecov-action@v3.1.3 - with: - files: coverage.xml - - - name: Convert Coverage Results - if: ${{ always() }} - run: | - mv latest-coverage.json coverage.json - - - name: Upload Coverage Results as Build Artifact - uses: actions/upload-artifact@v3 - if: ${{ always() }} - with: - name: coverage - path: coverage.json + secrets: inherit + with: + ignoreLowerCoverage: ${{ github.event.inputs.ignoreLowerCoverage == 'true' }} + skipSelenium: true + targetBaseVersion: ${{ needs.prepare.outputs.base_image_version }} - tests-playwright: - name: Run Tests (Playwright) - if: ${{ github.event.inputs.skiptests == 'false' || github.ref_name == 'release' }} - needs: [prepare] - runs-on: macos-latest - strategy: - fail-fast: false - matrix: - project: [chromium, firefox] - - steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '18' - - - name: Run all tests - run: | - echo "Installing dependencies..." - yarn - echo "Installing Playwright..." - cd playwright - mkdir test-results - npm ci - npx playwright install --with-deps ${{ matrix.project }} - echo "Running tests..." - npx playwright test --project=${{ matrix.project }} - - - name: Upload Report - uses: actions/upload-artifact@v3 - if: ${{ always() }} - continue-on-error: true - with: - name: playwright-results-${{ matrix.project }} - path: playwright/test-results/ - if-no-files-found: ignore - - tests-playwright-legacy: - name: Run Tests (Playwright Legacy) - if: ${{ github.event.inputs.skiptests == 'false' || github.ref_name == 'release' }} - needs: [prepare] - runs-on: ubuntu-latest - container: ghcr.io/ietf-tools/datatracker-app-base:latest - strategy: - fail-fast: false - matrix: - project: [chromium, firefox] - - services: - db: - image: ghcr.io/ietf-tools/datatracker-db:latest - - steps: - - uses: actions/checkout@v3 - - - name: Prepare for tests - run: | - chmod +x ./dev/tests/prepare.sh - sh ./dev/tests/prepare.sh - - - name: Ensure DB is ready - run: | - /usr/local/bin/wait-for db:5432 -- echo "DB ready" - - - name: Start Datatracker - run: | - echo "Running checks..." - ./ietf/manage.py check - echo "Starting datatracker..." - ./ietf/manage.py runserver 0.0.0.0:8000 --settings=settings_local & - echo "Waiting for datatracker to be ready..." - /usr/local/bin/wait-for localhost:8000 -- echo "Datatracker ready" - - - name: Run all tests - env: - # Required to get firefox to run as root: - HOME: "" - run: | - echo "Installing dependencies..." - yarn - echo "Installing Playwright..." - cd playwright - mkdir test-results - npm ci - npx playwright install --with-deps ${{ matrix.project }} - echo "Running tests..." - npx playwright test --project=${{ matrix.project }} -c playwright-legacy.config.js - - - name: Upload Report - uses: actions/upload-artifact@v3 - if: ${{ always() }} - continue-on-error: true - with: - name: playwright-legacy-results-${{ matrix.project }} - path: playwright/test-results/ - if-no-files-found: ignore - # ----------------------------------------------------------------- # RELEASE # ----------------------------------------------------------------- release: name: Make Release if: ${{ !failure() && !cancelled() }} - needs: [tests-python, tests-playwright, tests-playwright-legacy, prepare] - runs-on: ubuntu-latest + needs: [tests, prepare] + runs-on: + group: hperf-8c32r + permissions: + contents: write + packages: write env: SHOULD_DEPLOY: ${{needs.prepare.outputs.should_deploy}} PKG_VERSION: ${{needs.prepare.outputs.pkg_version}} FROM_TAG: ${{needs.prepare.outputs.from_tag}} TO_TAG: ${{needs.prepare.outputs.to_tag}} + TARGET_BASE: ${{needs.prepare.outputs.base_image_version}} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: - fetch-depth: 0 - - - name: Setup Node.js - uses: actions/setup-node@v3 + fetch-depth: 1 + fetch-tags: false + + - name: Setup Node.js environment + uses: actions/setup-node@v6 with: - node-version: '16' - + node-version: 18.x + - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: '3.x' - + python-version: "3.x" + + - name: Setup AWS CLI + uses: unfor19/install-aws-cli-action@v1 + with: + version: 2.22.35 + - name: Download a Coverage Results if: ${{ github.event.inputs.skiptests == 'false' || github.ref_name == 'release' }} - uses: actions/download-artifact@v3.0.2 + uses: actions/download-artifact@v4.3.0 with: name: coverage - name: Make Release Build env: DEBIAN_FRONTEND: noninteractive + BROWSERSLIST_IGNORE_OLD_DATA: 1 run: | echo "PKG_VERSION: $PKG_VERSION" echo "GITHUB_SHA: $GITHUB_SHA" echo "GITHUB_REF_NAME: $GITHUB_REF_NAME" - echo "Running build script..." - chmod +x ./dev/deploy/build.sh - sh ./dev/deploy/build.sh + echo "Running frontend build script..." + echo "Compiling native node packages..." + yarn rebuild + echo "Packaging static assets..." + yarn build --base=https://static.ietf.org/dt/$PKG_VERSION/ + yarn legacy:build echo "Setting version $PKG_VERSION..." sed -i -r -e "s|^__version__ += '.*'$|__version__ = '$PKG_VERSION'|" ietf/__init__.py sed -i -r -e "s|^__release_hash__ += '.*'$|__release_hash__ = '$GITHUB_SHA'|" ietf/__init__.py @@ -320,8 +221,64 @@ jobs: run: | echo "Build release tarball..." mkdir -p /home/runner/work/release - tar -czf /home/runner/work/release/release.tar.gz -X dev/deploy/exclude-patterns.txt . - + tar -czf /home/runner/work/release/release.tar.gz -X dev/build/exclude-patterns.txt . + + - name: Collect + Push Statics + env: + DEBIAN_FRONTEND: noninteractive + AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_STATIC_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_STATIC_KEY_SECRET }} + AWS_DEFAULT_REGION: auto + AWS_ENDPOINT_URL: ${{ secrets.CF_R2_ENDPOINT }} + run: | + echo "Collecting statics..." + echo "Using ghcr.io/ietf-tools/datatracker-app-base:${{ env.TARGET_BASE }}" + docker run --rm --name collectstatics -v $(pwd):/workspace ghcr.io/ietf-tools/datatracker-app-base:${{ env.TARGET_BASE }} sh dev/build/collectstatics.sh + echo "Pushing statics..." + cd static + aws s3 sync . s3://static/dt/$PKG_VERSION --only-show-errors + + - name: Augment dockerignore for docker image build + env: + DEBIAN_FRONTEND: noninteractive + run: | + cat >> .dockerignore <> $GITHUB_ENV + + - name: Build Images + uses: docker/build-push-action@v6 + env: + DOCKER_BUILD_SUMMARY: false + with: + context: . + file: dev/build/Dockerfile + platforms: ${{ github.event.inputs.skiparm == 'true' && 'linux/amd64' || 'linux/amd64,linux/arm64' }} + push: true + tags: | + ghcr.io/ietf-tools/datatracker:${{ env.PKG_VERSION }} + ${{ env.FEATURE_LATEST_TAG && format('ghcr.io/ietf-tools/datatracker:{0}-latest', env.FEATURE_LATEST_TAG) || null }} + - name: Update CHANGELOG id: changelog uses: Requarks/changelog-action@v1 @@ -332,6 +289,12 @@ jobs: toTag: ${{ env.TO_TAG }} writeToFile: false + - name: Download Coverage Results + if: ${{ github.event.inputs.skiptests == 'false' || github.ref_name == 'release' }} + uses: actions/download-artifact@v4.3.0 + with: + name: coverage + - name: Prepare Coverage Action if: ${{ github.event.inputs.skiptests == 'false' || github.ref_name == 'release' }} working-directory: ./dev/coverage-action @@ -347,12 +310,12 @@ jobs: repoCommon: common version: ${{needs.prepare.outputs.pkg_version}} changelog: ${{ steps.changelog.outputs.changes }} - summary: ${{ github.event.inputs.summary }} + summary: '' coverageResultsPath: coverage.json histCoveragePath: historical-coverage.json - name: Create Release - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.18.0 if: ${{ env.SHOULD_DEPLOY == 'true' }} with: allowUpdates: true @@ -365,8 +328,8 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Update Baseline Coverage - uses: ncipollo/release-action@v1.12.0 - if: ${{ github.event.inputs.updateCoverage == 'true' }} + uses: ncipollo/release-action@v1.18.0 + if: ${{ github.event.inputs.updateCoverage == 'true' || github.ref_name == 'release' }} with: allowUpdates: true tag: baseline @@ -378,7 +341,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Upload Build Artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: release-${{ env.PKG_VERSION }} path: /home/runner/work/release/release.tar.gz @@ -389,7 +352,7 @@ jobs: notify: name: Notify if: ${{ always() }} - needs: [prepare, tests-python, tests-playwright, tests-playwright-legacy, release] + needs: [prepare, tests, release] runs-on: ubuntu-latest env: PKG_VERSION: ${{needs.prepare.outputs.pkg_version}} @@ -397,146 +360,139 @@ jobs: steps: - name: Notify on Slack (Success) if: ${{ !contains(join(needs.*.result, ','), 'failure') }} - uses: slackapi/slack-github-action@v1.23.0 + uses: slackapi/slack-github-action@v2 with: - channel-id: ${{ secrets.SLACK_GH_BUILDS_CHANNEL_ID }} + token: ${{ secrets.SLACK_GH_BOT }} + method: chat.postMessage payload: | - { - "text": "Datatracker Build by ${{ github.triggering_actor }} - <@${{ secrets.SLACK_UID_RJSPARKS }}>", - "attachments": [ - { - "color": "28a745", - "fields": [ - { - "title": "Status", - "short": true, - "value": "Completed" - } - ] - } - ] - } - env: - SLACK_BOT_TOKEN: ${{ secrets.SLACK_GH_BOT }} + channel: ${{ secrets.SLACK_GH_BUILDS_CHANNEL_ID }} + text: "Datatracker Build by ${{ github.triggering_actor }}" + attachments: + - color: "28a745" + fields: + - title: "Status" + short: true + value: "Completed" - name: Notify on Slack (Failure) if: ${{ contains(join(needs.*.result, ','), 'failure') }} - uses: slackapi/slack-github-action@v1.23.0 + uses: slackapi/slack-github-action@v2 with: - channel-id: ${{ secrets.SLACK_GH_BUILDS_CHANNEL_ID }} + token: ${{ secrets.SLACK_GH_BOT }} + method: chat.postMessage payload: | - { - "text": "Datatracker Build by ${{ github.triggering_actor }} - <@${{ secrets.SLACK_UID_RJSPARKS }}>", - "attachments": [ - { - "color": "a82929", - "fields": [ - { - "title": "Status", - "short": true, - "value": "Failed" - } - ] - } - ] - } - env: - SLACK_BOT_TOKEN: ${{ secrets.SLACK_GH_BOT }} + channel: ${{ secrets.SLACK_GH_BUILDS_CHANNEL_ID }} + text: "Datatracker Build by ${{ github.triggering_actor }}" + attachments: + - color: "a82929" + fields: + - title: "Status" + short: true + value: "Failed" # ----------------------------------------------------------------- - # SANDBOX + # DEV # ----------------------------------------------------------------- - sandbox: - name: Deploy to Sandbox - if: ${{ !failure() && !cancelled() && github.event.inputs.sandbox == 'true' }} + dev: + name: Deploy to Dev + if: ${{ !failure() && !cancelled() && github.event.inputs.dev == 'true' }} needs: [prepare, release] - runs-on: [self-hosted, dev-server] + runs-on: ubuntu-latest environment: - name: sandbox + name: dev env: PKG_VERSION: ${{needs.prepare.outputs.pkg_version}} steps: - - uses: actions/checkout@v3 - - - name: Download a Release Artifact - uses: actions/download-artifact@v3.0.2 - with: - name: release-${{ env.PKG_VERSION }} - - - name: Deploy to containers - env: - DEBIAN_FRONTEND: noninteractive - run: | - echo "Reset production flags in settings.py..." - sed -i -r -e 's/^DEBUG *= *.*$/DEBUG = True/' -e "s/^SERVER_MODE *= *.*\$/SERVER_MODE = 'development'/" ietf/settings.py - echo "Install Deploy to Container CLI dependencies..." - cd dev/deploy-to-container - npm ci - cd ../.. - echo "Start Deploy..." - node ./dev/deploy-to-container/cli.js --branch ${{ github.ref_name }} --domain dev.ietf.org --appversion ${{ env.PKG_VERSION }} --commit ${{ github.sha }} --ghrunid ${{ github.run_id }} - - - name: Cleanup old docker resources - env: - DEBIAN_FRONTEND: noninteractive - run: | - docker image prune -a -f - - legacySandbox: - name: Deploy to Legacy Sandbox - if: ${{ !failure() && !cancelled() && github.event.inputs.legacySandbox == 'true' }} + - uses: actions/checkout@v4 + with: + ref: main + + - name: Get Deploy Name + env: + DEBIAN_FRONTEND: noninteractive + run: | + echo "Install Get Deploy Name CLI dependencies..." + cd dev/k8s-get-deploy-name + npm ci + echo "Get Deploy Name..." + echo "DEPLOY_NAMESPACE=$(node cli.js --branch ${{ github.ref_name }})" >> "$GITHUB_ENV" + + - name: Deploy to dev + uses: the-actions-org/workflow-dispatch@v4 + with: + workflow: deploy-dev.yml + repo: ietf-tools/infra-k8s + ref: main + token: ${{ secrets.GH_INFRA_K8S_TOKEN }} + inputs: '{ "app":"datatracker", "appVersion":"${{ env.PKG_VERSION }}", "remoteRef":"${{ github.sha }}", "namespace":"${{ env.DEPLOY_NAMESPACE }}", "disableDailyDbRefresh":${{ inputs.devNoDbRefresh }} }' + wait-for-completion: true + wait-for-completion-timeout: 30m + wait-for-completion-interval: 30s + display-workflow-run-url: false + + # ----------------------------------------------------------------- + # STAGING + # ----------------------------------------------------------------- + staging: + name: Deploy to Staging + if: ${{ !failure() && !cancelled() && (github.event.inputs.deploy == 'Staging Only' || github.event.inputs.deploy == 'Staging + Prod' || github.ref_name == 'release') }} needs: [prepare, release] - runs-on: [self-hosted, legacy-sandbox-server] + runs-on: ubuntu-latest environment: - name: legacy-sandbox - url: "https://sandbox.ietf.org" + name: staging env: PKG_VERSION: ${{needs.prepare.outputs.pkg_version}} steps: - - name: Download a Release Artifact - uses: actions/download-artifact@v3.0.2 - with: - name: release-${{ env.PKG_VERSION }} - path: /a/www/ietf-datatracker/main.dev.${{ github.run_number }} + - name: Refresh Staging DB + uses: the-actions-org/workflow-dispatch@v4 + with: + workflow: deploy-db.yml + repo: ietf-tools/infra-k8s + ref: main + token: ${{ secrets.GH_INFRA_K8S_TOKEN }} + inputs: '{ "environment":"${{ secrets.GHA_K8S_CLUSTER }}", "app":"datatracker", "manifest":"postgres", "forceRecreate":true, "restoreToLastFullSnapshot":true, "waitClusterReady":true }' + wait-for-completion: true + wait-for-completion-timeout: 60m + wait-for-completion-interval: 20s + display-workflow-run-url: false - - name: Extract Release - env: - DEBIAN_FRONTEND: noninteractive - working-directory: /a/www/ietf-datatracker/main.dev.${{ github.run_number }} - run: | - echo "Extracting release tarball..." - tar xzf release.tar.gz - echo "Deleting release tarball..." - rm -rf release.tar.gz - - - name: Setup Environment - env: - DEBIAN_FRONTEND: noninteractive - working-directory: /a/www/ietf-datatracker/main.dev.${{ github.run_number }} - run: | - echo "Copying settings from previous deploy..." - cp ../web/ietf/settings_local.py ietf/ - rsync -a ../web/test/ test/ - echo "Installing Python dependencies..." - python3.9 -mvenv env - source env/bin/activate - pip install -r requirements.txt - pip freeze > frozen-requirements.txt - echo "Collecting static..." - ietf/manage.py collectstatic - echo "Running checks..." - ietf/manage.py check - - - name: Update Docker Containers - env: - DEBIAN_FRONTEND: noninteractive - working-directory: /a/docker/datatracker - run: | - echo "Pulling latest docker images..." - docker image tag ghcr.io/ietf-tools/datatracker-celery:latest datatracker-celery-fallback - docker image tag ghcr.io/ietf-tools/datatracker-mq:latest datatracker-mq-fallback - docker-compose pull - # echo "Shutting down containers..." - # docker-compose down -t 300 - + - name: Deploy to staging + uses: the-actions-org/workflow-dispatch@v4 + with: + workflow: deploy.yml + repo: ietf-tools/infra-k8s + ref: main + token: ${{ secrets.GH_INFRA_K8S_TOKEN }} + inputs: '{ "environment":"${{ secrets.GHA_K8S_CLUSTER }}", "app":"datatracker", "appVersion":"${{ env.PKG_VERSION }}", "remoteRef":"${{ github.sha }}" }' + wait-for-completion: true + wait-for-completion-timeout: 10m + wait-for-completion-interval: 30s + display-workflow-run-url: false + + # ----------------------------------------------------------------- + # PROD + # ----------------------------------------------------------------- + prod: + name: Deploy to Production + if: ${{ !failure() && !cancelled() && (github.event.inputs.deploy == 'Staging + Prod' || github.ref_name == 'release') }} + needs: [prepare, staging] + runs-on: ubuntu-latest + environment: + name: production + env: + PKG_VERSION: ${{needs.prepare.outputs.pkg_version}} + + steps: + - name: Deploy to production + uses: the-actions-org/workflow-dispatch@v4 + with: + workflow: deploy.yml + repo: ietf-tools/infra-k8s + ref: main + token: ${{ secrets.GH_INFRA_K8S_TOKEN }} + inputs: '{ "environment":"${{ secrets.GHA_K8S_CLUSTER }}", "app":"datatracker", "appVersion":"${{ env.PKG_VERSION }}", "remoteRef":"${{ github.sha }}" }' + wait-for-completion: true + wait-for-completion-timeout: 10m + wait-for-completion-interval: 30s + display-workflow-run-url: false diff --git a/.github/workflows/ci-run-tests.yml b/.github/workflows/ci-run-tests.yml index caabc7511e6..278bd8af2f3 100644 --- a/.github/workflows/ci-run-tests.yml +++ b/.github/workflows/ci-run-tests.yml @@ -1,9 +1,10 @@ -name: Run All Tests +name: PR - Run All Tests on: pull_request: branches: - 'main' + - 'feat/rfc' paths: - 'client/**' - 'ietf/**' @@ -12,149 +13,34 @@ on: - 'package.json' jobs: - tests-python: - name: Run Tests (Python) + # ----------------------------------------------------------------- + # PREPARE + # ----------------------------------------------------------------- + prepare: + name: Prepare runs-on: ubuntu-latest - container: ghcr.io/ietf-tools/datatracker-app-base:latest - - services: - db: - image: ghcr.io/ietf-tools/datatracker-db:latest - - steps: - - uses: actions/checkout@v3 - - - name: Prepare for tests - run: | - chmod +x ./dev/tests/prepare.sh - sh ./dev/tests/prepare.sh - - - name: Ensure DB is ready - run: | - /usr/local/bin/wait-for db:5432 -- echo "DB ready" - - - name: Run all tests - run: | - echo "Running checks..." - ./ietf/manage.py check - ./ietf/manage.py migrate --fake-initial - echo "Validating migrations..." - if ! ( ietf/manage.py makemigrations --dry-run --check --verbosity 3 ) ; then - echo "Model changes without migrations found." - echo ${MSG} - exit 1 - fi - echo "Running tests..." - ./ietf/manage.py test --settings=settings_postgrestest - coverage xml - - - name: Upload Coverage Results to Codecov - uses: codecov/codecov-action@v3.1.3 - with: - files: coverage.xml - - - name: Convert Coverage Results - if: ${{ always() }} - run: | - mv latest-coverage.json coverage.json - - - name: Upload Coverage Results as Build Artifact - uses: actions/upload-artifact@v3.0.0 - if: ${{ always() }} - with: - name: coverage - path: coverage.json - - tests-playwright: - name: Run Tests (Playwright) - runs-on: macos-latest - strategy: - fail-fast: false - matrix: - project: [chromium, firefox] - - steps: - - uses: actions/checkout@v3 + outputs: + base_image_version: ${{ steps.baseimgversion.outputs.base_image_version }} - - uses: actions/setup-node@v3 + steps: + - uses: actions/checkout@v4 with: - node-version: '18' + fetch-depth: 1 + fetch-tags: false - - name: Run all tests + - name: Get Base Image Target Version + id: baseimgversion run: | - echo "Installing dependencies..." - yarn - echo "Installing Playwright..." - cd playwright - mkdir test-results - npm ci - npx playwright install --with-deps ${{ matrix.project }} - echo "Running tests..." - npx playwright test --project=${{ matrix.project }} - - - name: Upload Report - uses: actions/upload-artifact@v3.0.0 - if: ${{ always() }} - continue-on-error: true - with: - name: playwright-results-${{ matrix.project }} - path: playwright/test-results/ - if-no-files-found: ignore + echo "base_image_version=$(sed -n '1p' dev/build/TARGET_BASE)" >> $GITHUB_OUTPUT - tests-playwright-legacy: - name: Run Tests (Playwright Legacy) - runs-on: ubuntu-latest - container: ghcr.io/ietf-tools/datatracker-app-base:latest - strategy: - fail-fast: false - matrix: - project: [chromium, firefox] - - services: - db: - image: ghcr.io/ietf-tools/datatracker-db:latest - - steps: - - uses: actions/checkout@v3 - - - name: Prepare for tests - run: | - chmod +x ./dev/tests/prepare.sh - sh ./dev/tests/prepare.sh - - - name: Ensure DB is ready - run: | - /usr/local/bin/wait-for db:5432 -- echo "DB ready" - - - name: Start Datatracker - run: | - echo "Running checks..." - ./ietf/manage.py check - echo "Starting datatracker..." - ./ietf/manage.py runserver 0.0.0.0:8000 --settings=settings_local & - echo "Waiting for datatracker to be ready..." - /usr/local/bin/wait-for localhost:8000 -- echo "Datatracker ready" - - - name: Run all tests - env: - # Required to get firefox to run as root: - HOME: "" - run: | - echo "Installing dependencies..." - yarn - echo "Installing Playwright..." - cd playwright - mkdir test-results - npm ci - npx playwright install --with-deps ${{ matrix.project }} - echo "Running tests..." - npx playwright test --project=${{ matrix.project }} -c playwright-legacy.config.js - - - name: Upload Report - uses: actions/upload-artifact@v3 - if: ${{ always() }} - continue-on-error: true - with: - name: playwright-legacy-results-${{ matrix.project }} - path: playwright/test-results/ - if-no-files-found: ignore + # ----------------------------------------------------------------- + # TESTS + # ----------------------------------------------------------------- + tests: + name: Run Tests + uses: ./.github/workflows/tests.yml + needs: [prepare] + with: + ignoreLowerCoverage: false + skipSelenium: true + targetBaseVersion: ${{ needs.prepare.outputs.base_image_version }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4bd7362c4a8..3444c03b5e0 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -26,12 +26,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index b0dedc42e08..6d0683c471c 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -15,6 +15,8 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'Dependency Review' - uses: actions/dependency-review-action@v3 + uses: actions/dependency-review-action@v4 + with: + vulnerability-check: false diff --git a/.github/workflows/dev-assets-sync-nightly.yml b/.github/workflows/dev-assets-sync-nightly.yml index 582ba98f1a8..4cfbf6365b4 100644 --- a/.github/workflows/dev-assets-sync-nightly.yml +++ b/.github/workflows/dev-assets-sync-nightly.yml @@ -29,33 +29,21 @@ jobs: contents: read packages: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Docker Build & Push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 + env: + DOCKER_BUILD_SUMMARY: false with: context: . file: dev/shared-assets-sync/Dockerfile push: true tags: ghcr.io/ietf-tools/datatracker-rsync-assets:latest - - sync: - name: Run assets rsync - if: ${{ always() }} - runs-on: [self-hosted, dev-server] - needs: [build] - steps: - - name: Run rsync - env: - DEBIAN_FRONTEND: noninteractive - run: | - docker pull ghcr.io/ietf-tools/datatracker-rsync-assets:latest - docker run --rm -v dt-assets:/assets ghcr.io/ietf-tools/datatracker-rsync-assets:latest - docker image prune -a -f diff --git a/.github/workflows/sandbox-refresh.yml b/.github/workflows/sandbox-refresh.yml deleted file mode 100644 index 4d27b9c7429..00000000000 --- a/.github/workflows/sandbox-refresh.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Sandbox Refresh - -on: - # Run every night - schedule: - - cron: '0 9 * * *' - - workflow_dispatch: - -jobs: - main: - name: Refresh DBs - runs-on: [self-hosted, dev-server] - permissions: - contents: read - - steps: - - uses: actions/checkout@v3 - - - name: Refresh DBs - env: - DEBIAN_FRONTEND: noninteractive - run: | - echo "Install Deploy to Container CLI dependencies..." - cd dev/deploy-to-container - npm ci - cd ../.. - echo "Start Refresh..." - node ./dev/deploy-to-container/refresh.js - - - name: Cleanup old docker resources - env: - DEBIAN_FRONTEND: noninteractive - run: | - docker image prune -a -f diff --git a/.github/workflows/tests-az.yml b/.github/workflows/tests-az.yml new file mode 100644 index 00000000000..8553563a192 --- /dev/null +++ b/.github/workflows/tests-az.yml @@ -0,0 +1,109 @@ +name: Tests (Azure Test) + +on: + workflow_dispatch: + +jobs: + main: + name: Run Tests on Azure temp VM + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Launch VM on Azure + id: azlaunch + run: | + echo "Authenticating to Azure..." + az login --service-principal -u ${{ secrets.AZ_TESTS_APP_ID }} -p ${{ secrets.AZ_TESTS_PWD }} --tenant ${{ secrets.AZ_TESTS_TENANT_ID }} + echo "Creating VM..." + vminfo=$(az vm create \ + --resource-group ghaDatatrackerTests \ + --name tmpGhaVM2 \ + --image Ubuntu2204 \ + --admin-username azureuser \ + --generate-ssh-keys \ + --priority Spot \ + --size Standard_D4as_v5 \ + --max-price -1 \ + --os-disk-size-gb 30 \ + --eviction-policy Delete \ + --nic-delete-option Delete \ + --output tsv \ + --query "publicIpAddress") + echo "ipaddr=$vminfo" >> "$GITHUB_OUTPUT" + echo "VM Public IP: $vminfo" + cat ~/.ssh/id_rsa > ${{ github.workspace }}/prvkey.key + ssh-keyscan -t rsa $vminfo >> ~/.ssh/known_hosts + + - name: Remote SSH into VM + uses: appleboy/ssh-action@2ead5e36573f08b82fbfce1504f1a4b05a647c6f + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + host: ${{ steps.azlaunch.outputs.ipaddr }} + port: 22 + username: azureuser + command_timeout: 60m + key_path: ${{ github.workspace }}/prvkey.key + envs: GITHUB_TOKEN + script_stop: true + script: | + export DEBIAN_FRONTEND=noninteractive + lsb_release -a + sudo apt-get update + sudo apt-get upgrade -y + + echo "Installing Docker..." + curl -fsSL https://get.docker.com -o get-docker.sh + sudo sh get-docker.sh + + echo "Starting Containers..." + sudo docker network create dtnet + sudo docker run -d --name db --network=dtnet ghcr.io/ietf-tools/datatracker-db:latest & + sudo docker run -d --name app --network=dtnet ghcr.io/ietf-tools/datatracker-app-base:latest sleep infinity & + wait + + echo "Cloning datatracker repo..." + sudo docker exec app git clone --depth=1 https://github.com/ietf-tools/datatracker.git . + echo "Prepare tests..." + sudo docker exec app chmod +x ./dev/tests/prepare.sh + sudo docker exec app sh ./dev/tests/prepare.sh + echo "Running checks..." + sudo docker exec app ietf/manage.py check + sudo docker exec app ietf/manage.py migrate --fake-initial + echo "Running tests..." + sudo docker exec app ietf/manage.py test -v2 --validate-html-harder --settings=settings_test + + - name: Destroy VM + resources + if: always() + shell: pwsh + run: | + echo "Destroying VM..." + az vm delete -g ghaDatatrackerTests -n tmpGhaVM2 --yes --force-deletion true + + $resourceOrderRemovalOrder = [ordered]@{ + "Microsoft.Compute/virtualMachines" = 0 + "Microsoft.Compute/disks" = 1 + "Microsoft.Network/networkInterfaces" = 2 + "Microsoft.Network/publicIpAddresses" = 3 + "Microsoft.Network/networkSecurityGroups" = 4 + "Microsoft.Network/virtualNetworks" = 5 + } + echo "Fetching remaining resources..." + $resources = az resource list --resource-group ghaDatatrackerTests | ConvertFrom-Json + + $orderedResources = $resources + | Sort-Object @{ + Expression = {$resourceOrderRemovalOrder[$_.type]} + Descending = $False + } + + echo "Deleting remaining resources..." + $orderedResources | ForEach-Object { + az resource delete --resource-group ghaDatatrackerTests --ids $_.id --verbose + } + + echo "Logout from Azure..." + az logout diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000000..836314bac09 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,189 @@ +name: Reusable Tests Workflow + +on: + workflow_call: + inputs: + ignoreLowerCoverage: + description: 'Ignore Lower Coverage' + default: false + required: true + type: boolean + skipSelenium: + description: 'Skip Selenium Tests' + default: false + required: false + type: boolean + targetBaseVersion: + description: 'Target Base Image Version' + default: latest + required: false + type: string + +jobs: + tests-python: + name: Python Tests + runs-on: ubuntu-latest + container: ghcr.io/ietf-tools/datatracker-app-base:${{ inputs.targetBaseVersion }} + + services: + db: + image: ghcr.io/ietf-tools/datatracker-db:latest + blobstore: + image: ghcr.io/ietf-tools/datatracker-devblobstore:latest + + steps: + - uses: actions/checkout@v4 + + - name: Prepare for tests + run: | + chmod +x ./dev/tests/prepare.sh + sh ./dev/tests/prepare.sh + + - name: Ensure DB is ready + run: | + /usr/local/bin/wait-for db:5432 -- echo "DB ready" + + - name: Run all tests + shell: bash + run: | + echo "Running checks..." + ./ietf/manage.py check + ./ietf/manage.py migrate --fake-initial + echo "Validating migrations..." + if ! ( ietf/manage.py makemigrations --dry-run --check --verbosity 3 ) ; then + echo "Model changes without migrations found." + exit 1 + fi + if [[ "x${{ inputs.skipSelenium }}" == "xtrue" ]]; then + echo "Disable selenium tests..." + rm /usr/bin/geckodriver + fi + echo "Running tests..." + if [[ "x${{ inputs.ignoreLowerCoverage }}" == "xtrue" ]]; then + echo "Lower coverage failures will be ignored." + HOME=/root ./ietf/manage.py test -v2 --validate-html-harder --settings=settings_test --ignore-lower-coverage + else + HOME=/root ./ietf/manage.py test -v2 --validate-html-harder --settings=settings_test + fi + coverage xml + + - name: Upload geckodriver.log + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: geckodriverlog + path: geckodriver.log + + - name: Upload Coverage Results to Codecov + uses: codecov/codecov-action@v5 + with: + disable_search: true + files: coverage.xml + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Convert Coverage Results + if: ${{ always() }} + run: | + mv latest-coverage.json coverage.json + + - name: Upload Coverage Results as Build Artifact + uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: coverage + path: coverage.json + + tests-playwright: + name: Playwright Tests + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + project: [chromium, firefox] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v6 + with: + node-version: '18' + + - name: Run all tests + run: | + echo "Installing dependencies..." + yarn + echo "Installing Playwright..." + cd playwright + mkdir test-results + npm ci + npx playwright install --with-deps ${{ matrix.project }} + echo "Running tests..." + npx playwright test --project=${{ matrix.project }} + + - name: Upload Report + uses: actions/upload-artifact@v4 + if: ${{ always() }} + continue-on-error: true + with: + name: playwright-results-${{ matrix.project }} + path: playwright/test-results/ + if-no-files-found: ignore + + tests-playwright-legacy: + name: Playwright Legacy Tests + runs-on: ubuntu-latest + container: ghcr.io/ietf-tools/datatracker-app-base:${{ inputs.targetBaseVersion }} + strategy: + fail-fast: false + matrix: + project: [chromium, firefox] + + services: + db: + image: ghcr.io/ietf-tools/datatracker-db:latest + + steps: + - uses: actions/checkout@v4 + + - name: Prepare for tests + run: | + chmod +x ./dev/tests/prepare.sh + sh ./dev/tests/prepare.sh + + - name: Ensure DB is ready + run: | + /usr/local/bin/wait-for db:5432 -- echo "DB ready" + + - name: Start Datatracker + run: | + echo "Running checks..." + ./ietf/manage.py check + ./ietf/manage.py migrate --fake-initial + echo "Starting datatracker..." + ./ietf/manage.py runserver 0.0.0.0:8000 --settings=settings_local & + echo "Waiting for datatracker to be ready..." + /usr/local/bin/wait-for localhost:8000 -- echo "Datatracker ready" + + - name: Run all tests + env: + # Required to get firefox to run as root: + HOME: "" + run: | + echo "Installing dependencies..." + yarn + echo "Installing Playwright..." + cd playwright + mkdir test-results + npm ci + npx playwright install --with-deps ${{ matrix.project }} + echo "Running tests..." + npx playwright test --project=${{ matrix.project }} -c playwright-legacy.config.js + + - name: Upload Report + uses: actions/upload-artifact@v4 + if: ${{ always() }} + continue-on-error: true + with: + name: playwright-legacy-results-${{ matrix.project }} + path: playwright/test-results/ + if-no-files-found: ignore diff --git a/.gitignore b/.gitignore index 80e5f0228bd..84bc800e3b8 100644 --- a/.gitignore +++ b/.gitignore @@ -17,14 +17,17 @@ datatracker.sublime-workspace /docker/docker-compose.extend-custom.yml /env /ghostdriver.log +/geckodriver.log /htmlcov /ietf/static/dist-neue /latest-coverage.json /media /node_modules /release-coverage.json +/static /tmp-* /.testresult +*.swp *.pyc __pycache__ .yarn/* diff --git a/.pnp.cjs b/.pnp.cjs index a7d08035818..5fcce34d2f2 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -33,75 +33,84 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { [null, {\ "packageLocation": "./",\ "packageDependencies": [\ - ["@faker-js/faker", "npm:7.6.0"],\ - ["@fullcalendar/bootstrap5", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ - ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/interaction", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/list", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/luxon2", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/timegrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/vue3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@parcel/optimizer-data-url", "npm:2.8.3"],\ - ["@parcel/transformer-inline-string", "npm:2.8.3"],\ - ["@parcel/transformer-sass", "npm:2.8.3"],\ - ["@popperjs/core", "npm:2.11.7"],\ - ["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.2"],\ + ["@fullcalendar/bootstrap5", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ + ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/interaction", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/list", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/luxon3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/timegrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/vue3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@parcel/optimizer-data-url", "npm:2.12.0"],\ + ["@parcel/transformer-inline-string", "npm:2.12.0"],\ + ["@parcel/transformer-sass", "npm:2.12.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ + ["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.1.0"],\ ["@twuni/emojify", "npm:1.0.2"],\ - ["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.1"],\ - ["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.2.3"],\ - ["bootstrap-icons", "npm:1.10.5"],\ - ["browser-fs-access", "npm:0.33.1"],\ + ["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.6.2"],\ + ["@vue/language-plugin-pug", "npm:2.0.7"],\ + ["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.3"],\ + ["bootstrap-icons", "npm:1.11.3"],\ + ["browser-fs-access", "npm:0.35.0"],\ ["browserlist", "npm:1.0.1"],\ - ["c8", "npm:7.13.0"],\ - ["caniuse-lite", "npm:1.0.30001481"],\ - ["d3", "npm:7.8.4"],\ - ["eslint", "npm:8.39.0"],\ - ["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.0.0"],\ - ["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.13.3"],\ - ["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.27.5"],\ - ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:15.7.0"],\ + ["c8", "npm:9.1.0"],\ + ["caniuse-lite", "npm:1.0.30001603"],\ + ["d3", "npm:7.9.0"],\ + ["eslint", "npm:8.57.0"],\ + ["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\ + ["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.15.1"],\ + ["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.29.1"],\ + ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2"],\ ["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\ ["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\ - ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.11.0"],\ + ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.24.0"],\ ["file-saver", "npm:2.0.5"],\ - ["highcharts", "npm:11.0.1"],\ - ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:7.16.0"],\ + ["highcharts", "npm:11.4.0"],\ + ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.18.1"],\ ["ical.js", "npm:1.5.0"],\ - ["jquery", "npm:3.6.4"],\ + ["jquery", "npm:3.7.1"],\ ["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\ ["js-cookie", "npm:3.0.5"],\ ["list.js", "npm:2.3.1"],\ ["lodash", "npm:4.17.21"],\ ["lodash-es", "npm:4.17.21"],\ - ["luxon", "npm:3.3.0"],\ - ["moment", "npm:2.29.4"],\ - ["moment-timezone", "npm:0.5.43"],\ + ["luxon", "npm:3.4.4"],\ + ["moment", "npm:2.30.1"],\ + ["moment-timezone", "npm:0.5.45"],\ ["ms", "npm:2.1.3"],\ ["murmurhash-js", "npm:1.0.0"],\ - ["naive-ui", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.34.3"],\ - ["parcel", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.8.3"],\ - ["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.0.35"],\ + ["naive-ui", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.38.1"],\ + ["parcel", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.12.0"],\ + ["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.1.7"],\ ["pinia-plugin-persist", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:1.0.0"],\ ["pug", "npm:3.0.2"],\ - ["sass", "npm:1.62.1"],\ + ["sass", "npm:1.72.0"],\ ["seedrandom", "npm:3.0.5"],\ ["select2", "npm:4.1.0-rc.0"],\ ["select2-bootstrap-5-theme", "npm:1.3.0"],\ ["send", "npm:0.18.0"],\ - ["shepherd.js", "npm:11.1.1"],\ + ["shepherd.js", "npm:11.2.0"],\ ["slugify", "npm:1.6.6"],\ - ["sortablejs", "npm:1.15.0"],\ - ["vanillajs-datepicker", "npm:1.3.1"],\ - ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.4"],\ - ["vue", "npm:3.2.47"],\ - ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.1.6"],\ + ["sortablejs", "npm:1.15.2"],\ + ["vanillajs-datepicker", "npm:1.3.4"],\ + ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3"],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\ + ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.0"],\ ["zxcvbn", "npm:4.4.2"]\ ],\ "linkType": "SOFT"\ }]\ ]],\ + ["@aashutoshrathi/word-wrap", [\ + ["npm:1.2.6", {\ + "packageLocation": "./.yarn/cache/@aashutoshrathi-word-wrap-npm-1.2.6-5b1d95e487-ada901b9e7.zip/node_modules/@aashutoshrathi/word-wrap/",\ + "packageDependencies": [\ + ["@aashutoshrathi/word-wrap", "npm:1.2.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@babel/code-frame", [\ ["npm:7.16.7", {\ "packageLocation": "./.yarn/cache/@babel-code-frame-npm-7.16.7-093eb9e124-db2f7faa31.zip/node_modules/@babel/code-frame/",\ @@ -141,6 +150,24 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@babel/types", "npm:7.18.4"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:7.23.9", {\ + "packageLocation": "./.yarn/cache/@babel-parser-npm-7.23.9-720a0b56cb-e7cd4960ac.zip/node_modules/@babel/parser/",\ + "packageDependencies": [\ + ["@babel/parser", "npm:7.23.9"],\ + ["@babel/types", "npm:7.18.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/runtime", [\ + ["npm:7.23.2", {\ + "packageLocation": "./.yarn/cache/@babel-runtime-npm-7.23.2-d013d6cf7e-6c4df4839e.zip/node_modules/@babel/runtime/",\ + "packageDependencies": [\ + ["@babel/runtime", "npm:7.23.2"],\ + ["regenerator-runtime", "npm:0.14.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@babel/types", [\ @@ -164,19 +191,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@css-render/plugin-bem", [\ - ["npm:0.15.10", {\ - "packageLocation": "./.yarn/cache/@css-render-plugin-bem-npm-0.15.10-41ccecaa2f-cbab72a7b5.zip/node_modules/@css-render/plugin-bem/",\ + ["npm:0.15.12", {\ + "packageLocation": "./.yarn/cache/@css-render-plugin-bem-npm-0.15.12-bf8b43dc1f-9fa7ddd62b.zip/node_modules/@css-render/plugin-bem/",\ "packageDependencies": [\ - ["@css-render/plugin-bem", "npm:0.15.10"]\ + ["@css-render/plugin-bem", "npm:0.15.12"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.15.10", {\ - "packageLocation": "./.yarn/__virtual__/@css-render-plugin-bem-virtual-1bbf78173b/0/cache/@css-render-plugin-bem-npm-0.15.10-41ccecaa2f-cbab72a7b5.zip/node_modules/@css-render/plugin-bem/",\ + ["virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.15.12", {\ + "packageLocation": "./.yarn/__virtual__/@css-render-plugin-bem-virtual-105b1b654b/0/cache/@css-render-plugin-bem-npm-0.15.12-bf8b43dc1f-9fa7ddd62b.zip/node_modules/@css-render/plugin-bem/",\ "packageDependencies": [\ - ["@css-render/plugin-bem", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.15.10"],\ + ["@css-render/plugin-bem", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.15.12"],\ ["@types/css-render", null],\ - ["css-render", "npm:0.15.10"]\ + ["css-render", "npm:0.15.12"]\ ],\ "packagePeers": [\ "@types/css-render",\ @@ -193,12 +220,32 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.15.10", {\ - "packageLocation": "./.yarn/__virtual__/@css-render-vue3-ssr-virtual-75d553c878/0/cache/@css-render-vue3-ssr-npm-0.15.10-b8526cc313-7977e0c440.zip/node_modules/@css-render/vue3-ssr/",\ + ["npm:0.15.12", {\ + "packageLocation": "./.yarn/cache/@css-render-vue3-ssr-npm-0.15.12-a130f4db3a-a5505ae161.zip/node_modules/@css-render/vue3-ssr/",\ "packageDependencies": [\ - ["@css-render/vue3-ssr", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.15.10"],\ + ["@css-render/vue3-ssr", "npm:0.15.12"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:2366be83ef58a728ebb5a5e9ed4600f4465f98b2a844262fcfbe89415361d5d5f9e964ec3b9a72d6a5004f37c1024d017c65e67473dd9cc39cd61f51768c65e6#npm:0.15.10", {\ + "packageLocation": "./.yarn/__virtual__/@css-render-vue3-ssr-virtual-8cb63dbe2e/0/cache/@css-render-vue3-ssr-npm-0.15.10-b8526cc313-7977e0c440.zip/node_modules/@css-render/vue3-ssr/",\ + "packageDependencies": [\ + ["@css-render/vue3-ssr", "virtual:2366be83ef58a728ebb5a5e9ed4600f4465f98b2a844262fcfbe89415361d5d5f9e964ec3b9a72d6a5004f37c1024d017c65e67473dd9cc39cd61f51768c65e6#npm:0.15.10"],\ ["@types/vue", null],\ - ["vue", "npm:3.2.47"]\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ + ],\ + "packagePeers": [\ + "@types/vue",\ + "vue"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.15.12", {\ + "packageLocation": "./.yarn/__virtual__/@css-render-vue3-ssr-virtual-18db73fb22/0/cache/@css-render-vue3-ssr-npm-0.15.12-a130f4db3a-a5505ae161.zip/node_modules/@css-render/vue3-ssr/",\ + "packageDependencies": [\ + ["@css-render/vue3-ssr", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.15.12"],\ + ["@types/vue", null],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -217,199 +264,199 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@esbuild/android-arm", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-android-arm-npm-0.17.13-235368b68b/node_modules/@esbuild/android-arm/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-android-arm-npm-0.18.20-a30c33e9ed/node_modules/@esbuild/android-arm/",\ "packageDependencies": [\ - ["@esbuild/android-arm", "npm:0.17.13"]\ + ["@esbuild/android-arm", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/android-arm64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-android-arm64-npm-0.17.13-7d21726b95/node_modules/@esbuild/android-arm64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-android-arm64-npm-0.18.20-fd4fb45ae7/node_modules/@esbuild/android-arm64/",\ "packageDependencies": [\ - ["@esbuild/android-arm64", "npm:0.17.13"]\ + ["@esbuild/android-arm64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/android-x64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-android-x64-npm-0.17.13-dd7977b0ba/node_modules/@esbuild/android-x64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-android-x64-npm-0.18.20-22b610e3f4/node_modules/@esbuild/android-x64/",\ "packageDependencies": [\ - ["@esbuild/android-x64", "npm:0.17.13"]\ + ["@esbuild/android-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/darwin-arm64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-darwin-arm64-npm-0.17.13-3c31ee9bef/node_modules/@esbuild/darwin-arm64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-darwin-arm64-npm-0.18.20-00b3504077/node_modules/@esbuild/darwin-arm64/",\ "packageDependencies": [\ - ["@esbuild/darwin-arm64", "npm:0.17.13"]\ + ["@esbuild/darwin-arm64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/darwin-x64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-darwin-x64-npm-0.17.13-2af4bfbe4a/node_modules/@esbuild/darwin-x64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-darwin-x64-npm-0.18.20-767fe27d1b/node_modules/@esbuild/darwin-x64/",\ "packageDependencies": [\ - ["@esbuild/darwin-x64", "npm:0.17.13"]\ + ["@esbuild/darwin-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/freebsd-arm64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-freebsd-arm64-npm-0.17.13-aee39a763e/node_modules/@esbuild/freebsd-arm64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-freebsd-arm64-npm-0.18.20-797e8c8987/node_modules/@esbuild/freebsd-arm64/",\ "packageDependencies": [\ - ["@esbuild/freebsd-arm64", "npm:0.17.13"]\ + ["@esbuild/freebsd-arm64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/freebsd-x64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-freebsd-x64-npm-0.17.13-279fb33dbc/node_modules/@esbuild/freebsd-x64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-freebsd-x64-npm-0.18.20-f7563ff3dd/node_modules/@esbuild/freebsd-x64/",\ "packageDependencies": [\ - ["@esbuild/freebsd-x64", "npm:0.17.13"]\ + ["@esbuild/freebsd-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-arm", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-arm-npm-0.17.13-520e292c25/node_modules/@esbuild/linux-arm/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-arm-npm-0.18.20-06b400b09e/node_modules/@esbuild/linux-arm/",\ "packageDependencies": [\ - ["@esbuild/linux-arm", "npm:0.17.13"]\ + ["@esbuild/linux-arm", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-arm64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-arm64-npm-0.17.13-533eb0e4eb/node_modules/@esbuild/linux-arm64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-arm64-npm-0.18.20-7b48b328fe/node_modules/@esbuild/linux-arm64/",\ "packageDependencies": [\ - ["@esbuild/linux-arm64", "npm:0.17.13"]\ + ["@esbuild/linux-arm64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-ia32", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-ia32-npm-0.17.13-46f5ce8b93/node_modules/@esbuild/linux-ia32/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-ia32-npm-0.18.20-2f5a035f9e/node_modules/@esbuild/linux-ia32/",\ "packageDependencies": [\ - ["@esbuild/linux-ia32", "npm:0.17.13"]\ + ["@esbuild/linux-ia32", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-loong64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-loong64-npm-0.17.13-ef4c0fa326/node_modules/@esbuild/linux-loong64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-loong64-npm-0.18.20-e91b93ee90/node_modules/@esbuild/linux-loong64/",\ "packageDependencies": [\ - ["@esbuild/linux-loong64", "npm:0.17.13"]\ + ["@esbuild/linux-loong64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-mips64el", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-mips64el-npm-0.17.13-5b1f2c5c01/node_modules/@esbuild/linux-mips64el/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-mips64el-npm-0.18.20-a5e9429f2a/node_modules/@esbuild/linux-mips64el/",\ "packageDependencies": [\ - ["@esbuild/linux-mips64el", "npm:0.17.13"]\ + ["@esbuild/linux-mips64el", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-ppc64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-ppc64-npm-0.17.13-e41e2e492f/node_modules/@esbuild/linux-ppc64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-ppc64-npm-0.18.20-218f398134/node_modules/@esbuild/linux-ppc64/",\ "packageDependencies": [\ - ["@esbuild/linux-ppc64", "npm:0.17.13"]\ + ["@esbuild/linux-ppc64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-riscv64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-riscv64-npm-0.17.13-b222bf3e73/node_modules/@esbuild/linux-riscv64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-riscv64-npm-0.18.20-6a2972f753/node_modules/@esbuild/linux-riscv64/",\ "packageDependencies": [\ - ["@esbuild/linux-riscv64", "npm:0.17.13"]\ + ["@esbuild/linux-riscv64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-s390x", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-s390x-npm-0.17.13-5a91ba0bd2/node_modules/@esbuild/linux-s390x/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-s390x-npm-0.18.20-ff9d596142/node_modules/@esbuild/linux-s390x/",\ "packageDependencies": [\ - ["@esbuild/linux-s390x", "npm:0.17.13"]\ + ["@esbuild/linux-s390x", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/linux-x64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-linux-x64-npm-0.17.13-01575597b4/node_modules/@esbuild/linux-x64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-linux-x64-npm-0.18.20-de8e99b449/node_modules/@esbuild/linux-x64/",\ "packageDependencies": [\ - ["@esbuild/linux-x64", "npm:0.17.13"]\ + ["@esbuild/linux-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/netbsd-x64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-netbsd-x64-npm-0.17.13-8e49ac13ef/node_modules/@esbuild/netbsd-x64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-netbsd-x64-npm-0.18.20-39b460150f/node_modules/@esbuild/netbsd-x64/",\ "packageDependencies": [\ - ["@esbuild/netbsd-x64", "npm:0.17.13"]\ + ["@esbuild/netbsd-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/openbsd-x64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-openbsd-x64-npm-0.17.13-f1857ad246/node_modules/@esbuild/openbsd-x64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-openbsd-x64-npm-0.18.20-90ab921595/node_modules/@esbuild/openbsd-x64/",\ "packageDependencies": [\ - ["@esbuild/openbsd-x64", "npm:0.17.13"]\ + ["@esbuild/openbsd-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/sunos-x64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-sunos-x64-npm-0.17.13-d366ada0a9/node_modules/@esbuild/sunos-x64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-sunos-x64-npm-0.18.20-d18b46b343/node_modules/@esbuild/sunos-x64/",\ "packageDependencies": [\ - ["@esbuild/sunos-x64", "npm:0.17.13"]\ + ["@esbuild/sunos-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/win32-arm64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-win32-arm64-npm-0.17.13-cd496c2d1d/node_modules/@esbuild/win32-arm64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-win32-arm64-npm-0.18.20-a58fe6c6a3/node_modules/@esbuild/win32-arm64/",\ "packageDependencies": [\ - ["@esbuild/win32-arm64", "npm:0.17.13"]\ + ["@esbuild/win32-arm64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/win32-ia32", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-win32-ia32-npm-0.17.13-8a813564f3/node_modules/@esbuild/win32-ia32/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-win32-ia32-npm-0.18.20-d7ee926338/node_modules/@esbuild/win32-ia32/",\ "packageDependencies": [\ - ["@esbuild/win32-ia32", "npm:0.17.13"]\ + ["@esbuild/win32-ia32", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@esbuild/win32-x64", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/@esbuild-win32-x64-npm-0.17.13-29882f65f7/node_modules/@esbuild/win32-x64/",\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/@esbuild-win32-x64-npm-0.18.20-37a9ab2bda/node_modules/@esbuild/win32-x64/",\ "packageDependencies": [\ - ["@esbuild/win32-x64", "npm:0.17.13"]\ + ["@esbuild/win32-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ @@ -422,12 +469,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:d92bace04d6d26247b24721a8766993aa3a98c631265bb389d6aa7c17b2a0708ccc877f009bd6a9cb50b8597fbe776c68dae7621d198ff292ee4bc23bd4b012f#npm:4.4.0", {\ - "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-75945d7e20/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip/node_modules/@eslint-community/eslint-utils/",\ + ["virtual:4286e12a3a0f74af013bc8f16c6d8fdde823cfbf6389660266b171e551f576c805b0a7a8eb2a7087a5cee7dfe6ebb6e1ea3808d93daf915edc95656907a381bb#npm:4.4.0", {\ + "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-1c7da85a1a/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip/node_modules/@eslint-community/eslint-utils/",\ "packageDependencies": [\ - ["@eslint-community/eslint-utils", "virtual:d92bace04d6d26247b24721a8766993aa3a98c631265bb389d6aa7c17b2a0708ccc877f009bd6a9cb50b8597fbe776c68dae7621d198ff292ee4bc23bd4b012f#npm:4.4.0"],\ + ["@eslint-community/eslint-utils", "virtual:4286e12a3a0f74af013bc8f16c6d8fdde823cfbf6389660266b171e551f576c805b0a7a8eb2a7087a5cee7dfe6ebb6e1ea3808d93daf915edc95656907a381bb#npm:4.4.0"],\ ["@types/eslint", null],\ - ["eslint", "npm:8.39.0"],\ + ["eslint", "npm:8.57.0"],\ ["eslint-visitor-keys", "npm:3.3.0"]\ ],\ "packagePeers": [\ @@ -438,22 +485,29 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@eslint-community/regexpp", [\ - ["npm:4.4.1", {\ - "packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.4.1-44c7391499-db97d8d08e.zip/node_modules/@eslint-community/regexpp/",\ + ["npm:4.10.0", {\ + "packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-2a6e345429.zip/node_modules/@eslint-community/regexpp/",\ "packageDependencies": [\ - ["@eslint-community/regexpp", "npm:4.4.1"]\ + ["@eslint-community/regexpp", "npm:4.10.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.8.0", {\ + "packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.8.0-92ece47e3d-601e6d033d.zip/node_modules/@eslint-community/regexpp/",\ + "packageDependencies": [\ + ["@eslint-community/regexpp", "npm:4.8.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@eslint/eslintrc", [\ - ["npm:2.0.2", {\ - "packageLocation": "./.yarn/cache/@eslint-eslintrc-npm-2.0.2-d308674d86-cfcf5e12c7.zip/node_modules/@eslint/eslintrc/",\ + ["npm:2.1.4", {\ + "packageLocation": "./.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-10957c7592.zip/node_modules/@eslint/eslintrc/",\ "packageDependencies": [\ - ["@eslint/eslintrc", "npm:2.0.2"],\ + ["@eslint/eslintrc", "npm:2.1.4"],\ ["ajv", "npm:6.12.6"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ - ["espree", "npm:9.5.1"],\ + ["espree", "npm:9.6.1"],\ ["globals", "npm:13.19.0"],\ ["ignore", "npm:5.2.0"],\ ["import-fresh", "npm:3.3.0"],\ @@ -465,55 +519,57 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@eslint/js", [\ - ["npm:8.39.0", {\ - "packageLocation": "./.yarn/cache/@eslint-js-npm-8.39.0-558d35aa2d-63fe36e2bf.zip/node_modules/@eslint/js/",\ + ["npm:8.57.0", {\ + "packageLocation": "./.yarn/cache/@eslint-js-npm-8.57.0-00ead3710a-315dc65b0e.zip/node_modules/@eslint/js/",\ "packageDependencies": [\ - ["@eslint/js", "npm:8.39.0"]\ + ["@eslint/js", "npm:8.57.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ - ["@faker-js/faker", [\ - ["npm:7.6.0", {\ - "packageLocation": "./.yarn/cache/@faker-js-faker-npm-7.6.0-fa135883e9-942af62217.zip/node_modules/@faker-js/faker/",\ + ["@floating-ui/core", [\ + ["npm:1.4.1", {\ + "packageLocation": "./.yarn/cache/@floating-ui-core-npm-1.4.1-fe89c45d92-be4ab864fe.zip/node_modules/@floating-ui/core/",\ "packageDependencies": [\ - ["@faker-js/faker", "npm:7.6.0"]\ + ["@floating-ui/core", "npm:1.4.1"],\ + ["@floating-ui/utils", "npm:0.1.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ - ["@floating-ui/core", [\ - ["npm:1.2.6", {\ - "packageLocation": "./.yarn/cache/@floating-ui-core-npm-1.2.6-083bec342c-e4aa96c435.zip/node_modules/@floating-ui/core/",\ + ["@floating-ui/dom", [\ + ["npm:1.5.2", {\ + "packageLocation": "./.yarn/cache/@floating-ui-dom-npm-1.5.2-f1b8ca0c30-3c71eed50b.zip/node_modules/@floating-ui/dom/",\ "packageDependencies": [\ - ["@floating-ui/core", "npm:1.2.6"]\ + ["@floating-ui/dom", "npm:1.5.2"],\ + ["@floating-ui/core", "npm:1.4.1"],\ + ["@floating-ui/utils", "npm:0.1.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ - ["@floating-ui/dom", [\ - ["npm:1.2.6", {\ - "packageLocation": "./.yarn/cache/@floating-ui-dom-npm-1.2.6-9d4be07ec3-2226c6c244.zip/node_modules/@floating-ui/dom/",\ + ["@floating-ui/utils", [\ + ["npm:0.1.2", {\ + "packageLocation": "./.yarn/cache/@floating-ui-utils-npm-0.1.2-22eefe56f0-3e29fd3c69.zip/node_modules/@floating-ui/utils/",\ "packageDependencies": [\ - ["@floating-ui/dom", "npm:1.2.6"],\ - ["@floating-ui/core", "npm:1.2.6"]\ + ["@floating-ui/utils", "npm:0.1.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@fullcalendar/bootstrap5", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-bootstrap5-npm-6.1.6-3eb2f2a80e-09f2bdf7dc.zip/node_modules/@fullcalendar/bootstrap5/",\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-bootstrap5-npm-6.1.11-6e0fbf281a-a0c3b94346.zip/node_modules/@fullcalendar/bootstrap5/",\ "packageDependencies": [\ - ["@fullcalendar/bootstrap5", "npm:6.1.6"]\ + ["@fullcalendar/bootstrap5", "npm:6.1.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6", {\ - "packageLocation": "./.yarn/__virtual__/@fullcalendar-bootstrap5-virtual-4eb1694ecd/0/cache/@fullcalendar-bootstrap5-npm-6.1.6-3eb2f2a80e-09f2bdf7dc.zip/node_modules/@fullcalendar/bootstrap5/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-bootstrap5-virtual-50942c1c6f/0/cache/@fullcalendar-bootstrap5-npm-6.1.11-6e0fbf281a-a0c3b94346.zip/node_modules/@fullcalendar/bootstrap5/",\ "packageDependencies": [\ - ["@fullcalendar/bootstrap5", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ + ["@fullcalendar/bootstrap5", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ ["@types/fullcalendar__core", null]\ ],\ "packagePeers": [\ @@ -524,28 +580,28 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@fullcalendar/core", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-core-npm-6.1.6-a28815a826-72ec698bd2.zip/node_modules/@fullcalendar/core/",\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-core-npm-6.1.11-ae049c8ace-0078a6f96b.zip/node_modules/@fullcalendar/core/",\ "packageDependencies": [\ - ["@fullcalendar/core", "npm:6.1.6"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ ["preact", "npm:10.12.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@fullcalendar/daygrid", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-daygrid-npm-6.1.6-13b72a08b0-e7b60e359b.zip/node_modules/@fullcalendar/daygrid/",\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-daygrid-npm-6.1.11-2187ca1b8f-6eb5606de5.zip/node_modules/@fullcalendar/daygrid/",\ "packageDependencies": [\ - ["@fullcalendar/daygrid", "npm:6.1.6"]\ + ["@fullcalendar/daygrid", "npm:6.1.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6", {\ - "packageLocation": "./.yarn/__virtual__/@fullcalendar-daygrid-virtual-c806a244df/0/cache/@fullcalendar-daygrid-npm-6.1.6-13b72a08b0-e7b60e359b.zip/node_modules/@fullcalendar/daygrid/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-daygrid-virtual-b91d1ffe14/0/cache/@fullcalendar-daygrid-npm-6.1.11-2187ca1b8f-6eb5606de5.zip/node_modules/@fullcalendar/daygrid/",\ "packageDependencies": [\ - ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ + ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ ["@types/fullcalendar__core", null]\ ],\ "packagePeers": [\ @@ -556,18 +612,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@fullcalendar/icalendar", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-icalendar-npm-6.1.6-8b28c6e7df-50d290346a.zip/node_modules/@fullcalendar/icalendar/",\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-icalendar-npm-6.1.11-73807e790d-4e6eff15a8.zip/node_modules/@fullcalendar/icalendar/",\ "packageDependencies": [\ - ["@fullcalendar/icalendar", "npm:6.1.6"]\ + ["@fullcalendar/icalendar", "npm:6.1.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6", {\ - "packageLocation": "./.yarn/__virtual__/@fullcalendar-icalendar-virtual-82e9ef0594/0/cache/@fullcalendar-icalendar-npm-6.1.6-8b28c6e7df-50d290346a.zip/node_modules/@fullcalendar/icalendar/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-icalendar-virtual-636a290006/0/cache/@fullcalendar-icalendar-npm-6.1.11-73807e790d-4e6eff15a8.zip/node_modules/@fullcalendar/icalendar/",\ "packageDependencies": [\ - ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ + ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ ["@types/fullcalendar__core", null],\ ["@types/ical.js", null],\ ["ical.js", "npm:1.5.0"]\ @@ -582,18 +638,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@fullcalendar/interaction", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-interaction-npm-6.1.6-68ac4c3627-b7dea49059.zip/node_modules/@fullcalendar/interaction/",\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-interaction-npm-6.1.11-39630596c7-c67d4cfa0b.zip/node_modules/@fullcalendar/interaction/",\ "packageDependencies": [\ - ["@fullcalendar/interaction", "npm:6.1.6"]\ + ["@fullcalendar/interaction", "npm:6.1.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6", {\ - "packageLocation": "./.yarn/__virtual__/@fullcalendar-interaction-virtual-24a0309729/0/cache/@fullcalendar-interaction-npm-6.1.6-68ac4c3627-b7dea49059.zip/node_modules/@fullcalendar/interaction/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-interaction-virtual-3ebf8b0646/0/cache/@fullcalendar-interaction-npm-6.1.11-39630596c7-c67d4cfa0b.zip/node_modules/@fullcalendar/interaction/",\ "packageDependencies": [\ - ["@fullcalendar/interaction", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ + ["@fullcalendar/interaction", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ ["@types/fullcalendar__core", null]\ ],\ "packagePeers": [\ @@ -604,18 +660,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@fullcalendar/list", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-list-npm-6.1.6-ada94f2f8a-e5beb01c62.zip/node_modules/@fullcalendar/list/",\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-list-npm-6.1.11-8f1846f302-84a8cd6e63.zip/node_modules/@fullcalendar/list/",\ "packageDependencies": [\ - ["@fullcalendar/list", "npm:6.1.6"]\ + ["@fullcalendar/list", "npm:6.1.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6", {\ - "packageLocation": "./.yarn/__virtual__/@fullcalendar-list-virtual-42a14f5528/0/cache/@fullcalendar-list-npm-6.1.6-ada94f2f8a-e5beb01c62.zip/node_modules/@fullcalendar/list/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-list-virtual-1c555df506/0/cache/@fullcalendar-list-npm-6.1.11-8f1846f302-84a8cd6e63.zip/node_modules/@fullcalendar/list/",\ "packageDependencies": [\ - ["@fullcalendar/list", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ + ["@fullcalendar/list", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ ["@types/fullcalendar__core", null]\ ],\ "packagePeers": [\ @@ -625,22 +681,22 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@fullcalendar/luxon2", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-luxon2-npm-6.1.6-514b9ce297-48d76dc556.zip/node_modules/@fullcalendar/luxon2/",\ + ["@fullcalendar/luxon3", [\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-luxon3-npm-6.1.11-3e90656a71-8e7f45aab2.zip/node_modules/@fullcalendar/luxon3/",\ "packageDependencies": [\ - ["@fullcalendar/luxon2", "npm:6.1.6"]\ + ["@fullcalendar/luxon3", "npm:6.1.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6", {\ - "packageLocation": "./.yarn/__virtual__/@fullcalendar-luxon2-virtual-4dc3f00cca/0/cache/@fullcalendar-luxon2-npm-6.1.6-514b9ce297-48d76dc556.zip/node_modules/@fullcalendar/luxon2/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-luxon3-virtual-38643019c2/0/cache/@fullcalendar-luxon3-npm-6.1.11-3e90656a71-8e7f45aab2.zip/node_modules/@fullcalendar/luxon3/",\ "packageDependencies": [\ - ["@fullcalendar/luxon2", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ + ["@fullcalendar/luxon3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ ["@types/fullcalendar__core", null],\ ["@types/luxon", null],\ - ["luxon", "npm:3.3.0"]\ + ["luxon", "npm:3.4.4"]\ ],\ "packagePeers": [\ "@fullcalendar/core",\ @@ -652,19 +708,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@fullcalendar/timegrid", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-timegrid-npm-6.1.6-6c6109a419-ef79183dad.zip/node_modules/@fullcalendar/timegrid/",\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-timegrid-npm-6.1.11-1d43455bfd-4a11e6dd90.zip/node_modules/@fullcalendar/timegrid/",\ "packageDependencies": [\ - ["@fullcalendar/timegrid", "npm:6.1.6"]\ + ["@fullcalendar/timegrid", "npm:6.1.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6", {\ - "packageLocation": "./.yarn/__virtual__/@fullcalendar-timegrid-virtual-1495e7dbe4/0/cache/@fullcalendar-timegrid-npm-6.1.6-6c6109a419-ef79183dad.zip/node_modules/@fullcalendar/timegrid/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-timegrid-virtual-5e951d78a6/0/cache/@fullcalendar-timegrid-npm-6.1.11-1d43455bfd-4a11e6dd90.zip/node_modules/@fullcalendar/timegrid/",\ "packageDependencies": [\ - ["@fullcalendar/timegrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ - ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ + ["@fullcalendar/timegrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ + ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ ["@types/fullcalendar__core", null]\ ],\ "packagePeers": [\ @@ -675,21 +731,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@fullcalendar/vue3", [\ - ["npm:6.1.6", {\ - "packageLocation": "./.yarn/cache/@fullcalendar-vue3-npm-6.1.6-b1a9d6f44b-68fe3ce204.zip/node_modules/@fullcalendar/vue3/",\ + ["npm:6.1.11", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-vue3-npm-6.1.11-f6b8b48da4-5891a596e9.zip/node_modules/@fullcalendar/vue3/",\ "packageDependencies": [\ - ["@fullcalendar/vue3", "npm:6.1.6"]\ + ["@fullcalendar/vue3", "npm:6.1.11"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6", {\ - "packageLocation": "./.yarn/__virtual__/@fullcalendar-vue3-virtual-ce9611c7d0/0/cache/@fullcalendar-vue3-npm-6.1.6-b1a9d6f44b-68fe3ce204.zip/node_modules/@fullcalendar/vue3/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-vue3-virtual-cb317bc2d1/0/cache/@fullcalendar-vue3-npm-6.1.11-f6b8b48da4-5891a596e9.zip/node_modules/@fullcalendar/vue3/",\ "packageDependencies": [\ - ["@fullcalendar/vue3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ + ["@fullcalendar/vue3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ ["@types/fullcalendar__core", null],\ ["@types/vue", null],\ - ["vue", "npm:3.2.47"]\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@fullcalendar/core",\ @@ -710,21 +766,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@html-validate/stylish", [\ - ["npm:4.0.1", {\ - "packageLocation": "./.yarn/cache/@html-validate-stylish-npm-4.0.1-a5ee83fd48-89c83ea1ae.zip/node_modules/@html-validate/stylish/",\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/@html-validate-stylish-npm-4.1.0-aba0cf2d6c-4af90db4f9.zip/node_modules/@html-validate/stylish/",\ "packageDependencies": [\ - ["@html-validate/stylish", "npm:4.0.1"],\ + ["@html-validate/stylish", "npm:4.1.0"],\ ["kleur", "npm:4.1.4"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@humanwhocodes/config-array", [\ - ["npm:0.11.8", {\ - "packageLocation": "./.yarn/cache/@humanwhocodes-config-array-npm-0.11.8-7955bfecc2-0fd6b3c54f.zip/node_modules/@humanwhocodes/config-array/",\ + ["npm:0.11.14", {\ + "packageLocation": "./.yarn/cache/@humanwhocodes-config-array-npm-0.11.14-94a02fcc87-861ccce9ea.zip/node_modules/@humanwhocodes/config-array/",\ "packageDependencies": [\ - ["@humanwhocodes/config-array", "npm:0.11.8"],\ - ["@humanwhocodes/object-schema", "npm:1.2.1"],\ + ["@humanwhocodes/config-array", "npm:0.11.14"],\ + ["@humanwhocodes/object-schema", "npm:2.0.2"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ ["minimatch", "npm:3.1.2"]\ ],\ @@ -741,10 +797,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@humanwhocodes/object-schema", [\ - ["npm:1.2.1", {\ - "packageLocation": "./.yarn/cache/@humanwhocodes-object-schema-npm-1.2.1-eb622b5d0e-a824a1ec31.zip/node_modules/@humanwhocodes/object-schema/",\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/@humanwhocodes-object-schema-npm-2.0.2-77b42018f9-2fc1150336.zip/node_modules/@humanwhocodes/object-schema/",\ "packageDependencies": [\ - ["@humanwhocodes/object-schema", "npm:1.2.1"]\ + ["@humanwhocodes/object-schema", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -782,18 +838,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@jridgewell/gen-mapping", [\ - ["npm:0.3.2", {\ - "packageLocation": "./.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip/node_modules/@jridgewell/gen-mapping/",\ - "packageDependencies": [\ - ["@jridgewell/gen-mapping", "npm:0.3.2"],\ - ["@jridgewell/set-array", "npm:1.1.2"],\ - ["@jridgewell/sourcemap-codec", "npm:1.4.14"],\ - ["@jridgewell/trace-mapping", "npm:0.3.17"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@jridgewell/resolve-uri", [\ ["npm:3.1.0", {\ "packageLocation": "./.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip/node_modules/@jridgewell/resolve-uri/",\ @@ -803,26 +847,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@jridgewell/set-array", [\ - ["npm:1.1.2", {\ - "packageLocation": "./.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip/node_modules/@jridgewell/set-array/",\ - "packageDependencies": [\ - ["@jridgewell/set-array", "npm:1.1.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@jridgewell/source-map", [\ - ["npm:0.3.2", {\ - "packageLocation": "./.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1b83f0eb94.zip/node_modules/@jridgewell/source-map/",\ - "packageDependencies": [\ - ["@jridgewell/source-map", "npm:0.3.2"],\ - ["@jridgewell/gen-mapping", "npm:0.3.2"],\ - ["@jridgewell/trace-mapping", "npm:0.3.17"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@jridgewell/sourcemap-codec", [\ ["npm:1.4.14", {\ "packageLocation": "./.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.14-f5f0630788-61100637b6.zip/node_modules/@jridgewell/sourcemap-codec/",\ @@ -830,6 +854,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@jridgewell/sourcemap-codec", "npm:1.4.14"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.4.15", {\ + "packageLocation": "./.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip/node_modules/@jridgewell/sourcemap-codec/",\ + "packageDependencies": [\ + ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@jridgewell/trace-mapping", [\ @@ -841,15 +872,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@jridgewell/sourcemap-codec", "npm:1.4.14"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:0.3.17", {\ - "packageLocation": "./.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip/node_modules/@jridgewell/trace-mapping/",\ - "packageDependencies": [\ - ["@jridgewell/trace-mapping", "npm:0.3.17"],\ - ["@jridgewell/resolve-uri", "npm:3.1.0"],\ - ["@jridgewell/sourcemap-codec", "npm:1.4.14"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@juggle/resize-observer", [\ @@ -887,6 +909,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@lmdb/lmdb-darwin-arm64", "npm:2.5.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.8.5", {\ + "packageLocation": "./.yarn/unplugged/@lmdb-lmdb-darwin-arm64-npm-2.8.5-a9ab00615c/node_modules/@lmdb/lmdb-darwin-arm64/",\ + "packageDependencies": [\ + ["@lmdb/lmdb-darwin-arm64", "npm:2.8.5"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@lmdb/lmdb-darwin-x64", [\ @@ -896,6 +925,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@lmdb/lmdb-darwin-x64", "npm:2.5.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.8.5", {\ + "packageLocation": "./.yarn/unplugged/@lmdb-lmdb-darwin-x64-npm-2.8.5-080b8c9329/node_modules/@lmdb/lmdb-darwin-x64/",\ + "packageDependencies": [\ + ["@lmdb/lmdb-darwin-x64", "npm:2.8.5"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@lmdb/lmdb-linux-arm", [\ @@ -905,6 +941,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@lmdb/lmdb-linux-arm", "npm:2.5.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.8.5", {\ + "packageLocation": "./.yarn/unplugged/@lmdb-lmdb-linux-arm-npm-2.8.5-081004004c/node_modules/@lmdb/lmdb-linux-arm/",\ + "packageDependencies": [\ + ["@lmdb/lmdb-linux-arm", "npm:2.8.5"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@lmdb/lmdb-linux-arm64", [\ @@ -914,6 +957,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@lmdb/lmdb-linux-arm64", "npm:2.5.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.8.5", {\ + "packageLocation": "./.yarn/unplugged/@lmdb-lmdb-linux-arm64-npm-2.8.5-9dfda9f24f/node_modules/@lmdb/lmdb-linux-arm64/",\ + "packageDependencies": [\ + ["@lmdb/lmdb-linux-arm64", "npm:2.8.5"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@lmdb/lmdb-linux-x64", [\ @@ -923,6 +973,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@lmdb/lmdb-linux-x64", "npm:2.5.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.8.5", {\ + "packageLocation": "./.yarn/unplugged/@lmdb-lmdb-linux-x64-npm-2.8.5-0f668ba9a7/node_modules/@lmdb/lmdb-linux-x64/",\ + "packageDependencies": [\ + ["@lmdb/lmdb-linux-x64", "npm:2.8.5"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@lmdb/lmdb-win32-x64", [\ @@ -932,6 +989,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@lmdb/lmdb-win32-x64", "npm:2.5.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.8.5", {\ + "packageLocation": "./.yarn/unplugged/@lmdb-lmdb-win32-x64-npm-2.8.5-3702de4edb/node_modules/@lmdb/lmdb-win32-x64/",\ + "packageDependencies": [\ + ["@lmdb/lmdb-win32-x64", "npm:2.8.5"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@mischnic/json-sourcemap", [\ @@ -953,6 +1017,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@msgpackr-extract/msgpackr-extract-darwin-arm64", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/unplugged/@msgpackr-extract-msgpackr-extract-darwin-arm64-npm-3.0.2-18ac236cc4/node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64/",\ + "packageDependencies": [\ + ["@msgpackr-extract/msgpackr-extract-darwin-arm64", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@msgpackr-extract/msgpackr-extract-darwin-x64", [\ @@ -962,6 +1033,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@msgpackr-extract/msgpackr-extract-darwin-x64", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/unplugged/@msgpackr-extract-msgpackr-extract-darwin-x64-npm-3.0.2-39dd07082a/node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64/",\ + "packageDependencies": [\ + ["@msgpackr-extract/msgpackr-extract-darwin-x64", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@msgpackr-extract/msgpackr-extract-linux-arm", [\ @@ -971,6 +1049,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@msgpackr-extract/msgpackr-extract-linux-arm", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/unplugged/@msgpackr-extract-msgpackr-extract-linux-arm-npm-3.0.2-808a652e0b/node_modules/@msgpackr-extract/msgpackr-extract-linux-arm/",\ + "packageDependencies": [\ + ["@msgpackr-extract/msgpackr-extract-linux-arm", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@msgpackr-extract/msgpackr-extract-linux-arm64", [\ @@ -980,6 +1065,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@msgpackr-extract/msgpackr-extract-linux-arm64", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/unplugged/@msgpackr-extract-msgpackr-extract-linux-arm64-npm-3.0.2-cfbf50d4c6/node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64/",\ + "packageDependencies": [\ + ["@msgpackr-extract/msgpackr-extract-linux-arm64", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@msgpackr-extract/msgpackr-extract-linux-x64", [\ @@ -989,6 +1081,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@msgpackr-extract/msgpackr-extract-linux-x64", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/unplugged/@msgpackr-extract-msgpackr-extract-linux-x64-npm-3.0.2-262fca760d/node_modules/@msgpackr-extract/msgpackr-extract-linux-x64/",\ + "packageDependencies": [\ + ["@msgpackr-extract/msgpackr-extract-linux-x64", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@msgpackr-extract/msgpackr-extract-win32-x64", [\ @@ -998,6 +1097,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@msgpackr-extract/msgpackr-extract-win32-x64", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/unplugged/@msgpackr-extract-msgpackr-extract-win32-x64-npm-3.0.2-c627beab89/node_modules/@msgpackr-extract/msgpackr-extract-win32-x64/",\ + "packageDependencies": [\ + ["@msgpackr-extract/msgpackr-extract-win32-x64", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@nodelib/fs.scandir", [\ @@ -1054,45 +1160,45 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/bundler-default", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-bundler-default-npm-2.8.3-b2fd23cf03-219b2be341.zip/node_modules/@parcel/bundler-default/",\ - "packageDependencies": [\ - ["@parcel/bundler-default", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/graph", "npm:2.8.3"],\ - ["@parcel/hash", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-bundler-default-npm-2.12.0-9ba57d919c-f211a76f55.zip/node_modules/@parcel/bundler-default/",\ + "packageDependencies": [\ + ["@parcel/bundler-default", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/graph", "npm:3.2.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/cache", [\ - ["npm:2.6.2", {\ - "packageLocation": "./.yarn/cache/@parcel-cache-npm-2.6.2-7c97030a45-e7b540fe10.zip/node_modules/@parcel/cache/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-cache-npm-2.12.0-3389909f2c-a45e799809.zip/node_modules/@parcel/cache/",\ "packageDependencies": [\ - ["@parcel/cache", "npm:2.6.2"]\ + ["@parcel/cache", "npm:2.12.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-cache-npm-2.8.3-7b70a160bc-cd679053d2.zip/node_modules/@parcel/cache/",\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/@parcel-cache-npm-2.6.2-7c97030a45-e7b540fe10.zip/node_modules/@parcel/cache/",\ "packageDependencies": [\ - ["@parcel/cache", "npm:2.8.3"]\ + ["@parcel/cache", "npm:2.6.2"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-cache-virtual-f4ec14de82/0/cache/@parcel-cache-npm-2.8.3-7b70a160bc-cd679053d2.zip/node_modules/@parcel/cache/",\ - "packageDependencies": [\ - ["@parcel/cache", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/core", "npm:2.8.3"],\ - ["@parcel/fs", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-cache-virtual-a2e9499dbb/0/cache/@parcel-cache-npm-2.12.0-3389909f2c-a45e799809.zip/node_modules/@parcel/cache/",\ + "packageDependencies": [\ + ["@parcel/cache", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/fs", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["@types/parcel__core", null],\ - ["lmdb", "npm:2.5.2"]\ + ["lmdb", "npm:2.8.5"]\ ],\ "packagePeers": [\ "@parcel/core",\ @@ -1100,14 +1206,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-cache-virtual-5ef63a38ca/0/cache/@parcel-cache-npm-2.8.3-7b70a160bc-cd679053d2.zip/node_modules/@parcel/cache/",\ + ["virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-cache-virtual-f3b3d44508/0/cache/@parcel-cache-npm-2.6.2-7c97030a45-e7b540fe10.zip/node_modules/@parcel/cache/",\ "packageDependencies": [\ - ["@parcel/cache", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ + ["@parcel/cache", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ ["@parcel/core", "npm:2.6.2"],\ - ["@parcel/fs", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/fs", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ + ["@parcel/logger", "npm:2.6.2"],\ + ["@parcel/utils", "npm:2.6.2"],\ ["@types/parcel__core", null],\ ["lmdb", "npm:2.5.2"]\ ],\ @@ -1116,16 +1222,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-cache-virtual-f3b3d44508/0/cache/@parcel-cache-npm-2.6.2-7c97030a45-e7b540fe10.zip/node_modules/@parcel/cache/",\ + ["virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-cache-virtual-6f5cc88243/0/cache/@parcel-cache-npm-2.12.0-3389909f2c-a45e799809.zip/node_modules/@parcel/cache/",\ "packageDependencies": [\ - ["@parcel/cache", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ + ["@parcel/cache", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ ["@parcel/core", "npm:2.6.2"],\ - ["@parcel/fs", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ - ["@parcel/logger", "npm:2.6.2"],\ - ["@parcel/utils", "npm:2.6.2"],\ + ["@parcel/fs", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["@types/parcel__core", null],\ - ["lmdb", "npm:2.5.2"]\ + ["lmdb", "npm:2.8.5"]\ ],\ "packagePeers": [\ "@types/parcel__core"\ @@ -1134,76 +1240,77 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/codeframe", [\ - ["npm:2.6.2", {\ - "packageLocation": "./.yarn/cache/@parcel-codeframe-npm-2.6.2-39f0ef1504-3253f42b90.zip/node_modules/@parcel/codeframe/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-codeframe-npm-2.12.0-aa8027940e-265c4d7ebe.zip/node_modules/@parcel/codeframe/",\ "packageDependencies": [\ - ["@parcel/codeframe", "npm:2.6.2"],\ + ["@parcel/codeframe", "npm:2.12.0"],\ ["chalk", "npm:4.1.2"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-codeframe-npm-2.8.3-e5df811b95-a6e82c30e6.zip/node_modules/@parcel/codeframe/",\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/@parcel-codeframe-npm-2.6.2-39f0ef1504-3253f42b90.zip/node_modules/@parcel/codeframe/",\ "packageDependencies": [\ - ["@parcel/codeframe", "npm:2.8.3"],\ + ["@parcel/codeframe", "npm:2.6.2"],\ ["chalk", "npm:4.1.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/compressor-raw", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-compressor-raw-npm-2.8.3-387b54c6ce-ca3b8a4f60.zip/node_modules/@parcel/compressor-raw/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-compressor-raw-npm-2.12.0-19f313c172-16c56704f3.zip/node_modules/@parcel/compressor-raw/",\ "packageDependencies": [\ - ["@parcel/compressor-raw", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"]\ + ["@parcel/compressor-raw", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/config-default", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-config-default-npm-2.8.3-465d8ed464-08c700a7a2.zip/node_modules/@parcel/config-default/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-config-default-npm-2.12.0-aefd3c699e-72877c5dc4.zip/node_modules/@parcel/config-default/",\ "packageDependencies": [\ - ["@parcel/config-default", "npm:2.8.3"]\ + ["@parcel/config-default", "npm:2.12.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:079004f749aaa3b41d1755e479be6fc0871d8df3c6d97e1317ea81a49502572ac0da821e08a1cc3e408b007d7607c0863e93b8975d65134412812579e6733926#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-config-default-virtual-ae79298a72/0/cache/@parcel-config-default-npm-2.8.3-465d8ed464-08c700a7a2.zip/node_modules/@parcel/config-default/",\ - "packageDependencies": [\ - ["@parcel/config-default", "virtual:079004f749aaa3b41d1755e479be6fc0871d8df3c6d97e1317ea81a49502572ac0da821e08a1cc3e408b007d7607c0863e93b8975d65134412812579e6733926#npm:2.8.3"],\ - ["@parcel/bundler-default", "npm:2.8.3"],\ - ["@parcel/compressor-raw", "npm:2.8.3"],\ - ["@parcel/core", "npm:2.8.3"],\ - ["@parcel/namer-default", "npm:2.8.3"],\ - ["@parcel/optimizer-css", "npm:2.8.3"],\ - ["@parcel/optimizer-htmlnano", "npm:2.8.3"],\ - ["@parcel/optimizer-image", "npm:2.8.3"],\ - ["@parcel/optimizer-svgo", "npm:2.8.3"],\ - ["@parcel/optimizer-terser", "npm:2.8.3"],\ - ["@parcel/packager-css", "npm:2.8.3"],\ - ["@parcel/packager-html", "npm:2.8.3"],\ - ["@parcel/packager-js", "npm:2.8.3"],\ - ["@parcel/packager-raw", "npm:2.8.3"],\ - ["@parcel/packager-svg", "npm:2.8.3"],\ - ["@parcel/reporter-dev-server", "npm:2.8.3"],\ - ["@parcel/resolver-default", "npm:2.8.3"],\ - ["@parcel/runtime-browser-hmr", "npm:2.8.3"],\ - ["@parcel/runtime-js", "npm:2.8.3"],\ - ["@parcel/runtime-react-refresh", "npm:2.8.3"],\ - ["@parcel/runtime-service-worker", "npm:2.8.3"],\ - ["@parcel/transformer-babel", "npm:2.8.3"],\ - ["@parcel/transformer-css", "npm:2.8.3"],\ - ["@parcel/transformer-html", "npm:2.8.3"],\ - ["@parcel/transformer-image", "virtual:ae79298a72e3d9363a5f43f0758f258949d82a428fc5aadd2010735eb57aa68b76713869ce052c228d610a7413537515425856a7c357d8a318c5ae937b566246#npm:2.8.3"],\ - ["@parcel/transformer-js", "virtual:ae79298a72e3d9363a5f43f0758f258949d82a428fc5aadd2010735eb57aa68b76713869ce052c228d610a7413537515425856a7c357d8a318c5ae937b566246#npm:2.8.3"],\ - ["@parcel/transformer-json", "npm:2.8.3"],\ - ["@parcel/transformer-postcss", "npm:2.8.3"],\ - ["@parcel/transformer-posthtml", "npm:2.8.3"],\ - ["@parcel/transformer-raw", "npm:2.8.3"],\ - ["@parcel/transformer-react-refresh-wrap", "npm:2.8.3"],\ - ["@parcel/transformer-svg", "npm:2.8.3"],\ + ["virtual:fdd74b573cf769bcde15fb47c39fbe0d73f59838182900fd59d3d43b2214ea01b1d45084fb49d0c192fc3e8a49adea5782afcb7fe14e09c63bedaf09f4939e35#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-config-default-virtual-284acdc258/0/cache/@parcel-config-default-npm-2.12.0-aefd3c699e-72877c5dc4.zip/node_modules/@parcel/config-default/",\ + "packageDependencies": [\ + ["@parcel/config-default", "virtual:fdd74b573cf769bcde15fb47c39fbe0d73f59838182900fd59d3d43b2214ea01b1d45084fb49d0c192fc3e8a49adea5782afcb7fe14e09c63bedaf09f4939e35#npm:2.12.0"],\ + ["@parcel/bundler-default", "npm:2.12.0"],\ + ["@parcel/compressor-raw", "npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/namer-default", "npm:2.12.0"],\ + ["@parcel/optimizer-css", "npm:2.12.0"],\ + ["@parcel/optimizer-htmlnano", "npm:2.12.0"],\ + ["@parcel/optimizer-image", "virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0"],\ + ["@parcel/optimizer-svgo", "npm:2.12.0"],\ + ["@parcel/optimizer-swc", "npm:2.12.0"],\ + ["@parcel/packager-css", "npm:2.12.0"],\ + ["@parcel/packager-html", "npm:2.12.0"],\ + ["@parcel/packager-js", "npm:2.12.0"],\ + ["@parcel/packager-raw", "npm:2.12.0"],\ + ["@parcel/packager-svg", "npm:2.12.0"],\ + ["@parcel/packager-wasm", "npm:2.12.0"],\ + ["@parcel/reporter-dev-server", "npm:2.12.0"],\ + ["@parcel/resolver-default", "npm:2.12.0"],\ + ["@parcel/runtime-browser-hmr", "npm:2.12.0"],\ + ["@parcel/runtime-js", "npm:2.12.0"],\ + ["@parcel/runtime-react-refresh", "npm:2.12.0"],\ + ["@parcel/runtime-service-worker", "npm:2.12.0"],\ + ["@parcel/transformer-babel", "npm:2.12.0"],\ + ["@parcel/transformer-css", "npm:2.12.0"],\ + ["@parcel/transformer-html", "npm:2.12.0"],\ + ["@parcel/transformer-image", "virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0"],\ + ["@parcel/transformer-js", "virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0"],\ + ["@parcel/transformer-json", "npm:2.12.0"],\ + ["@parcel/transformer-postcss", "npm:2.12.0"],\ + ["@parcel/transformer-posthtml", "npm:2.12.0"],\ + ["@parcel/transformer-raw", "npm:2.12.0"],\ + ["@parcel/transformer-react-refresh-wrap", "npm:2.12.0"],\ + ["@parcel/transformer-svg", "npm:2.12.0"],\ ["@types/parcel__core", null]\ ],\ "packagePeers": [\ @@ -1214,6 +1321,38 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/core", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-core-npm-2.12.0-8f08b883d4-5bf6746308.zip/node_modules/@parcel/core/",\ + "packageDependencies": [\ + ["@parcel/core", "npm:2.12.0"],\ + ["@mischnic/json-sourcemap", "npm:0.1.0"],\ + ["@parcel/cache", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/events", "npm:2.12.0"],\ + ["@parcel/fs", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/graph", "npm:3.2.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/package-manager", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/profiler", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ + ["@parcel/source-map", "npm:2.1.1"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@parcel/workers", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["abortcontroller-polyfill", "npm:1.7.3"],\ + ["base-x", "npm:3.0.9"],\ + ["browserslist", "npm:4.20.3"],\ + ["clone", "npm:2.1.2"],\ + ["dotenv", "npm:7.0.0"],\ + ["dotenv-expand", "npm:5.1.0"],\ + ["json5", "npm:2.2.1"],\ + ["msgpackr", "npm:1.10.1"],\ + ["nullthrows", "npm:1.1.1"],\ + ["semver", "npm:7.5.4"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:2.6.2", {\ "packageLocation": "./.yarn/cache/@parcel-core-npm-2.6.2-f04091cfa7-f550cbbd5e.zip/node_modules/@parcel/core/",\ "packageDependencies": [\ @@ -1244,53 +1383,22 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["semver", "npm:5.7.1"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-core-npm-2.8.3-1751106c31-68adceb1b0.zip/node_modules/@parcel/core/",\ - "packageDependencies": [\ - ["@parcel/core", "npm:2.8.3"],\ - ["@mischnic/json-sourcemap", "npm:0.1.0"],\ - ["@parcel/cache", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/events", "npm:2.8.3"],\ - ["@parcel/fs", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/graph", "npm:2.8.3"],\ - ["@parcel/hash", "npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/package-manager", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ - ["@parcel/workers", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["abortcontroller-polyfill", "npm:1.7.3"],\ - ["base-x", "npm:3.0.9"],\ - ["browserslist", "npm:4.20.3"],\ - ["clone", "npm:2.1.2"],\ - ["dotenv", "npm:7.0.0"],\ - ["dotenv-expand", "npm:5.1.0"],\ - ["json5", "npm:2.2.1"],\ - ["msgpackr", "npm:1.6.0"],\ - ["nullthrows", "npm:1.1.1"],\ - ["semver", "npm:5.7.1"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@parcel/diagnostic", [\ - ["npm:2.6.2", {\ - "packageLocation": "./.yarn/cache/@parcel-diagnostic-npm-2.6.2-ad66c9d460-c20c7b12c4.zip/node_modules/@parcel/diagnostic/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-diagnostic-npm-2.12.0-6e89ddad28-a4b918c1a0.zip/node_modules/@parcel/diagnostic/",\ "packageDependencies": [\ - ["@parcel/diagnostic", "npm:2.6.2"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ ["@mischnic/json-sourcemap", "npm:0.1.0"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-diagnostic-npm-2.8.3-2e1d38a83b-c24d98a2db.zip/node_modules/@parcel/diagnostic/",\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/@parcel-diagnostic-npm-2.6.2-ad66c9d460-c20c7b12c4.zip/node_modules/@parcel/diagnostic/",\ "packageDependencies": [\ - ["@parcel/diagnostic", "npm:2.8.3"],\ + ["@parcel/diagnostic", "npm:2.6.2"],\ ["@mischnic/json-sourcemap", "npm:0.1.0"],\ ["nullthrows", "npm:1.1.1"]\ ],\ @@ -1298,46 +1406,46 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/events", [\ - ["npm:2.6.2", {\ - "packageLocation": "./.yarn/cache/@parcel-events-npm-2.6.2-c1dc15633e-272898db0c.zip/node_modules/@parcel/events/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-events-npm-2.12.0-e6eff18c8c-136a8a2921.zip/node_modules/@parcel/events/",\ "packageDependencies": [\ - ["@parcel/events", "npm:2.6.2"]\ + ["@parcel/events", "npm:2.12.0"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-events-npm-2.8.3-40eebe35e5-9d23c6663e.zip/node_modules/@parcel/events/",\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/@parcel-events-npm-2.6.2-c1dc15633e-272898db0c.zip/node_modules/@parcel/events/",\ "packageDependencies": [\ - ["@parcel/events", "npm:2.8.3"]\ + ["@parcel/events", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/fs", [\ - ["npm:2.6.2", {\ - "packageLocation": "./.yarn/cache/@parcel-fs-npm-2.6.2-1670f601e3-b5e324d93b.zip/node_modules/@parcel/fs/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-fs-npm-2.12.0-3c46842e62-43d454d55d.zip/node_modules/@parcel/fs/",\ "packageDependencies": [\ - ["@parcel/fs", "npm:2.6.2"]\ + ["@parcel/fs", "npm:2.12.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-fs-npm-2.8.3-a413e84c2d-cc421552da.zip/node_modules/@parcel/fs/",\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/@parcel-fs-npm-2.6.2-1670f601e3-b5e324d93b.zip/node_modules/@parcel/fs/",\ "packageDependencies": [\ - ["@parcel/fs", "npm:2.8.3"]\ + ["@parcel/fs", "npm:2.6.2"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-fs-virtual-f882c18483/0/cache/@parcel-fs-npm-2.8.3-a413e84c2d-cc421552da.zip/node_modules/@parcel/fs/",\ - "packageDependencies": [\ - ["@parcel/fs", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/core", "npm:2.8.3"],\ - ["@parcel/fs-search", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-fs-virtual-762e5c5add/0/cache/@parcel-fs-npm-2.12.0-3c46842e62-43d454d55d.zip/node_modules/@parcel/fs/",\ + "packageDependencies": [\ + ["@parcel/fs", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["@parcel/watcher", "npm:2.0.7"],\ - ["@parcel/workers", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ + ["@parcel/workers", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ ["@types/parcel__core", null]\ ],\ "packagePeers": [\ @@ -1346,16 +1454,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-fs-virtual-77e9884705/0/cache/@parcel-fs-npm-2.8.3-a413e84c2d-cc421552da.zip/node_modules/@parcel/fs/",\ + ["virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-fs-virtual-cfea854226/0/cache/@parcel-fs-npm-2.6.2-1670f601e3-b5e324d93b.zip/node_modules/@parcel/fs/",\ "packageDependencies": [\ - ["@parcel/fs", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ + ["@parcel/fs", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ ["@parcel/core", "npm:2.6.2"],\ - ["@parcel/fs-search", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ - ["@parcel/watcher", "npm:2.0.7"],\ - ["@parcel/workers", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ + ["@parcel/fs-search", "npm:2.6.2"],\ + ["@parcel/types", "npm:2.6.2"],\ + ["@parcel/utils", "npm:2.6.2"],\ + ["@parcel/watcher", "npm:2.0.5"],\ + ["@parcel/workers", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ ["@types/parcel__core", null]\ ],\ "packagePeers": [\ @@ -1363,16 +1471,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-fs-virtual-cfea854226/0/cache/@parcel-fs-npm-2.6.2-1670f601e3-b5e324d93b.zip/node_modules/@parcel/fs/",\ + ["virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-fs-virtual-ae7dde1116/0/cache/@parcel-fs-npm-2.12.0-3c46842e62-43d454d55d.zip/node_modules/@parcel/fs/",\ "packageDependencies": [\ - ["@parcel/fs", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ + ["@parcel/fs", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ ["@parcel/core", "npm:2.6.2"],\ - ["@parcel/fs-search", "npm:2.6.2"],\ - ["@parcel/types", "npm:2.6.2"],\ - ["@parcel/utils", "npm:2.6.2"],\ - ["@parcel/watcher", "npm:2.0.5"],\ - ["@parcel/workers", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ + ["@parcel/rust", "npm:2.12.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@parcel/watcher", "npm:2.0.7"],\ + ["@parcel/workers", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ ["@types/parcel__core", null]\ ],\ "packagePeers": [\ @@ -1389,14 +1497,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["detect-libc", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/unplugged/@parcel-fs-search-npm-2.8.3-aafc0a2ad7/node_modules/@parcel/fs-search/",\ - "packageDependencies": [\ - ["@parcel/fs-search", "npm:2.8.3"],\ - ["detect-libc", "npm:1.0.3"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@parcel/graph", [\ @@ -1409,10 +1509,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-graph-npm-2.8.3-15d2d4448e-ceed8445f5.zip/node_modules/@parcel/graph/",\ + ["npm:3.2.0", {\ + "packageLocation": "./.yarn/cache/@parcel-graph-npm-3.2.0-92821d4289-b4d31624fc.zip/node_modules/@parcel/graph/",\ "packageDependencies": [\ - ["@parcel/graph", "npm:2.8.3"],\ + ["@parcel/graph", "npm:3.2.0"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ @@ -1427,18 +1527,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["xxhash-wasm", "npm:0.4.2"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/unplugged/@parcel-hash-npm-2.8.3-48d5e2907f/node_modules/@parcel/hash/",\ - "packageDependencies": [\ - ["@parcel/hash", "npm:2.8.3"],\ - ["detect-libc", "npm:1.0.3"],\ - ["xxhash-wasm", "npm:0.4.2"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@parcel/logger", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-logger-npm-2.12.0-7d2f85a906-be3fe9d9ea.zip/node_modules/@parcel/logger/",\ + "packageDependencies": [\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/events", "npm:2.12.0"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:2.6.2", {\ "packageLocation": "./.yarn/cache/@parcel-logger-npm-2.6.2-d7fe563ebb-d3536408da.zip/node_modules/@parcel/logger/",\ "packageDependencies": [\ @@ -1447,69 +1547,63 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@parcel/events", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-logger-npm-2.8.3-f13624d366-04fd463131.zip/node_modules/@parcel/logger/",\ - "packageDependencies": [\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/events", "npm:2.8.3"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@parcel/markdown-ansi", [\ - ["npm:2.6.2", {\ - "packageLocation": "./.yarn/cache/@parcel-markdown-ansi-npm-2.6.2-16ce118d53-742c64c5db.zip/node_modules/@parcel/markdown-ansi/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-markdown-ansi-npm-2.12.0-6b0fe453df-850ee665d9.zip/node_modules/@parcel/markdown-ansi/",\ "packageDependencies": [\ - ["@parcel/markdown-ansi", "npm:2.6.2"],\ + ["@parcel/markdown-ansi", "npm:2.12.0"],\ ["chalk", "npm:4.1.2"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-markdown-ansi-npm-2.8.3-4b66177a38-1985f149b2.zip/node_modules/@parcel/markdown-ansi/",\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/@parcel-markdown-ansi-npm-2.6.2-16ce118d53-742c64c5db.zip/node_modules/@parcel/markdown-ansi/",\ "packageDependencies": [\ - ["@parcel/markdown-ansi", "npm:2.8.3"],\ + ["@parcel/markdown-ansi", "npm:2.6.2"],\ ["chalk", "npm:4.1.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/namer-default", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-namer-default-npm-2.8.3-486a772540-7c2c343446.zip/node_modules/@parcel/namer-default/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-namer-default-npm-2.12.0-28980cfd47-dc92ec0945.zip/node_modules/@parcel/namer-default/",\ "packageDependencies": [\ - ["@parcel/namer-default", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/namer-default", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/node-resolver-core", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-node-resolver-core-npm-2.8.3-40a48fa4e7-4976d3ecc9.zip/node_modules/@parcel/node-resolver-core/",\ + ["npm:3.3.0", {\ + "packageLocation": "./.yarn/cache/@parcel-node-resolver-core-npm-3.3.0-53804df663-acc3721678.zip/node_modules/@parcel/node-resolver-core/",\ "packageDependencies": [\ - ["@parcel/node-resolver-core", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/node-resolver-core", "npm:3.3.0"],\ + ["@mischnic/json-sourcemap", "npm:0.1.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/fs", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"],\ - ["semver", "npm:5.7.1"]\ + ["semver", "npm:7.5.4"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/optimizer-css", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-optimizer-css-npm-2.8.3-6e7102b9ab-ffac43a2c2.zip/node_modules/@parcel/optimizer-css/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-optimizer-css-npm-2.12.0-f95bd4d060-abcdf58c29.zip/node_modules/@parcel/optimizer-css/",\ "packageDependencies": [\ - ["@parcel/optimizer-css", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/optimizer-css", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["browserslist", "npm:4.20.3"],\ ["lightningcss", "npm:1.17.1"],\ ["nullthrows", "npm:1.1.1"]\ @@ -1518,12 +1612,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/optimizer-data-url", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-optimizer-data-url-npm-2.8.3-dd2c9afc59-5df8d88826.zip/node_modules/@parcel/optimizer-data-url/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-optimizer-data-url-npm-2.12.0-dad3731170-0397293961.zip/node_modules/@parcel/optimizer-data-url/",\ "packageDependencies": [\ - ["@parcel/optimizer-data-url", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/optimizer-data-url", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["isbinaryfile", "npm:4.0.10"],\ ["mime", "npm:2.6.0"]\ ],\ @@ -1531,12 +1625,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/optimizer-htmlnano", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-optimizer-htmlnano-npm-2.8.3-62c761ef26-ca1cab7b1e.zip/node_modules/@parcel/optimizer-htmlnano/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-optimizer-htmlnano-npm-2.12.0-cdd2835c12-64e571f56f.zip/node_modules/@parcel/optimizer-htmlnano/",\ "packageDependencies": [\ - ["@parcel/optimizer-htmlnano", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["htmlnano", "virtual:62c761ef265a1bb47118c5f610ff8bb4c7a43de129089ff7c8e3644d9427d7669d4e7e8fe06763510806415fe32bf491fdfbec2819a7040538b412dfe2ab9cb1#npm:2.0.2"],\ + ["@parcel/optimizer-htmlnano", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["htmlnano", "virtual:cdd2835c1202e86fad55b2266578ff3755267672440481af37bdfff670fd205f561469a10385c20d1ff403af7fad49006bc71ffff21d12592a8ebd0c8be79c0c#npm:2.0.2"],\ ["nullthrows", "npm:1.1.1"],\ ["posthtml", "npm:0.16.6"],\ ["svgo", "npm:2.8.0"]\ @@ -1545,76 +1639,90 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/optimizer-image", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/unplugged/@parcel-optimizer-image-npm-2.8.3-4a1aa225b2/node_modules/@parcel/optimizer-image/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-optimizer-image-npm-2.12.0-4cbc56f72d-7d28379bf1.zip/node_modules/@parcel/optimizer-image/",\ "packageDependencies": [\ - ["@parcel/optimizer-image", "npm:2.8.3"],\ - ["@parcel/core", "npm:2.6.2"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ - ["@parcel/workers", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["detect-libc", "npm:1.0.3"]\ + ["@parcel/optimizer-image", "npm:2.12.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-optimizer-image-virtual-8c3b1760b5/0/cache/@parcel-optimizer-image-npm-2.12.0-4cbc56f72d-7d28379bf1.zip/node_modules/@parcel/optimizer-image/",\ + "packageDependencies": [\ + ["@parcel/optimizer-image", "virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@parcel/workers", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@types/parcel__core", null]\ + ],\ + "packagePeers": [\ + "@parcel/core",\ + "@types/parcel__core"\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/optimizer-svgo", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-optimizer-svgo-npm-2.8.3-b5d4af08b7-b3544c08fa.zip/node_modules/@parcel/optimizer-svgo/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-optimizer-svgo-npm-2.12.0-08c0f1b17f-d3a4d2de9f.zip/node_modules/@parcel/optimizer-svgo/",\ "packageDependencies": [\ - ["@parcel/optimizer-svgo", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/optimizer-svgo", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["svgo", "npm:2.8.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ - ["@parcel/optimizer-terser", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-optimizer-terser-npm-2.8.3-5e561ce7db-ee1959f596.zip/node_modules/@parcel/optimizer-terser/",\ + ["@parcel/optimizer-swc", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-optimizer-swc-npm-2.12.0-fb535e4283-0b7fdf3df1.zip/node_modules/@parcel/optimizer-swc/",\ "packageDependencies": [\ - ["@parcel/optimizer-terser", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/optimizer-swc", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/utils", "npm:2.8.3"],\ - ["nullthrows", "npm:1.1.1"],\ - ["terser", "npm:5.16.5"]\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@swc/core", "virtual:5f8211ac5fe0096c8679c8fc747f0917af84ce168460ce1b592cb42613ababf55139691f5b329cd10e1e2b99af39861401c7b9633ed396447c506b02a80144b0#npm:1.3.62"],\ + ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/package-manager", [\ - ["npm:2.6.2", {\ - "packageLocation": "./.yarn/cache/@parcel-package-manager-npm-2.6.2-41edbfb7da-0c7dfce953.zip/node_modules/@parcel/package-manager/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-package-manager-npm-2.12.0-fc90aacf70-a517e9efe1.zip/node_modules/@parcel/package-manager/",\ "packageDependencies": [\ - ["@parcel/package-manager", "npm:2.6.2"]\ + ["@parcel/package-manager", "npm:2.12.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-package-manager-npm-2.8.3-0dc329e43e-572a5aacfd.zip/node_modules/@parcel/package-manager/",\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/@parcel-package-manager-npm-2.6.2-41edbfb7da-0c7dfce953.zip/node_modules/@parcel/package-manager/",\ "packageDependencies": [\ - ["@parcel/package-manager", "npm:2.8.3"]\ + ["@parcel/package-manager", "npm:2.6.2"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-package-manager-virtual-74c3fc2aaf/0/cache/@parcel-package-manager-npm-2.8.3-0dc329e43e-572a5aacfd.zip/node_modules/@parcel/package-manager/",\ - "packageDependencies": [\ - ["@parcel/package-manager", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/core", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/fs", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ - ["@parcel/workers", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ + ["virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-package-manager-virtual-8612c9adea/0/cache/@parcel-package-manager-npm-2.12.0-fc90aacf70-a517e9efe1.zip/node_modules/@parcel/package-manager/",\ + "packageDependencies": [\ + ["@parcel/package-manager", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/fs", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/node-resolver-core", "npm:3.3.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@parcel/workers", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@swc/core", "virtual:5f8211ac5fe0096c8679c8fc747f0917af84ce168460ce1b592cb42613ababf55139691f5b329cd10e1e2b99af39861401c7b9633ed396447c506b02a80144b0#npm:1.3.62"],\ ["@types/parcel__core", null],\ - ["semver", "npm:5.7.1"]\ + ["semver", "npm:7.5.4"]\ ],\ "packagePeers": [\ "@parcel/core",\ @@ -1622,25 +1730,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-package-manager-virtual-563b128815/0/cache/@parcel-package-manager-npm-2.8.3-0dc329e43e-572a5aacfd.zip/node_modules/@parcel/package-manager/",\ - "packageDependencies": [\ - ["@parcel/package-manager", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["@parcel/core", "npm:2.6.2"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/fs", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ - ["@parcel/workers", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["@types/parcel__core", null],\ - ["semver", "npm:5.7.1"]\ - ],\ - "packagePeers": [\ - "@types/parcel__core"\ - ],\ - "linkType": "HARD"\ - }],\ ["virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2", {\ "packageLocation": "./.yarn/__virtual__/@parcel-package-manager-virtual-423c759aca/0/cache/@parcel-package-manager-npm-2.6.2-41edbfb7da-0c7dfce953.zip/node_modules/@parcel/package-manager/",\ "packageDependencies": [\ @@ -1659,29 +1748,52 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "@types/parcel__core"\ ],\ "linkType": "HARD"\ + }],\ + ["virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-package-manager-virtual-5f8211ac5f/0/cache/@parcel-package-manager-npm-2.12.0-fc90aacf70-a517e9efe1.zip/node_modules/@parcel/package-manager/",\ + "packageDependencies": [\ + ["@parcel/package-manager", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["@parcel/core", "npm:2.6.2"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/fs", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/node-resolver-core", "npm:3.3.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@parcel/workers", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["@swc/core", "virtual:5f8211ac5fe0096c8679c8fc747f0917af84ce168460ce1b592cb42613ababf55139691f5b329cd10e1e2b99af39861401c7b9633ed396447c506b02a80144b0#npm:1.3.62"],\ + ["@types/parcel__core", null],\ + ["semver", "npm:7.5.4"]\ + ],\ + "packagePeers": [\ + "@types/parcel__core"\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@parcel/packager-css", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-packager-css-npm-2.8.3-c127d6c552-bb28fc9f02.zip/node_modules/@parcel/packager-css/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-packager-css-npm-2.12.0-b1c27a8323-684aaa1d85.zip/node_modules/@parcel/packager-css/",\ "packageDependencies": [\ - ["@parcel/packager-css", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/packager-css", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["lightningcss", "npm:1.17.1"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/packager-html", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-packager-html-npm-2.8.3-4e3da006ce-631f98fca0.zip/node_modules/@parcel/packager-html/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-packager-html-npm-2.12.0-ad361b1265-ee558ad616.zip/node_modules/@parcel/packager-html/",\ "packageDependencies": [\ - ["@parcel/packager-html", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/packager-html", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"],\ ["posthtml", "npm:0.16.6"]\ ],\ @@ -1689,15 +1801,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/packager-js", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-packager-js-npm-2.8.3-3441713a0f-92ac88244b.zip/node_modules/@parcel/packager-js/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-packager-js-npm-2.12.0-093e3200cd-2189b7ff15.zip/node_modules/@parcel/packager-js/",\ "packageDependencies": [\ - ["@parcel/packager-js", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/hash", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/packager-js", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["globals", "npm:13.15.0"],\ ["nullthrows", "npm:1.1.1"]\ ],\ @@ -1705,29 +1818,47 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/packager-raw", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-packager-raw-npm-2.8.3-0a1dab14a2-26236dd646.zip/node_modules/@parcel/packager-raw/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-packager-raw-npm-2.12.0-b7f15635f8-39ce2fc7ae.zip/node_modules/@parcel/packager-raw/",\ "packageDependencies": [\ - ["@parcel/packager-raw", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"]\ + ["@parcel/packager-raw", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/packager-svg", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-packager-svg-npm-2.8.3-c3163591d4-45c966ad8e.zip/node_modules/@parcel/packager-svg/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-packager-svg-npm-2.12.0-fa921ce522-436ac9ea39.zip/node_modules/@parcel/packager-svg/",\ "packageDependencies": [\ - ["@parcel/packager-svg", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/packager-svg", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["posthtml", "npm:0.16.6"]\ ],\ "linkType": "HARD"\ }]\ ]],\ + ["@parcel/packager-wasm", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-packager-wasm-npm-2.12.0-ec551a9e29-a10e1cd988.zip/node_modules/@parcel/packager-wasm/",\ + "packageDependencies": [\ + ["@parcel/packager-wasm", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@parcel/plugin", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-plugin-npm-2.12.0-947dec85d3-0b52f1dd06.zip/node_modules/@parcel/plugin/",\ + "packageDependencies": [\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/types", "npm:2.12.0"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:2.6.2", {\ "packageLocation": "./.yarn/cache/@parcel-plugin-npm-2.6.2-d1ea2dda44-23da0fa372.zip/node_modules/@parcel/plugin/",\ "packageDependencies": [\ @@ -1735,24 +1866,28 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@parcel/types", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-plugin-npm-2.8.3-c228eb7640-a69ac66f5c.zip/node_modules/@parcel/plugin/",\ + }]\ + ]],\ + ["@parcel/profiler", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-profiler-npm-2.12.0-69720a23ab-b683b74e10.zip/node_modules/@parcel/profiler/",\ "packageDependencies": [\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"]\ + ["@parcel/profiler", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/events", "npm:2.12.0"],\ + ["chrome-trace-event", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/reporter-cli", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-reporter-cli-npm-2.8.3-d340f7fcb8-791dd4706a.zip/node_modules/@parcel/reporter-cli/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-reporter-cli-npm-2.12.0-b3e4c5fe19-8cc524fa15.zip/node_modules/@parcel/reporter-cli/",\ "packageDependencies": [\ - ["@parcel/reporter-cli", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/reporter-cli", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["chalk", "npm:4.1.2"],\ ["term-size", "npm:2.2.1"]\ ],\ @@ -1760,57 +1895,71 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/reporter-dev-server", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-reporter-dev-server-npm-2.8.3-be7051861d-329db9fd0c.zip/node_modules/@parcel/reporter-dev-server/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-reporter-dev-server-npm-2.12.0-aed1d2c68c-43957b4656.zip/node_modules/@parcel/reporter-dev-server/",\ + "packageDependencies": [\ + ["@parcel/reporter-dev-server", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@parcel/reporter-tracer", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-reporter-tracer-npm-2.12.0-5cec9ab2d5-24cddacd19.zip/node_modules/@parcel/reporter-tracer/",\ "packageDependencies": [\ - ["@parcel/reporter-dev-server", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"]\ + ["@parcel/reporter-tracer", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["chrome-trace-event", "npm:1.0.3"],\ + ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/resolver-default", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-resolver-default-npm-2.8.3-de025989bd-40515a62c1.zip/node_modules/@parcel/resolver-default/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-resolver-default-npm-2.12.0-8da790891c-f3652eea09.zip/node_modules/@parcel/resolver-default/",\ "packageDependencies": [\ - ["@parcel/resolver-default", "npm:2.8.3"],\ - ["@parcel/node-resolver-core", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"]\ + ["@parcel/resolver-default", "npm:2.12.0"],\ + ["@parcel/node-resolver-core", "npm:3.3.0"],\ + ["@parcel/plugin", "npm:2.12.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/runtime-browser-hmr", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-runtime-browser-hmr-npm-2.8.3-63941ffa5c-56c276c7b0.zip/node_modules/@parcel/runtime-browser-hmr/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-runtime-browser-hmr-npm-2.12.0-6f0da66673-bbba57ecee.zip/node_modules/@parcel/runtime-browser-hmr/",\ "packageDependencies": [\ - ["@parcel/runtime-browser-hmr", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"]\ + ["@parcel/runtime-browser-hmr", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/runtime-js", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-runtime-js-npm-2.8.3-a82379279f-ee5e04f84d.zip/node_modules/@parcel/runtime-js/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-runtime-js-npm-2.12.0-e21acc0f42-6afa3e7eb2.zip/node_modules/@parcel/runtime-js/",\ "packageDependencies": [\ - ["@parcel/runtime-js", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/runtime-js", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/runtime-react-refresh", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-runtime-react-refresh-npm-2.8.3-42e337381a-327159be0c.zip/node_modules/@parcel/runtime-react-refresh/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-runtime-react-refresh-npm-2.12.0-2b09615691-41aee9a874.zip/node_modules/@parcel/runtime-react-refresh/",\ "packageDependencies": [\ - ["@parcel/runtime-react-refresh", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/runtime-react-refresh", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["react-error-overlay", "npm:6.0.9"],\ ["react-refresh", "npm:0.9.0"]\ ],\ @@ -1818,17 +1967,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/runtime-service-worker", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-runtime-service-worker-npm-2.8.3-426255f187-0646fee9a9.zip/node_modules/@parcel/runtime-service-worker/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-runtime-service-worker-npm-2.12.0-7d227ff0bf-c71246428e.zip/node_modules/@parcel/runtime-service-worker/",\ "packageDependencies": [\ - ["@parcel/runtime-service-worker", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/runtime-service-worker", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ + ["@parcel/rust", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/unplugged/@parcel-rust-npm-2.12.0-0cf943f3e5/node_modules/@parcel/rust/",\ + "packageDependencies": [\ + ["@parcel/rust", "npm:2.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@parcel/source-map", [\ ["npm:2.0.5", {\ "packageLocation": "./.yarn/unplugged/@parcel-source-map-npm-2.0.5-2444d2c092/node_modules/@parcel/source-map/",\ @@ -1848,31 +2006,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/transformer-babel", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-babel-npm-2.8.3-bd1a7cae4d-a27bbe8d89.zip/node_modules/@parcel/transformer-babel/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-babel-npm-2.12.0-953de52432-b8c457c0be.zip/node_modules/@parcel/transformer-babel/",\ "packageDependencies": [\ - ["@parcel/transformer-babel", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/transformer-babel", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["browserslist", "npm:4.20.3"],\ ["json5", "npm:2.2.1"],\ ["nullthrows", "npm:1.1.1"],\ - ["semver", "npm:5.7.1"]\ + ["semver", "npm:7.5.4"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/transformer-css", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-css-npm-2.8.3-e5a36983ce-31375a1405.zip/node_modules/@parcel/transformer-css/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-css-npm-2.12.0-24ddc31ae3-3a6f16321d.zip/node_modules/@parcel/transformer-css/",\ "packageDependencies": [\ - ["@parcel/transformer-css", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/transformer-css", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["browserslist", "npm:4.20.3"],\ ["lightningcss", "npm:1.17.1"],\ ["nullthrows", "npm:1.1.1"]\ @@ -1881,39 +2039,39 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/transformer-html", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-html-npm-2.8.3-ce9c33e277-21600a3e0a.zip/node_modules/@parcel/transformer-html/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-html-npm-2.12.0-be2b9ee40c-7fcfac62ca.zip/node_modules/@parcel/transformer-html/",\ "packageDependencies": [\ - ["@parcel/transformer-html", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/hash", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/transformer-html", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"],\ ["posthtml", "npm:0.16.6"],\ ["posthtml-parser", "npm:0.10.2"],\ ["posthtml-render", "npm:3.0.0"],\ - ["semver", "npm:5.7.1"],\ + ["semver", "npm:7.5.4"],\ ["srcset", "npm:4.0.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/transformer-image", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-image-npm-2.8.3-ddf03325c2-f4b3464828.zip/node_modules/@parcel/transformer-image/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-image-npm-2.12.0-53f04e21c0-0a1581eacc.zip/node_modules/@parcel/transformer-image/",\ "packageDependencies": [\ - ["@parcel/transformer-image", "npm:2.8.3"]\ + ["@parcel/transformer-image", "npm:2.12.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:ae79298a72e3d9363a5f43f0758f258949d82a428fc5aadd2010735eb57aa68b76713869ce052c228d610a7413537515425856a7c357d8a318c5ae937b566246#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-transformer-image-virtual-007d8db0db/0/cache/@parcel-transformer-image-npm-2.8.3-ddf03325c2-f4b3464828.zip/node_modules/@parcel/transformer-image/",\ - "packageDependencies": [\ - ["@parcel/transformer-image", "virtual:ae79298a72e3d9363a5f43f0758f258949d82a428fc5aadd2010735eb57aa68b76713869ce052c228d610a7413537515425856a7c357d8a318c5ae937b566246#npm:2.8.3"],\ - ["@parcel/core", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ - ["@parcel/workers", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ + ["virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-transformer-image-virtual-acc9c20c9c/0/cache/@parcel-transformer-image-npm-2.12.0-53f04e21c0-0a1581eacc.zip/node_modules/@parcel/transformer-image/",\ + "packageDependencies": [\ + ["@parcel/transformer-image", "virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@parcel/workers", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ ["@types/parcel__core", null],\ ["nullthrows", "npm:1.1.1"]\ ],\ @@ -1925,40 +2083,40 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/transformer-inline-string", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-inline-string-npm-2.8.3-6e4701a9cd-23fa279e1f.zip/node_modules/@parcel/transformer-inline-string/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-inline-string-npm-2.12.0-a33f10bafa-5f63c08695.zip/node_modules/@parcel/transformer-inline-string/",\ "packageDependencies": [\ - ["@parcel/transformer-inline-string", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"]\ + ["@parcel/transformer-inline-string", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/transformer-js", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/unplugged/@parcel-transformer-js-virtual-b36ac6705d/node_modules/@parcel/transformer-js/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-js-npm-2.12.0-404d54db18-b9fe4c887b.zip/node_modules/@parcel/transformer-js/",\ "packageDependencies": [\ - ["@parcel/transformer-js", "npm:2.8.3"]\ + ["@parcel/transformer-js", "npm:2.12.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:ae79298a72e3d9363a5f43f0758f258949d82a428fc5aadd2010735eb57aa68b76713869ce052c228d610a7413537515425856a7c357d8a318c5ae937b566246#npm:2.8.3", {\ - "packageLocation": "./.yarn/unplugged/@parcel-transformer-js-virtual-b36ac6705d/node_modules/@parcel/transformer-js/",\ - "packageDependencies": [\ - ["@parcel/transformer-js", "virtual:ae79298a72e3d9363a5f43f0758f258949d82a428fc5aadd2010735eb57aa68b76713869ce052c228d610a7413537515425856a7c357d8a318c5ae937b566246#npm:2.8.3"],\ - ["@parcel/core", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-transformer-js-virtual-567f83ac24/0/cache/@parcel-transformer-js-npm-2.12.0-404d54db18-b9fe4c887b.zip/node_modules/@parcel/transformer-js/",\ + "packageDependencies": [\ + ["@parcel/transformer-js", "virtual:284acdc258f2328e304855ff98dec9e5e8952a2bd7797a2e11c082f6cad2e0d3068e07fb498d46b810d8efae36becee510ac53186a75e438e809dc472f832ab2#npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/utils", "npm:2.8.3"],\ - ["@parcel/workers", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@swc/helpers", "npm:0.4.14"],\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@parcel/workers", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@swc/helpers", "npm:0.5.1"],\ ["@types/parcel__core", null],\ ["browserslist", "npm:4.20.3"],\ - ["detect-libc", "npm:1.0.3"],\ ["nullthrows", "npm:1.1.1"],\ ["regenerator-runtime", "npm:0.13.9"],\ - ["semver", "npm:5.7.1"]\ + ["semver", "npm:7.5.4"]\ ],\ "packagePeers": [\ "@parcel/core",\ @@ -1968,77 +2126,77 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/transformer-json", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-json-npm-2.8.3-fe0a156dc9-04da28b0f0.zip/node_modules/@parcel/transformer-json/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-json-npm-2.12.0-652d8d99d2-a711cb65a8.zip/node_modules/@parcel/transformer-json/",\ "packageDependencies": [\ - ["@parcel/transformer-json", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/transformer-json", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ ["json5", "npm:2.2.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/transformer-postcss", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-postcss-npm-2.8.3-eb5a87320d-2c75cb5cec.zip/node_modules/@parcel/transformer-postcss/",\ - "packageDependencies": [\ - ["@parcel/transformer-postcss", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/hash", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-postcss-npm-2.12.0-f0cfb95fac-b210044a7f.zip/node_modules/@parcel/transformer-postcss/",\ + "packageDependencies": [\ + ["@parcel/transformer-postcss", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["clone", "npm:2.1.2"],\ ["nullthrows", "npm:1.1.1"],\ ["postcss-value-parser", "npm:4.2.0"],\ - ["semver", "npm:5.7.1"]\ + ["semver", "npm:7.5.4"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/transformer-posthtml", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-posthtml-npm-2.8.3-243f774b7a-130c95782a.zip/node_modules/@parcel/transformer-posthtml/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-posthtml-npm-2.12.0-41c570db12-b62582ae7e.zip/node_modules/@parcel/transformer-posthtml/",\ "packageDependencies": [\ - ["@parcel/transformer-posthtml", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/transformer-posthtml", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"],\ ["posthtml", "npm:0.16.6"],\ ["posthtml-parser", "npm:0.10.2"],\ ["posthtml-render", "npm:3.0.0"],\ - ["semver", "npm:5.7.1"]\ + ["semver", "npm:7.5.4"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/transformer-raw", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-raw-npm-2.8.3-766b11ad19-371263bb52.zip/node_modules/@parcel/transformer-raw/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-raw-npm-2.12.0-bd2cb66ddf-de6681e2e7.zip/node_modules/@parcel/transformer-raw/",\ "packageDependencies": [\ - ["@parcel/transformer-raw", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"]\ + ["@parcel/transformer-raw", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/transformer-react-refresh-wrap", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-react-refresh-wrap-npm-2.8.3-bb497d2643-e9648e04b7.zip/node_modules/@parcel/transformer-react-refresh-wrap/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-react-refresh-wrap-npm-2.12.0-59ed68910f-9aba8c1ab0.zip/node_modules/@parcel/transformer-react-refresh-wrap/",\ "packageDependencies": [\ - ["@parcel/transformer-react-refresh-wrap", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/transformer-react-refresh-wrap", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["react-refresh", "npm:0.9.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/transformer-sass", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-sass-npm-2.8.3-6c449bba66-9cb32b3906.zip/node_modules/@parcel/transformer-sass/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-sass-npm-2.12.0-ef787eef35-ce6b4d329b.zip/node_modules/@parcel/transformer-sass/",\ "packageDependencies": [\ - ["@parcel/transformer-sass", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/transformer-sass", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ ["@parcel/source-map", "npm:2.1.1"],\ ["sass", "npm:1.52.1"]\ ],\ @@ -2046,23 +2204,37 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/transformer-svg", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-transformer-svg-npm-2.8.3-b6f4c84f7a-1f3db309e4.zip/node_modules/@parcel/transformer-svg/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-transformer-svg-npm-2.12.0-f41b181676-92b7c65894.zip/node_modules/@parcel/transformer-svg/",\ "packageDependencies": [\ - ["@parcel/transformer-svg", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/hash", "npm:2.8.3"],\ - ["@parcel/plugin", "npm:2.8.3"],\ + ["@parcel/transformer-svg", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/plugin", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ ["nullthrows", "npm:1.1.1"],\ ["posthtml", "npm:0.16.6"],\ ["posthtml-parser", "npm:0.10.2"],\ ["posthtml-render", "npm:3.0.0"],\ - ["semver", "npm:5.7.1"]\ + ["semver", "npm:7.5.4"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@parcel/types", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-types-npm-2.12.0-ffe47febbf-250f95580c.zip/node_modules/@parcel/types/",\ + "packageDependencies": [\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/cache", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/fs", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["@parcel/package-manager", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["@parcel/source-map", "npm:2.1.1"],\ + ["@parcel/workers", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ + ["utility-types", "npm:3.10.0"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:2.6.2", {\ "packageLocation": "./.yarn/cache/@parcel-types-npm-2.6.2-aa1797faca-16f3c3ac36.zip/node_modules/@parcel/types/",\ "packageDependencies": [\ @@ -2076,23 +2248,24 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["utility-types", "npm:3.10.0"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-types-npm-2.8.3-394e8cefff-ece0abdd5c.zip/node_modules/@parcel/types/",\ - "packageDependencies": [\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/cache", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/fs", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["@parcel/package-manager", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["@parcel/source-map", "npm:2.1.1"],\ - ["@parcel/workers", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ - ["utility-types", "npm:3.10.0"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@parcel/utils", [\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-utils-npm-2.12.0-d8a9a48a66-ba80a60fed.zip/node_modules/@parcel/utils/",\ + "packageDependencies": [\ + ["@parcel/utils", "npm:2.12.0"],\ + ["@parcel/codeframe", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/markdown-ansi", "npm:2.12.0"],\ + ["@parcel/rust", "npm:2.12.0"],\ + ["@parcel/source-map", "npm:2.1.1"],\ + ["chalk", "npm:4.1.2"],\ + ["nullthrows", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:2.6.2", {\ "packageLocation": "./.yarn/cache/@parcel-utils-npm-2.6.2-cab87aed21-a74fdca966.zip/node_modules/@parcel/utils/",\ "packageDependencies": [\ @@ -2106,20 +2279,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["chalk", "npm:4.1.2"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-utils-npm-2.8.3-13fd8c7807-69edf3e7c3.zip/node_modules/@parcel/utils/",\ - "packageDependencies": [\ - ["@parcel/utils", "npm:2.8.3"],\ - ["@parcel/codeframe", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/hash", "npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/markdown-ansi", "npm:2.8.3"],\ - ["@parcel/source-map", "npm:2.1.1"],\ - ["chalk", "npm:4.1.2"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@parcel/watcher", [\ @@ -2145,31 +2304,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@parcel/workers", [\ - ["npm:2.6.2", {\ - "packageLocation": "./.yarn/cache/@parcel-workers-npm-2.6.2-a30e38db52-92b65cd3fd.zip/node_modules/@parcel/workers/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/@parcel-workers-npm-2.12.0-3ddd4664bc-e19c3c0a66.zip/node_modules/@parcel/workers/",\ "packageDependencies": [\ - ["@parcel/workers", "npm:2.6.2"]\ + ["@parcel/workers", "npm:2.12.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/@parcel-workers-npm-2.8.3-39050bfde5-e3168b3e9e.zip/node_modules/@parcel/workers/",\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/@parcel-workers-npm-2.6.2-a30e38db52-92b65cd3fd.zip/node_modules/@parcel/workers/",\ "packageDependencies": [\ - ["@parcel/workers", "npm:2.8.3"]\ + ["@parcel/workers", "npm:2.6.2"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-workers-virtual-7a0f9788cf/0/cache/@parcel-workers-npm-2.8.3-39050bfde5-e3168b3e9e.zip/node_modules/@parcel/workers/",\ - "packageDependencies": [\ - ["@parcel/workers", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/core", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-workers-virtual-fbd6240557/0/cache/@parcel-workers-npm-2.12.0-3ddd4664bc-e19c3c0a66.zip/node_modules/@parcel/workers/",\ + "packageDependencies": [\ + ["@parcel/workers", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/profiler", "npm:2.12.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["@types/parcel__core", null],\ - ["chrome-trace-event", "npm:1.0.3"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "packagePeers": [\ @@ -2178,15 +2337,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-workers-virtual-3d95d18f90/0/cache/@parcel-workers-npm-2.8.3-39050bfde5-e3168b3e9e.zip/node_modules/@parcel/workers/",\ + ["virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-workers-virtual-fa9718ade0/0/cache/@parcel-workers-npm-2.6.2-a30e38db52-92b65cd3fd.zip/node_modules/@parcel/workers/",\ "packageDependencies": [\ - ["@parcel/workers", "virtual:394e8cefff652ee5c389cef6b687eba0ec753377aef335050162baee915b4eeae5061f0dbb5f7bea112cdf448a757aaab57dd5dc71f9134498fc561e4f28e220#npm:2.8.3"],\ + ["@parcel/workers", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ ["@parcel/core", "npm:2.6.2"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/types", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["@parcel/diagnostic", "npm:2.6.2"],\ + ["@parcel/logger", "npm:2.6.2"],\ + ["@parcel/types", "npm:2.6.2"],\ + ["@parcel/utils", "npm:2.6.2"],\ ["@types/parcel__core", null],\ ["chrome-trace-event", "npm:1.0.3"],\ ["nullthrows", "npm:1.1.1"]\ @@ -2196,17 +2355,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2", {\ - "packageLocation": "./.yarn/__virtual__/@parcel-workers-virtual-fa9718ade0/0/cache/@parcel-workers-npm-2.6.2-a30e38db52-92b65cd3fd.zip/node_modules/@parcel/workers/",\ + ["virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/@parcel-workers-virtual-0f6ac1cb6e/0/cache/@parcel-workers-npm-2.12.0-3ddd4664bc-e19c3c0a66.zip/node_modules/@parcel/workers/",\ "packageDependencies": [\ - ["@parcel/workers", "virtual:aa1797faca4a934b86d07dfa52e0db4db288b85fed415e745782ef9bd4bd39771970f9017a79cb7ed092d23d2539cea12a1cec949dfa0bb86e0fda2290caa70e#npm:2.6.2"],\ + ["@parcel/workers", "virtual:ffe47febbf7847f9b64454e506be514f3cbd8bbd1821ba64e8e762685b5100c3f7867a926c2aa7f5349f2a1370184e7d2f8f70428bcab9b21701f56d9632c378#npm:2.12.0"],\ ["@parcel/core", "npm:2.6.2"],\ - ["@parcel/diagnostic", "npm:2.6.2"],\ - ["@parcel/logger", "npm:2.6.2"],\ - ["@parcel/types", "npm:2.6.2"],\ - ["@parcel/utils", "npm:2.6.2"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/profiler", "npm:2.12.0"],\ + ["@parcel/types", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["@types/parcel__core", null],\ - ["chrome-trace-event", "npm:1.0.3"],\ ["nullthrows", "npm:1.1.1"]\ ],\ "packagePeers": [\ @@ -2232,26 +2391,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:2.11.7", {\ - "packageLocation": "./.yarn/cache/@popperjs-core-npm-2.11.7-c1bac58243-5b65537478.zip/node_modules/@popperjs/core/",\ + ["npm:2.11.8", {\ + "packageLocation": "./.yarn/cache/@popperjs-core-npm-2.11.8-f1692e11a0-e5c69fdebf.zip/node_modules/@popperjs/core/",\ "packageDependencies": [\ - ["@popperjs/core", "npm:2.11.7"]\ + ["@popperjs/core", "npm:2.11.8"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@rollup/pluginutils", [\ - ["npm:5.0.2", {\ - "packageLocation": "./.yarn/cache/@rollup-pluginutils-npm-5.0.2-6aa9d0ddd4-edea15e543.zip/node_modules/@rollup/pluginutils/",\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-3cc5a6d914.zip/node_modules/@rollup/pluginutils/",\ "packageDependencies": [\ - ["@rollup/pluginutils", "npm:5.0.2"]\ + ["@rollup/pluginutils", "npm:5.1.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.2", {\ - "packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-ca58d3a074/0/cache/@rollup-pluginutils-npm-5.0.2-6aa9d0ddd4-edea15e543.zip/node_modules/@rollup/pluginutils/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.1.0", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-e968017249/0/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-3cc5a6d914.zip/node_modules/@rollup/pluginutils/",\ "packageDependencies": [\ - ["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.2"],\ + ["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.1.0"],\ ["@types/estree", "npm:1.0.0"],\ ["@types/rollup", null],\ ["estree-walker", "npm:2.0.2"],\ @@ -2266,17 +2425,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@sidvind/better-ajv-errors", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip/node_modules/@sidvind/better-ajv-errors/",\ + ["npm:2.1.3", {\ + "packageLocation": "./.yarn/cache/@sidvind-better-ajv-errors-npm-2.1.3-e3d1c524a8-949cb805a1.zip/node_modules/@sidvind/better-ajv-errors/",\ "packageDependencies": [\ - ["@sidvind/better-ajv-errors", "npm:2.0.0"]\ + ["@sidvind/better-ajv-errors", "npm:2.1.3"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:681f166fa525f4703ee9c1e8e4559a36bfdac9fdcbccdfeb239624a192c2aaee56211c254f7093e696cd71a2eaed6484d2ba2bb9ec45b8d53cb66b299a635a53#npm:2.0.0", {\ - "packageLocation": "./.yarn/__virtual__/@sidvind-better-ajv-errors-virtual-2b217b84ce/0/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip/node_modules/@sidvind/better-ajv-errors/",\ + ["virtual:640261ed3b7a9880a388cc504caacf8ea790dd52f1cb31fbc3be445cb2adc6e73fc87097de620863105eb917510145ef2457d30000c7361456ab67ec0b895136#npm:2.1.3", {\ + "packageLocation": "./.yarn/__virtual__/@sidvind-better-ajv-errors-virtual-ff98ba00e3/0/cache/@sidvind-better-ajv-errors-npm-2.1.3-e3d1c524a8-949cb805a1.zip/node_modules/@sidvind/better-ajv-errors/",\ "packageDependencies": [\ - ["@sidvind/better-ajv-errors", "virtual:681f166fa525f4703ee9c1e8e4559a36bfdac9fdcbccdfeb239624a192c2aaee56211c254f7093e696cd71a2eaed6484d2ba2bb9ec45b8d53cb66b299a635a53#npm:2.0.0"],\ + ["@sidvind/better-ajv-errors", "virtual:640261ed3b7a9880a388cc504caacf8ea790dd52f1cb31fbc3be445cb2adc6e73fc87097de620863105eb917510145ef2457d30000c7361456ab67ec0b895136#npm:2.1.3"],\ ["@babel/code-frame", "npm:7.16.7"],\ ["@types/ajv", null],\ ["ajv", "npm:8.11.0"],\ @@ -2289,11 +2448,133 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@swc/core", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-virtual-8fda1c3f9b/node_modules/@swc/core/",\ + "packageDependencies": [\ + ["@swc/core", "npm:1.3.62"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5f8211ac5fe0096c8679c8fc747f0917af84ce168460ce1b592cb42613ababf55139691f5b329cd10e1e2b99af39861401c7b9633ed396447c506b02a80144b0#npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-virtual-8fda1c3f9b/node_modules/@swc/core/",\ + "packageDependencies": [\ + ["@swc/core", "virtual:5f8211ac5fe0096c8679c8fc747f0917af84ce168460ce1b592cb42613ababf55139691f5b329cd10e1e2b99af39861401c7b9633ed396447c506b02a80144b0#npm:1.3.62"],\ + ["@swc/core-darwin-arm64", "npm:1.3.62"],\ + ["@swc/core-darwin-x64", "npm:1.3.62"],\ + ["@swc/core-linux-arm-gnueabihf", "npm:1.3.62"],\ + ["@swc/core-linux-arm64-gnu", "npm:1.3.62"],\ + ["@swc/core-linux-arm64-musl", "npm:1.3.62"],\ + ["@swc/core-linux-x64-gnu", "npm:1.3.62"],\ + ["@swc/core-linux-x64-musl", "npm:1.3.62"],\ + ["@swc/core-win32-arm64-msvc", "npm:1.3.62"],\ + ["@swc/core-win32-ia32-msvc", "npm:1.3.62"],\ + ["@swc/core-win32-x64-msvc", "npm:1.3.62"],\ + ["@swc/helpers", null],\ + ["@types/swc__helpers", null]\ + ],\ + "packagePeers": [\ + "@swc/helpers",\ + "@types/swc__helpers"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-darwin-arm64", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-darwin-arm64-npm-1.3.62-b4af5d9b32/node_modules/@swc/core-darwin-arm64/",\ + "packageDependencies": [\ + ["@swc/core-darwin-arm64", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-darwin-x64", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-darwin-x64-npm-1.3.62-7d7bc99502/node_modules/@swc/core-darwin-x64/",\ + "packageDependencies": [\ + ["@swc/core-darwin-x64", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-linux-arm-gnueabihf", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-linux-arm-gnueabihf-npm-1.3.62-2528581a9c/node_modules/@swc/core-linux-arm-gnueabihf/",\ + "packageDependencies": [\ + ["@swc/core-linux-arm-gnueabihf", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-linux-arm64-gnu", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-linux-arm64-gnu-npm-1.3.62-7b527a3356/node_modules/@swc/core-linux-arm64-gnu/",\ + "packageDependencies": [\ + ["@swc/core-linux-arm64-gnu", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-linux-arm64-musl", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-linux-arm64-musl-npm-1.3.62-5faf35783f/node_modules/@swc/core-linux-arm64-musl/",\ + "packageDependencies": [\ + ["@swc/core-linux-arm64-musl", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-linux-x64-gnu", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-linux-x64-gnu-npm-1.3.62-1fc43a8907/node_modules/@swc/core-linux-x64-gnu/",\ + "packageDependencies": [\ + ["@swc/core-linux-x64-gnu", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-linux-x64-musl", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-linux-x64-musl-npm-1.3.62-ffabf9bf27/node_modules/@swc/core-linux-x64-musl/",\ + "packageDependencies": [\ + ["@swc/core-linux-x64-musl", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-win32-arm64-msvc", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-win32-arm64-msvc-npm-1.3.62-f4199145ca/node_modules/@swc/core-win32-arm64-msvc/",\ + "packageDependencies": [\ + ["@swc/core-win32-arm64-msvc", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-win32-ia32-msvc", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-win32-ia32-msvc-npm-1.3.62-56dc98262c/node_modules/@swc/core-win32-ia32-msvc/",\ + "packageDependencies": [\ + ["@swc/core-win32-ia32-msvc", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@swc/core-win32-x64-msvc", [\ + ["npm:1.3.62", {\ + "packageLocation": "./.yarn/unplugged/@swc-core-win32-x64-msvc-npm-1.3.62-200450bac0/node_modules/@swc/core-win32-x64-msvc/",\ + "packageDependencies": [\ + ["@swc/core-win32-x64-msvc", "npm:1.3.62"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@swc/helpers", [\ - ["npm:0.4.14", {\ - "packageLocation": "./.yarn/cache/@swc-helpers-npm-0.4.14-f806c3fb16-273fd3f3fc.zip/node_modules/@swc/helpers/",\ + ["npm:0.5.1", {\ + "packageLocation": "./.yarn/cache/@swc-helpers-npm-0.5.1-424376f311-71e0e27234.zip/node_modules/@swc/helpers/",\ "packageDependencies": [\ - ["@swc/helpers", "npm:0.4.14"],\ + ["@swc/helpers", "npm:0.5.1"],\ ["tslib", "npm:2.4.0"]\ ],\ "linkType": "HARD"\ @@ -2344,17 +2625,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@types/jest", [\ - ["npm:27.4.1", {\ - "packageLocation": "./.yarn/cache/@types-jest-npm-27.4.1-31d07cd0d8-5184f3eef4.zip/node_modules/@types/jest/",\ - "packageDependencies": [\ - ["@types/jest", "npm:27.4.1"],\ - ["jest-matcher-utils", "npm:27.5.1"],\ - ["pretty-format", "npm:27.5.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@types/json5", [\ ["npm:0.0.29", {\ "packageLocation": "./.yarn/cache/@types-json5-npm-0.0.29-f63a7916bd-e60b153664.zip/node_modules/@types/json5/",\ @@ -2365,10 +2635,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@types/katex", [\ - ["npm:0.14.0", {\ - "packageLocation": "./.yarn/cache/@types-katex-npm-0.14.0-acd5bc3e87-330e0d0337.zip/node_modules/@types/katex/",\ + ["npm:0.16.5", {\ + "packageLocation": "./.yarn/cache/@types-katex-npm-0.16.5-ff9336f176-a1ce22cd87.zip/node_modules/@types/katex/",\ "packageDependencies": [\ - ["@types/katex", "npm:0.14.0"]\ + ["@types/katex", "npm:0.16.5"]\ ],\ "linkType": "HARD"\ }]\ @@ -2380,13 +2650,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/lodash", "npm:4.14.182"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.14.200", {\ + "packageLocation": "./.yarn/cache/@types-lodash-npm-4.14.200-8559f51fce-6471f8bb5d.zip/node_modules/@types/lodash/",\ + "packageDependencies": [\ + ["@types/lodash", "npm:4.14.200"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@types/lodash-es", [\ - ["npm:4.17.6", {\ - "packageLocation": "./.yarn/cache/@types-lodash-es-npm-4.17.6-fd5abbdc74-9bd239dd52.zip/node_modules/@types/lodash-es/",\ + ["npm:4.17.10", {\ + "packageLocation": "./.yarn/cache/@types-lodash-es-npm-4.17.10-a7dae21818-129e9dde83.zip/node_modules/@types/lodash-es/",\ "packageDependencies": [\ - ["@types/lodash-es", "npm:4.17.6"],\ + ["@types/lodash-es", "npm:4.17.10"],\ ["@types/lodash", "npm:4.14.182"]\ ],\ "linkType": "HARD"\ @@ -2410,22 +2687,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@ungap/structured-clone", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/@ungap-structured-clone-npm-1.2.0-648f0b82e0-4f656b7b46.zip/node_modules/@ungap/structured-clone/",\ + "packageDependencies": [\ + ["@ungap/structured-clone", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@vitejs/plugin-vue", [\ - ["npm:4.2.1", {\ - "packageLocation": "./.yarn/cache/@vitejs-plugin-vue-npm-4.2.1-2b331ccfdc-a7266a4537.zip/node_modules/@vitejs/plugin-vue/",\ + ["npm:4.6.2", {\ + "packageLocation": "./.yarn/cache/@vitejs-plugin-vue-npm-4.6.2-d7ace53203-01bc4ed643.zip/node_modules/@vitejs/plugin-vue/",\ "packageDependencies": [\ - ["@vitejs/plugin-vue", "npm:4.2.1"]\ + ["@vitejs/plugin-vue", "npm:4.6.2"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.1", {\ - "packageLocation": "./.yarn/__virtual__/@vitejs-plugin-vue-virtual-68094506b2/0/cache/@vitejs-plugin-vue-npm-4.2.1-2b331ccfdc-a7266a4537.zip/node_modules/@vitejs/plugin-vue/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.6.2", {\ + "packageLocation": "./.yarn/__virtual__/@vitejs-plugin-vue-virtual-090b584a9c/0/cache/@vitejs-plugin-vue-npm-4.6.2-d7ace53203-01bc4ed643.zip/node_modules/@vitejs/plugin-vue/",\ "packageDependencies": [\ - ["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.1"],\ + ["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.6.2"],\ ["@types/vite", null],\ ["@types/vue", null],\ - ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.4"],\ - ["vue", "npm:3.2.47"]\ + ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3"],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vite",\ @@ -2436,139 +2722,178 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@volar/language-core", [\ + ["npm:2.1.4", {\ + "packageLocation": "./.yarn/cache/@volar-language-core-npm-2.1.4-18ee1a037d-7430f65143.zip/node_modules/@volar/language-core/",\ + "packageDependencies": [\ + ["@volar/language-core", "npm:2.1.4"],\ + ["@volar/source-map", "npm:2.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@volar/language-service", [\ + ["npm:2.1.4", {\ + "packageLocation": "./.yarn/cache/@volar-language-service-npm-2.1.4-2d34cb628f-06cdcfacf0.zip/node_modules/@volar/language-service/",\ + "packageDependencies": [\ + ["@volar/language-service", "npm:2.1.4"],\ + ["@volar/language-core", "npm:2.1.4"],\ + ["vscode-languageserver-protocol", "npm:3.17.5"],\ + ["vscode-languageserver-textdocument", "npm:1.0.11"],\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@volar/source-map", [\ + ["npm:2.1.4", {\ + "packageLocation": "./.yarn/cache/@volar-source-map-npm-2.1.4-5963b1701f-e2f65bcfd6.zip/node_modules/@volar/source-map/",\ + "packageDependencies": [\ + ["@volar/source-map", "npm:2.1.4"],\ + ["muggle-string", "npm:0.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@vscode/l10n", [\ + ["npm:0.0.18", {\ + "packageLocation": "./.yarn/cache/@vscode-l10n-npm-0.0.18-8a12efe4b5-c33876cebd.zip/node_modules/@vscode/l10n/",\ + "packageDependencies": [\ + ["@vscode/l10n", "npm:0.0.18"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@vue/compiler-core", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-compiler-core-npm-3.2.47-bb08feddfe-9ccc2a0b89.zip/node_modules/@vue/compiler-core/",\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-compiler-core-npm-3.4.21-ec7f24d7f5-0d6b7732bc.zip/node_modules/@vue/compiler-core/",\ "packageDependencies": [\ - ["@vue/compiler-core", "npm:3.2.47"],\ - ["@babel/parser", "npm:7.18.4"],\ - ["@vue/shared", "npm:3.2.47"],\ + ["@vue/compiler-core", "npm:3.4.21"],\ + ["@babel/parser", "npm:7.23.9"],\ + ["@vue/shared", "npm:3.4.21"],\ + ["entities", "npm:4.5.0"],\ ["estree-walker", "npm:2.0.2"],\ - ["source-map", "npm:0.6.1"]\ + ["source-map-js", "npm:1.0.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@vue/compiler-dom", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-compiler-dom-npm-3.2.47-a1a6348264-1eced735f8.zip/node_modules/@vue/compiler-dom/",\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-compiler-dom-npm-3.4.21-3d49f99020-f53e4f4e0a.zip/node_modules/@vue/compiler-dom/",\ "packageDependencies": [\ - ["@vue/compiler-dom", "npm:3.2.47"],\ - ["@vue/compiler-core", "npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"]\ + ["@vue/compiler-dom", "npm:3.4.21"],\ + ["@vue/compiler-core", "npm:3.4.21"],\ + ["@vue/shared", "npm:3.4.21"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@vue/compiler-sfc", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-compiler-sfc-npm-3.2.47-d9eca6b75b-4588a51331.zip/node_modules/@vue/compiler-sfc/",\ - "packageDependencies": [\ - ["@vue/compiler-sfc", "npm:3.2.47"],\ - ["@babel/parser", "npm:7.18.4"],\ - ["@vue/compiler-core", "npm:3.2.47"],\ - ["@vue/compiler-dom", "npm:3.2.47"],\ - ["@vue/compiler-ssr", "npm:3.2.47"],\ - ["@vue/reactivity-transform", "npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"],\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-compiler-sfc-npm-3.4.21-c2b76ee1ff-226dc404be.zip/node_modules/@vue/compiler-sfc/",\ + "packageDependencies": [\ + ["@vue/compiler-sfc", "npm:3.4.21"],\ + ["@babel/parser", "npm:7.23.9"],\ + ["@vue/compiler-core", "npm:3.4.21"],\ + ["@vue/compiler-dom", "npm:3.4.21"],\ + ["@vue/compiler-ssr", "npm:3.4.21"],\ + ["@vue/shared", "npm:3.4.21"],\ ["estree-walker", "npm:2.0.2"],\ - ["magic-string", "npm:0.25.9"],\ - ["postcss", "npm:8.4.12"],\ - ["source-map", "npm:0.6.1"]\ + ["magic-string", "npm:0.30.7"],\ + ["postcss", "npm:8.4.35"],\ + ["source-map-js", "npm:1.0.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@vue/compiler-ssr", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-compiler-ssr-npm-3.2.47-c46fb0bb52-91bc6e4674.zip/node_modules/@vue/compiler-ssr/",\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-compiler-ssr-npm-3.4.21-e6f043341e-c510bee68b.zip/node_modules/@vue/compiler-ssr/",\ "packageDependencies": [\ - ["@vue/compiler-ssr", "npm:3.2.47"],\ - ["@vue/compiler-dom", "npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"]\ + ["@vue/compiler-ssr", "npm:3.4.21"],\ + ["@vue/compiler-dom", "npm:3.4.21"],\ + ["@vue/shared", "npm:3.4.21"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@vue/devtools-api", [\ - ["npm:6.4.5", {\ - "packageLocation": "./.yarn/cache/@vue-devtools-api-npm-6.4.5-bcd56e5fec-40c5adc878.zip/node_modules/@vue/devtools-api/",\ + ["npm:6.5.0", {\ + "packageLocation": "./.yarn/cache/@vue-devtools-api-npm-6.5.0-0dc0468299-ec819ef3a4.zip/node_modules/@vue/devtools-api/",\ "packageDependencies": [\ - ["@vue/devtools-api", "npm:6.4.5"]\ + ["@vue/devtools-api", "npm:6.5.0"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:6.5.0", {\ - "packageLocation": "./.yarn/cache/@vue-devtools-api-npm-6.5.0-0dc0468299-ec819ef3a4.zip/node_modules/@vue/devtools-api/",\ + ["npm:6.6.1", {\ + "packageLocation": "./.yarn/cache/@vue-devtools-api-npm-6.6.1-ef3c82703e-cf12b5ebcc.zip/node_modules/@vue/devtools-api/",\ "packageDependencies": [\ - ["@vue/devtools-api", "npm:6.5.0"]\ + ["@vue/devtools-api", "npm:6.6.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ - ["@vue/reactivity", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-reactivity-npm-3.2.47-1182f7aa47-bd61134e4b.zip/node_modules/@vue/reactivity/",\ + ["@vue/language-plugin-pug", [\ + ["npm:2.0.7", {\ + "packageLocation": "./.yarn/cache/@vue-language-plugin-pug-npm-2.0.7-547300c7e0-11cc96eb5f.zip/node_modules/@vue/language-plugin-pug/",\ "packageDependencies": [\ - ["@vue/reactivity", "npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"]\ + ["@vue/language-plugin-pug", "npm:2.0.7"],\ + ["@volar/source-map", "npm:2.1.4"],\ + ["volar-service-pug", "npm:0.0.34"]\ ],\ "linkType": "HARD"\ }]\ ]],\ - ["@vue/reactivity-transform", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-reactivity-transform-npm-3.2.47-89701a53ab-6fe54374aa.zip/node_modules/@vue/reactivity-transform/",\ + ["@vue/reactivity", [\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-reactivity-npm-3.4.21-fd3e254d08-79c7ebe3ec.zip/node_modules/@vue/reactivity/",\ "packageDependencies": [\ - ["@vue/reactivity-transform", "npm:3.2.47"],\ - ["@babel/parser", "npm:7.18.4"],\ - ["@vue/compiler-core", "npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"],\ - ["estree-walker", "npm:2.0.2"],\ - ["magic-string", "npm:0.25.9"]\ + ["@vue/reactivity", "npm:3.4.21"],\ + ["@vue/shared", "npm:3.4.21"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@vue/runtime-core", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-runtime-core-npm-3.2.47-d5ec5c27c7-56fd41368c.zip/node_modules/@vue/runtime-core/",\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-runtime-core-npm-3.4.21-7bf985040b-4eb9b5d91f.zip/node_modules/@vue/runtime-core/",\ "packageDependencies": [\ - ["@vue/runtime-core", "npm:3.2.47"],\ - ["@vue/reactivity", "npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"]\ + ["@vue/runtime-core", "npm:3.4.21"],\ + ["@vue/reactivity", "npm:3.4.21"],\ + ["@vue/shared", "npm:3.4.21"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@vue/runtime-dom", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-runtime-dom-npm-3.2.47-da74228cd1-8987d72761.zip/node_modules/@vue/runtime-dom/",\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-runtime-dom-npm-3.4.21-40f99cf9a2-ebfdaa081f.zip/node_modules/@vue/runtime-dom/",\ "packageDependencies": [\ - ["@vue/runtime-dom", "npm:3.2.47"],\ - ["@vue/runtime-core", "npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"],\ - ["csstype", "npm:2.6.20"]\ + ["@vue/runtime-dom", "npm:3.4.21"],\ + ["@vue/runtime-core", "npm:3.4.21"],\ + ["@vue/shared", "npm:3.4.21"],\ + ["csstype", "npm:3.1.3"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@vue/server-renderer", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-server-renderer-npm-3.2.47-b845561a5d-482fe3c9bb.zip/node_modules/@vue/server-renderer/",\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-server-renderer-npm-3.4.21-bf6b2daebb-faa3dc4876.zip/node_modules/@vue/server-renderer/",\ "packageDependencies": [\ - ["@vue/server-renderer", "npm:3.2.47"]\ + ["@vue/server-renderer", "npm:3.4.21"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:487db916e160a571ff50687ed972004ec0078aa76b7fedf7bdabfd607dfed3ba7b2d1f51e99387f885501b4dbb11471c0ce20d647adb7ae38656bbc259642ae8#npm:3.2.47", {\ - "packageLocation": "./.yarn/__virtual__/@vue-server-renderer-virtual-7de059ee50/0/cache/@vue-server-renderer-npm-3.2.47-b845561a5d-482fe3c9bb.zip/node_modules/@vue/server-renderer/",\ + ["virtual:b79af6274dddda2b283f42be2b827e30c3e5389bce2938ee73bdb74ee9781811fc079c6836719e57940708d59b3beeb14d9e3c12f37f2d22582a53e6c32e4c97#npm:3.4.21", {\ + "packageLocation": "./.yarn/__virtual__/@vue-server-renderer-virtual-4c61378d94/0/cache/@vue-server-renderer-npm-3.4.21-bf6b2daebb-faa3dc4876.zip/node_modules/@vue/server-renderer/",\ "packageDependencies": [\ - ["@vue/server-renderer", "virtual:487db916e160a571ff50687ed972004ec0078aa76b7fedf7bdabfd607dfed3ba7b2d1f51e99387f885501b4dbb11471c0ce20d647adb7ae38656bbc259642ae8#npm:3.2.47"],\ + ["@vue/server-renderer", "virtual:b79af6274dddda2b283f42be2b827e30c3e5389bce2938ee73bdb74ee9781811fc079c6836719e57940708d59b3beeb14d9e3c12f37f2d22582a53e6c32e4c97#npm:3.4.21"],\ ["@types/vue", null],\ - ["@vue/compiler-ssr", "npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"],\ - ["vue", "npm:3.2.47"]\ + ["@vue/compiler-ssr", "npm:3.4.21"],\ + ["@vue/shared", "npm:3.4.21"],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -2578,10 +2903,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@vue/shared", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/@vue-shared-npm-3.2.47-efa4e85dc8-0aa711dc91.zip/node_modules/@vue/shared/",\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/@vue-shared-npm-3.4.21-2aee4ae0bc-5f30a40891.zip/node_modules/@vue/shared/",\ "packageDependencies": [\ - ["@vue/shared", "npm:3.2.47"]\ + ["@vue/shared", "npm:3.4.21"]\ ],\ "linkType": "HARD"\ }]\ @@ -2612,17 +2937,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:8.7.1", {\ - "packageLocation": "./.yarn/cache/acorn-npm-8.7.1-7c7a019990-aca0aabf98.zip/node_modules/acorn/",\ + ["npm:8.10.0", {\ + "packageLocation": "./.yarn/cache/acorn-npm-8.10.0-2230c9e83e-538ba38af0.zip/node_modules/acorn/",\ "packageDependencies": [\ - ["acorn", "npm:8.7.1"]\ + ["acorn", "npm:8.10.0"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:8.8.0", {\ - "packageLocation": "./.yarn/cache/acorn-npm-8.8.0-9ef399ab45-7270ca82b2.zip/node_modules/acorn/",\ + ["npm:8.7.1", {\ + "packageLocation": "./.yarn/cache/acorn-npm-8.7.1-7c7a019990-aca0aabf98.zip/node_modules/acorn/",\ "packageDependencies": [\ - ["acorn", "npm:8.8.0"]\ + ["acorn", "npm:8.7.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -2635,12 +2960,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:057dc7b3c1f6024b5a316c7e5d452c8397d903f7ff9736e8d71b89efc60141dc4c8c777c0c1057fa0d3bf0d3dd59eec8694b4efb6f0fb20c747ec060bab7195d#npm:5.3.2", {\ - "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-232e493aa9/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip/node_modules/acorn-jsx/",\ + ["virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2", {\ + "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-834321b202/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip/node_modules/acorn-jsx/",\ "packageDependencies": [\ - ["acorn-jsx", "virtual:057dc7b3c1f6024b5a316c7e5d452c8397d903f7ff9736e8d71b89efc60141dc4c8c777c0c1057fa0d3bf0d3dd59eec8694b4efb6f0fb20c747ec060bab7195d#npm:5.3.2"],\ + ["acorn-jsx", "virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2"],\ ["@types/acorn", null],\ - ["acorn", "npm:8.8.0"]\ + ["acorn", "npm:8.10.0"]\ ],\ "packagePeers": [\ "@types/acorn",\ @@ -2662,15 +2987,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["acorn-walk", [\ - ["npm:8.2.0", {\ - "packageLocation": "./.yarn/cache/acorn-walk-npm-8.2.0-2f2cac3177-1715e76c01.zip/node_modules/acorn-walk/",\ - "packageDependencies": [\ - ["acorn-walk", "npm:8.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["agent-base", [\ ["npm:6.0.2", {\ "packageLocation": "./.yarn/cache/agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip/node_modules/agent-base/",\ @@ -2761,13 +3077,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:5.2.0", {\ - "packageLocation": "./.yarn/cache/ansi-styles-npm-5.2.0-72fc7003e3-d7f4e97ce0.zip/node_modules/ansi-styles/",\ - "packageDependencies": [\ - ["ansi-styles", "npm:5.2.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:6.2.1", {\ "packageLocation": "./.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip/node_modules/ansi-styles/",\ "packageDependencies": [\ @@ -2816,46 +3125,87 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["array-buffer-byte-length", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/array-buffer-byte-length-npm-1.0.0-331671f28a-044e101ce1.zip/node_modules/array-buffer-byte-length/",\ + "packageDependencies": [\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.2"],\ + ["is-array-buffer", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["array-includes", [\ - ["npm:3.1.6", {\ - "packageLocation": "./.yarn/cache/array-includes-npm-3.1.6-d0ff9d248b-f22f8cd8ba.zip/node_modules/array-includes/",\ + ["npm:3.1.7", {\ + "packageLocation": "./.yarn/cache/array-includes-npm-3.1.7-d32a5ee179-06f9e4598f.zip/node_modules/array-includes/",\ "packageDependencies": [\ - ["array-includes", "npm:3.1.6"],\ + ["array-includes", "npm:3.1.7"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.4"],\ - ["es-abstract", "npm:1.21.1"],\ - ["get-intrinsic", "npm:1.2.0"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.1"],\ ["is-string", "npm:1.0.7"]\ ],\ "linkType": "HARD"\ }]\ ]],\ + ["array.prototype.findlastindex", [\ + ["npm:1.2.3", {\ + "packageLocation": "./.yarn/cache/array.prototype.findlastindex-npm-1.2.3-2a36f4417b-31f35d7b37.zip/node_modules/array.prototype.findlastindex/",\ + "packageDependencies": [\ + ["array.prototype.findlastindex", "npm:1.2.3"],\ + ["call-bind", "npm:1.0.2"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"],\ + ["es-shim-unscopables", "npm:1.0.0"],\ + ["get-intrinsic", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["array.prototype.flat", [\ - ["npm:1.3.1", {\ - "packageLocation": "./.yarn/cache/array.prototype.flat-npm-1.3.1-e9a9e389c0-5a8415949d.zip/node_modules/array.prototype.flat/",\ + ["npm:1.3.2", {\ + "packageLocation": "./.yarn/cache/array.prototype.flat-npm-1.3.2-350729f7f4-5d6b4bf102.zip/node_modules/array.prototype.flat/",\ "packageDependencies": [\ - ["array.prototype.flat", "npm:1.3.1"],\ + ["array.prototype.flat", "npm:1.3.2"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.4"],\ - ["es-abstract", "npm:1.21.1"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"],\ ["es-shim-unscopables", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["array.prototype.flatmap", [\ - ["npm:1.3.1", {\ - "packageLocation": "./.yarn/cache/array.prototype.flatmap-npm-1.3.1-c65186ca34-8c1c43a499.zip/node_modules/array.prototype.flatmap/",\ + ["npm:1.3.2", {\ + "packageLocation": "./.yarn/cache/array.prototype.flatmap-npm-1.3.2-5c6a4af226-ce09fe21dc.zip/node_modules/array.prototype.flatmap/",\ "packageDependencies": [\ - ["array.prototype.flatmap", "npm:1.3.1"],\ + ["array.prototype.flatmap", "npm:1.3.2"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.4"],\ - ["es-abstract", "npm:1.21.1"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"],\ ["es-shim-unscopables", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ + ["arraybuffer.prototype.slice", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/arraybuffer.prototype.slice-npm-1.0.2-4eda52ad8c-c200faf437.zip/node_modules/arraybuffer.prototype.slice/",\ + "packageDependencies": [\ + ["arraybuffer.prototype.slice", "npm:1.0.2"],\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.2"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.1"],\ + ["is-array-buffer", "npm:3.0.2"],\ + ["is-shared-array-buffer", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["asap", [\ ["npm:2.0.6", {\ "packageLocation": "./.yarn/cache/asap-npm-2.0.6-36714d439d-b296c92c4b.zip/node_modules/asap/",\ @@ -2875,10 +3225,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["async-validator", [\ - ["npm:4.1.1", {\ - "packageLocation": "./.yarn/cache/async-validator-npm-4.1.1-470b8d5b59-88590ab8ad.zip/node_modules/async-validator/",\ + ["npm:4.2.5", {\ + "packageLocation": "./.yarn/cache/async-validator-npm-4.2.5-4d61110c66-3e3d891a2e.zip/node_modules/async-validator/",\ "packageDependencies": [\ - ["async-validator", "npm:4.1.1"]\ + ["async-validator", "npm:4.2.5"]\ ],\ "linkType": "HARD"\ }]\ @@ -2947,10 +3297,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["npm:5.2.3", {\ - "packageLocation": "./.yarn/cache/bootstrap-npm-5.2.3-7458283a23-0211805dec.zip/node_modules/bootstrap/",\ + ["npm:5.3.3", {\ + "packageLocation": "./.yarn/cache/bootstrap-npm-5.3.3-da08e2f0fe-537b68db30.zip/node_modules/bootstrap/",\ "packageDependencies": [\ - ["bootstrap", "npm:5.2.3"]\ + ["bootstrap", "npm:5.3.3"]\ ],\ "linkType": "SOFT"\ }],\ @@ -2967,11 +3317,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.2.3", {\ - "packageLocation": "./.yarn/__virtual__/bootstrap-virtual-c4952ffff0/0/cache/bootstrap-npm-5.2.3-7458283a23-0211805dec.zip/node_modules/bootstrap/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.3", {\ + "packageLocation": "./.yarn/__virtual__/bootstrap-virtual-2c24090b13/0/cache/bootstrap-npm-5.3.3-da08e2f0fe-537b68db30.zip/node_modules/bootstrap/",\ "packageDependencies": [\ - ["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.2.3"],\ - ["@popperjs/core", "npm:2.11.7"],\ + ["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.3"],\ + ["@popperjs/core", "npm:2.11.8"],\ ["@types/popperjs__core", null]\ ],\ "packagePeers": [\ @@ -2982,10 +3332,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["bootstrap-icons", [\ - ["npm:1.10.5", {\ - "packageLocation": "./.yarn/cache/bootstrap-icons-npm-1.10.5-36f80ab074-8a0cfbd237.zip/node_modules/bootstrap-icons/",\ + ["npm:1.11.3", {\ + "packageLocation": "./.yarn/cache/bootstrap-icons-npm-1.11.3-8d5387bef2-d5cdb90fe3.zip/node_modules/bootstrap-icons/",\ "packageDependencies": [\ - ["bootstrap-icons", "npm:1.10.5"]\ + ["bootstrap-icons", "npm:1.11.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -3020,10 +3370,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["browser-fs-access", [\ - ["npm:0.33.1", {\ - "packageLocation": "./.yarn/cache/browser-fs-access-npm-0.33.1-1af7eeff22-2fb595c2d2.zip/node_modules/browser-fs-access/",\ + ["npm:0.35.0", {\ + "packageLocation": "./.yarn/cache/browser-fs-access-npm-0.35.0-1577b5a7ba-5f3bf1ec17.zip/node_modules/browser-fs-access/",\ "packageDependencies": [\ - ["browser-fs-access", "npm:0.33.1"]\ + ["browser-fs-access", "npm:0.35.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -3052,11 +3402,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["buffer-from", [\ - ["npm:1.1.2", {\ - "packageLocation": "./.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip/node_modules/buffer-from/",\ + ["builtin-modules", [\ + ["npm:3.3.0", {\ + "packageLocation": "./.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip/node_modules/builtin-modules/",\ "packageDependencies": [\ - ["buffer-from", "npm:1.1.2"]\ + ["builtin-modules", "npm:3.3.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -3072,22 +3422,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["c8", [\ - ["npm:7.13.0", {\ - "packageLocation": "./.yarn/cache/c8-npm-7.13.0-9ac8f17e2c-491abf4cf3.zip/node_modules/c8/",\ + ["npm:9.1.0", {\ + "packageLocation": "./.yarn/cache/c8-npm-9.1.0-92c3d37f46-c5249bf9c3.zip/node_modules/c8/",\ "packageDependencies": [\ - ["c8", "npm:7.13.0"],\ + ["c8", "npm:9.1.0"],\ ["@bcoe/v8-coverage", "npm:0.2.3"],\ ["@istanbuljs/schema", "npm:0.1.3"],\ ["find-up", "npm:5.0.0"],\ - ["foreground-child", "npm:2.0.0"],\ + ["foreground-child", "npm:3.1.1"],\ ["istanbul-lib-coverage", "npm:3.2.0"],\ - ["istanbul-lib-report", "npm:3.0.0"],\ - ["istanbul-reports", "npm:3.1.4"],\ - ["rimraf", "npm:3.0.2"],\ + ["istanbul-lib-report", "npm:3.0.1"],\ + ["istanbul-reports", "npm:3.1.6"],\ ["test-exclude", "npm:6.0.0"],\ ["v8-to-istanbul", "npm:9.0.1"],\ - ["yargs", "npm:16.2.0"],\ - ["yargs-parser", "npm:20.2.9"]\ + ["yargs", "npm:17.7.2"],\ + ["yargs-parser", "npm:21.1.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -3128,6 +3477,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["get-intrinsic", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/call-bind-npm-1.0.5-65600fae47-449e83ecbd.zip/node_modules/call-bind/",\ + "packageDependencies": [\ + ["call-bind", "npm:1.0.5"],\ + ["function-bind", "npm:1.1.2"],\ + ["get-intrinsic", "npm:1.2.1"],\ + ["set-function-length", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["callsites", [\ @@ -3147,10 +3506,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:1.0.30001481", {\ - "packageLocation": "./.yarn/cache/caniuse-lite-npm-1.0.30001481-cd8272ecaa-8200a043c1.zip/node_modules/caniuse-lite/",\ + ["npm:1.0.30001603", {\ + "packageLocation": "./.yarn/cache/caniuse-lite-npm-1.0.30001603-77af81f60b-e66e0d24b8.zip/node_modules/caniuse-lite/",\ "packageDependencies": [\ - ["caniuse-lite", "npm:1.0.30001481"]\ + ["caniuse-lite", "npm:1.0.30001603"]\ ],\ "linkType": "HARD"\ }]\ @@ -3231,10 +3590,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["cliui", [\ - ["npm:7.0.4", {\ - "packageLocation": "./.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip/node_modules/cliui/",\ + ["npm:8.0.1", {\ + "packageLocation": "./.yarn/cache/cliui-npm-8.0.1-3b029092cf-79648b3b00.zip/node_modules/cliui/",\ "packageDependencies": [\ - ["cliui", "npm:7.0.4"],\ + ["cliui", "npm:8.0.1"],\ ["string-width", "npm:4.2.3"],\ ["strip-ansi", "npm:6.0.1"],\ ["wrap-ansi", "npm:7.0.0"]\ @@ -3295,13 +3654,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["commander", [\ - ["npm:2.20.3", {\ - "packageLocation": "./.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip/node_modules/commander/",\ - "packageDependencies": [\ - ["commander", "npm:2.20.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.2.0", {\ "packageLocation": "./.yarn/cache/commander-npm-7.2.0-19178180f8-53501cbeee.zip/node_modules/commander/",\ "packageDependencies": [\ @@ -3385,6 +3737,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["csstype", "npm:3.0.11"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:0.15.12", {\ + "packageLocation": "./.yarn/cache/css-render-npm-0.15.12-ff93ab2bdd-80265c5055.zip/node_modules/css-render/",\ + "packageDependencies": [\ + ["css-render", "npm:0.15.12"],\ + ["@emotion/hash", "npm:0.8.0"],\ + ["csstype", "npm:3.0.11"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["css-select", [\ @@ -3441,26 +3802,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["csstype", [\ - ["npm:2.6.20", {\ - "packageLocation": "./.yarn/cache/csstype-npm-2.6.20-7c929732a1-cb5d5ded49.zip/node_modules/csstype/",\ + ["npm:3.0.11", {\ + "packageLocation": "./.yarn/cache/csstype-npm-3.0.11-b49897178d-95e56abfe9.zip/node_modules/csstype/",\ "packageDependencies": [\ - ["csstype", "npm:2.6.20"]\ + ["csstype", "npm:3.0.11"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:3.0.11", {\ - "packageLocation": "./.yarn/cache/csstype-npm-3.0.11-b49897178d-95e56abfe9.zip/node_modules/csstype/",\ + ["npm:3.1.3", {\ + "packageLocation": "./.yarn/cache/csstype-npm-3.1.3-e9a1c85013-8db785cc92.zip/node_modules/csstype/",\ "packageDependencies": [\ - ["csstype", "npm:3.0.11"]\ + ["csstype", "npm:3.1.3"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["d3", [\ - ["npm:7.8.4", {\ - "packageLocation": "./.yarn/cache/d3-npm-7.8.4-2a6380492b-8dfea4d026.zip/node_modules/d3/",\ + ["npm:7.9.0", {\ + "packageLocation": "./.yarn/cache/d3-npm-7.9.0-d293821ce6-1c0e9135f1.zip/node_modules/d3/",\ "packageDependencies": [\ - ["d3", "npm:7.8.4"],\ + ["d3", "npm:7.9.0"],\ ["d3-array", "npm:3.1.6"],\ ["d3-axis", "npm:3.0.0"],\ ["d3-brush", "npm:3.0.0"],\ @@ -3827,28 +4188,29 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["date-fns", [\ - ["npm:2.28.0", {\ - "packageLocation": "./.yarn/cache/date-fns-npm-2.28.0-c19c5add1b-a0516b2e4f.zip/node_modules/date-fns/",\ + ["npm:2.30.0", {\ + "packageLocation": "./.yarn/cache/date-fns-npm-2.30.0-895c790e0f-f7be015232.zip/node_modules/date-fns/",\ "packageDependencies": [\ - ["date-fns", "npm:2.28.0"]\ + ["date-fns", "npm:2.30.0"],\ + ["@babel/runtime", "npm:7.23.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["date-fns-tz", [\ - ["npm:1.3.3", {\ - "packageLocation": "./.yarn/cache/date-fns-tz-npm-1.3.3-4b42de3dcf-52111dffb4.zip/node_modules/date-fns-tz/",\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip/node_modules/date-fns-tz/",\ "packageDependencies": [\ - ["date-fns-tz", "npm:1.3.3"]\ + ["date-fns-tz", "npm:2.0.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:1.3.3", {\ - "packageLocation": "./.yarn/__virtual__/date-fns-tz-virtual-ec6b2c4cf2/0/cache/date-fns-tz-npm-1.3.3-4b42de3dcf-52111dffb4.zip/node_modules/date-fns-tz/",\ + ["virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:2.0.0", {\ + "packageLocation": "./.yarn/__virtual__/date-fns-tz-virtual-6610d5adee/0/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip/node_modules/date-fns-tz/",\ "packageDependencies": [\ - ["date-fns-tz", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:1.3.3"],\ + ["date-fns-tz", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:2.0.0"],\ ["@types/date-fns", null],\ - ["date-fns", "npm:2.28.0"]\ + ["date-fns", "npm:2.30.0"]\ ],\ "packagePeers": [\ "@types/date-fns",\ @@ -3879,10 +4241,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7", {\ - "packageLocation": "./.yarn/__virtual__/debug-virtual-2e2daad542/0/cache/debug-npm-3.2.7-754e818c7a-b3d8c59407.zip/node_modules/debug/",\ + ["virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-d2345003b7/0/cache/debug-npm-3.2.7-754e818c7a-b3d8c59407.zip/node_modules/debug/",\ "packageDependencies": [\ - ["debug", "virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ ["@types/supports-color", null],\ ["ms", "npm:2.1.2"],\ ["supports-color", null]\ @@ -3932,13 +4294,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["deepmerge", [\ - ["npm:4.2.2", {\ - "packageLocation": "./.yarn/cache/deepmerge-npm-4.2.2-112165ced2-a8c43a1ed8.zip/node_modules/deepmerge/",\ - "packageDependencies": [\ - ["deepmerge", "npm:4.2.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:4.3.1", {\ "packageLocation": "./.yarn/cache/deepmerge-npm-4.3.1-4f751a0844-2024c6a980.zip/node_modules/deepmerge/",\ "packageDependencies": [\ @@ -3947,6 +4302,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["define-data-property", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/define-data-property-npm-1.1.1-2b5156d112-a29855ad3f.zip/node_modules/define-data-property/",\ + "packageDependencies": [\ + ["define-data-property", "npm:1.1.1"],\ + ["get-intrinsic", "npm:1.2.1"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["define-properties", [\ ["npm:1.1.4", {\ "packageLocation": "./.yarn/cache/define-properties-npm-1.1.4-85ee575655-ce0aef3f9e.zip/node_modules/define-properties/",\ @@ -3956,6 +4323,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["object-keys", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/define-properties-npm-1.2.0-3547cd0fd2-e60aee6a19.zip/node_modules/define-properties/",\ + "packageDependencies": [\ + ["define-properties", "npm:1.2.0"],\ + ["has-property-descriptors", "npm:1.0.0"],\ + ["object-keys", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["delaunator", [\ @@ -4009,13 +4385,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["detect-libc", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ - }]\ - ]],\ - ["diff-sequences", [\ - ["npm:27.5.1", {\ - "packageLocation": "./.yarn/cache/diff-sequences-npm-27.5.1-29338362fa-a00db5554c.zip/node_modules/diff-sequences/",\ + }],\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/detect-libc-npm-2.0.2-03afa59137-2b2cd3649b.zip/node_modules/detect-libc/",\ "packageDependencies": [\ - ["diff-sequences", "npm:27.5.1"]\ + ["detect-libc", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -4184,6 +4558,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["entities", "npm:3.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.5.0", {\ + "packageLocation": "./.yarn/cache/entities-npm-4.5.0-7cdb83b832-853f8ebd5b.zip/node_modules/entities/",\ + "packageDependencies": [\ + ["entities", "npm:4.5.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["env-paths", [\ @@ -4215,43 +4596,49 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["es-abstract", [\ - ["npm:1.21.1", {\ - "packageLocation": "./.yarn/cache/es-abstract-npm-1.21.1-28d9a4a469-23ff60d42d.zip/node_modules/es-abstract/",\ + ["npm:1.22.3", {\ + "packageLocation": "./.yarn/cache/es-abstract-npm-1.22.3-15a58832e5-b1bdc96285.zip/node_modules/es-abstract/",\ "packageDependencies": [\ - ["es-abstract", "npm:1.21.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["arraybuffer.prototype.slice", "npm:1.0.2"],\ ["available-typed-arrays", "npm:1.0.5"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["es-set-tostringtag", "npm:2.0.1"],\ ["es-to-primitive", "npm:1.2.1"],\ - ["function-bind", "npm:1.1.1"],\ - ["function.prototype.name", "npm:1.1.5"],\ - ["get-intrinsic", "npm:1.2.0"],\ + ["function.prototype.name", "npm:1.1.6"],\ + ["get-intrinsic", "npm:1.2.2"],\ ["get-symbol-description", "npm:1.0.0"],\ ["globalthis", "npm:1.0.3"],\ ["gopd", "npm:1.0.1"],\ - ["has", "npm:1.0.3"],\ ["has-property-descriptors", "npm:1.0.0"],\ ["has-proto", "npm:1.0.1"],\ ["has-symbols", "npm:1.0.3"],\ - ["internal-slot", "npm:1.0.4"],\ - ["is-array-buffer", "npm:3.0.1"],\ + ["hasown", "npm:2.0.0"],\ + ["internal-slot", "npm:1.0.5"],\ + ["is-array-buffer", "npm:3.0.2"],\ ["is-callable", "npm:1.2.7"],\ ["is-negative-zero", "npm:2.0.2"],\ ["is-regex", "npm:1.1.4"],\ ["is-shared-array-buffer", "npm:1.0.2"],\ ["is-string", "npm:1.0.7"],\ - ["is-typed-array", "npm:1.1.10"],\ + ["is-typed-array", "npm:1.1.12"],\ ["is-weakref", "npm:1.0.2"],\ - ["object-inspect", "npm:1.12.3"],\ + ["object-inspect", "npm:1.13.1"],\ ["object-keys", "npm:1.1.1"],\ ["object.assign", "npm:4.1.4"],\ - ["regexp.prototype.flags", "npm:1.4.3"],\ + ["regexp.prototype.flags", "npm:1.5.1"],\ + ["safe-array-concat", "npm:1.0.1"],\ ["safe-regex-test", "npm:1.0.0"],\ - ["string.prototype.trimend", "npm:1.0.6"],\ - ["string.prototype.trimstart", "npm:1.0.6"],\ + ["string.prototype.trim", "npm:1.2.8"],\ + ["string.prototype.trimend", "npm:1.0.7"],\ + ["string.prototype.trimstart", "npm:1.0.7"],\ + ["typed-array-buffer", "npm:1.0.0"],\ + ["typed-array-byte-length", "npm:1.0.0"],\ + ["typed-array-byte-offset", "npm:1.0.0"],\ ["typed-array-length", "npm:1.0.4"],\ ["unbox-primitive", "npm:1.0.2"],\ - ["which-typed-array", "npm:1.1.9"]\ + ["which-typed-array", "npm:1.1.13"]\ ],\ "linkType": "HARD"\ }]\ @@ -4291,32 +4678,32 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["esbuild", [\ - ["npm:0.17.13", {\ - "packageLocation": "./.yarn/unplugged/esbuild-npm-0.17.13-538abc913d/node_modules/esbuild/",\ - "packageDependencies": [\ - ["esbuild", "npm:0.17.13"],\ - ["@esbuild/android-arm", "npm:0.17.13"],\ - ["@esbuild/android-arm64", "npm:0.17.13"],\ - ["@esbuild/android-x64", "npm:0.17.13"],\ - ["@esbuild/darwin-arm64", "npm:0.17.13"],\ - ["@esbuild/darwin-x64", "npm:0.17.13"],\ - ["@esbuild/freebsd-arm64", "npm:0.17.13"],\ - ["@esbuild/freebsd-x64", "npm:0.17.13"],\ - ["@esbuild/linux-arm", "npm:0.17.13"],\ - ["@esbuild/linux-arm64", "npm:0.17.13"],\ - ["@esbuild/linux-ia32", "npm:0.17.13"],\ - ["@esbuild/linux-loong64", "npm:0.17.13"],\ - ["@esbuild/linux-mips64el", "npm:0.17.13"],\ - ["@esbuild/linux-ppc64", "npm:0.17.13"],\ - ["@esbuild/linux-riscv64", "npm:0.17.13"],\ - ["@esbuild/linux-s390x", "npm:0.17.13"],\ - ["@esbuild/linux-x64", "npm:0.17.13"],\ - ["@esbuild/netbsd-x64", "npm:0.17.13"],\ - ["@esbuild/openbsd-x64", "npm:0.17.13"],\ - ["@esbuild/sunos-x64", "npm:0.17.13"],\ - ["@esbuild/win32-arm64", "npm:0.17.13"],\ - ["@esbuild/win32-ia32", "npm:0.17.13"],\ - ["@esbuild/win32-x64", "npm:0.17.13"]\ + ["npm:0.18.20", {\ + "packageLocation": "./.yarn/unplugged/esbuild-npm-0.18.20-004a76d281/node_modules/esbuild/",\ + "packageDependencies": [\ + ["esbuild", "npm:0.18.20"],\ + ["@esbuild/android-arm", "npm:0.18.20"],\ + ["@esbuild/android-arm64", "npm:0.18.20"],\ + ["@esbuild/android-x64", "npm:0.18.20"],\ + ["@esbuild/darwin-arm64", "npm:0.18.20"],\ + ["@esbuild/darwin-x64", "npm:0.18.20"],\ + ["@esbuild/freebsd-arm64", "npm:0.18.20"],\ + ["@esbuild/freebsd-x64", "npm:0.18.20"],\ + ["@esbuild/linux-arm", "npm:0.18.20"],\ + ["@esbuild/linux-arm64", "npm:0.18.20"],\ + ["@esbuild/linux-ia32", "npm:0.18.20"],\ + ["@esbuild/linux-loong64", "npm:0.18.20"],\ + ["@esbuild/linux-mips64el", "npm:0.18.20"],\ + ["@esbuild/linux-ppc64", "npm:0.18.20"],\ + ["@esbuild/linux-riscv64", "npm:0.18.20"],\ + ["@esbuild/linux-s390x", "npm:0.18.20"],\ + ["@esbuild/linux-x64", "npm:0.18.20"],\ + ["@esbuild/netbsd-x64", "npm:0.18.20"],\ + ["@esbuild/openbsd-x64", "npm:0.18.20"],\ + ["@esbuild/sunos-x64", "npm:0.18.20"],\ + ["@esbuild/win32-arm64", "npm:0.18.20"],\ + ["@esbuild/win32-ia32", "npm:0.18.20"],\ + ["@esbuild/win32-x64", "npm:0.18.20"]\ ],\ "linkType": "HARD"\ }]\ @@ -4356,26 +4743,27 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["eslint", [\ - ["npm:8.39.0", {\ - "packageLocation": "./.yarn/cache/eslint-npm-8.39.0-d92bace04d-d7a074ff32.zip/node_modules/eslint/",\ - "packageDependencies": [\ - ["eslint", "npm:8.39.0"],\ - ["@eslint-community/eslint-utils", "virtual:d92bace04d6d26247b24721a8766993aa3a98c631265bb389d6aa7c17b2a0708ccc877f009bd6a9cb50b8597fbe776c68dae7621d198ff292ee4bc23bd4b012f#npm:4.4.0"],\ - ["@eslint-community/regexpp", "npm:4.4.1"],\ - ["@eslint/eslintrc", "npm:2.0.2"],\ - ["@eslint/js", "npm:8.39.0"],\ - ["@humanwhocodes/config-array", "npm:0.11.8"],\ + ["npm:8.57.0", {\ + "packageLocation": "./.yarn/cache/eslint-npm-8.57.0-4286e12a3a-3a48d7ff85.zip/node_modules/eslint/",\ + "packageDependencies": [\ + ["eslint", "npm:8.57.0"],\ + ["@eslint-community/eslint-utils", "virtual:4286e12a3a0f74af013bc8f16c6d8fdde823cfbf6389660266b171e551f576c805b0a7a8eb2a7087a5cee7dfe6ebb6e1ea3808d93daf915edc95656907a381bb#npm:4.4.0"],\ + ["@eslint-community/regexpp", "npm:4.8.0"],\ + ["@eslint/eslintrc", "npm:2.1.4"],\ + ["@eslint/js", "npm:8.57.0"],\ + ["@humanwhocodes/config-array", "npm:0.11.14"],\ ["@humanwhocodes/module-importer", "npm:1.0.1"],\ ["@nodelib/fs.walk", "npm:1.2.8"],\ + ["@ungap/structured-clone", "npm:1.2.0"],\ ["ajv", "npm:6.12.6"],\ ["chalk", "npm:4.1.2"],\ ["cross-spawn", "npm:7.0.3"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ ["doctrine", "npm:3.0.0"],\ ["escape-string-regexp", "npm:4.0.0"],\ - ["eslint-scope", "npm:7.2.0"],\ - ["eslint-visitor-keys", "npm:3.4.0"],\ - ["espree", "npm:9.5.1"],\ + ["eslint-scope", "npm:7.2.2"],\ + ["eslint-visitor-keys", "npm:3.4.3"],\ + ["espree", "npm:9.6.1"],\ ["esquery", "npm:1.5.0"],\ ["esutils", "npm:2.0.3"],\ ["fast-deep-equal", "npm:3.1.3"],\ @@ -4383,46 +4771,65 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["find-up", "npm:5.0.0"],\ ["glob-parent", "npm:6.0.2"],\ ["globals", "npm:13.19.0"],\ - ["grapheme-splitter", "npm:1.0.4"],\ + ["graphemer", "npm:1.4.0"],\ ["ignore", "npm:5.2.0"],\ - ["import-fresh", "npm:3.3.0"],\ ["imurmurhash", "npm:0.1.4"],\ ["is-glob", "npm:4.0.3"],\ ["is-path-inside", "npm:3.0.3"],\ - ["js-sdsl", "npm:4.1.5"],\ ["js-yaml", "npm:4.1.0"],\ ["json-stable-stringify-without-jsonify", "npm:1.0.1"],\ ["levn", "npm:0.4.1"],\ ["lodash.merge", "npm:4.6.2"],\ ["minimatch", "npm:3.1.2"],\ ["natural-compare", "npm:1.4.0"],\ - ["optionator", "npm:0.9.1"],\ + ["optionator", "npm:0.9.3"],\ ["strip-ansi", "npm:6.0.1"],\ - ["strip-json-comments", "npm:3.1.1"],\ ["text-table", "npm:0.2.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ + ["eslint-compat-utils", [\ + ["npm:0.1.2", {\ + "packageLocation": "./.yarn/cache/eslint-compat-utils-npm-0.1.2-361c6992b1-2315d9db81.zip/node_modules/eslint-compat-utils/",\ + "packageDependencies": [\ + ["eslint-compat-utils", "npm:0.1.2"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:ff64d06f93654b25d9cae47199e62d111efde9ee7d408664ae44397cd2ddf7906aefd54fcc2557f4d5619d92da3af68c7898126469c2a57c381e05b06491f0da#npm:0.1.2", {\ + "packageLocation": "./.yarn/__virtual__/eslint-compat-utils-virtual-a5f7e6147b/0/cache/eslint-compat-utils-npm-0.1.2-361c6992b1-2315d9db81.zip/node_modules/eslint-compat-utils/",\ + "packageDependencies": [\ + ["eslint-compat-utils", "virtual:ff64d06f93654b25d9cae47199e62d111efde9ee7d408664ae44397cd2ddf7906aefd54fcc2557f4d5619d92da3af68c7898126469c2a57c381e05b06491f0da#npm:0.1.2"],\ + ["@types/eslint", null],\ + ["eslint", "npm:8.57.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["eslint-config-standard", [\ - ["npm:17.0.0", {\ - "packageLocation": "./.yarn/cache/eslint-config-standard-npm-17.0.0-2803f6a79a-dc0ed51e18.zip/node_modules/eslint-config-standard/",\ + ["npm:17.1.0", {\ + "packageLocation": "./.yarn/cache/eslint-config-standard-npm-17.1.0-e72fd623cc-8ed14ffe42.zip/node_modules/eslint-config-standard/",\ "packageDependencies": [\ - ["eslint-config-standard", "npm:17.0.0"]\ + ["eslint-config-standard", "npm:17.1.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.0.0", {\ - "packageLocation": "./.yarn/__virtual__/eslint-config-standard-virtual-5de208ba69/0/cache/eslint-config-standard-npm-17.0.0-2803f6a79a-dc0ed51e18.zip/node_modules/eslint-config-standard/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-config-standard-virtual-a273ec9ea6/0/cache/eslint-config-standard-npm-17.1.0-e72fd623cc-8ed14ffe42.zip/node_modules/eslint-config-standard/",\ "packageDependencies": [\ - ["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.0.0"],\ + ["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\ ["@types/eslint", null],\ ["@types/eslint-plugin-import", null],\ ["@types/eslint-plugin-n", null],\ ["@types/eslint-plugin-promise", null],\ - ["eslint", "npm:8.39.0"],\ - ["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.27.5"],\ - ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:15.7.0"],\ + ["eslint", "npm:8.57.0"],\ + ["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.29.1"],\ + ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2"],\ ["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"]\ ],\ "packagePeers": [\ @@ -4439,38 +4846,38 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["eslint-import-resolver-node", [\ - ["npm:0.3.7", {\ - "packageLocation": "./.yarn/cache/eslint-import-resolver-node-npm-0.3.7-65bed19543-3379aacf1d.zip/node_modules/eslint-import-resolver-node/",\ + ["npm:0.3.9", {\ + "packageLocation": "./.yarn/cache/eslint-import-resolver-node-npm-0.3.9-2a426afc4b-439b912712.zip/node_modules/eslint-import-resolver-node/",\ "packageDependencies": [\ - ["eslint-import-resolver-node", "npm:0.3.7"],\ - ["debug", "virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7"],\ - ["is-core-module", "npm:2.11.0"],\ - ["resolve", "patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b"]\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["is-core-module", "npm:2.13.0"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["eslint-module-utils", [\ - ["npm:2.7.4", {\ - "packageLocation": "./.yarn/cache/eslint-module-utils-npm-2.7.4-a1640084cb-5da13645da.zip/node_modules/eslint-module-utils/",\ + ["npm:2.8.0", {\ + "packageLocation": "./.yarn/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-74c6dfea76.zip/node_modules/eslint-module-utils/",\ "packageDependencies": [\ - ["eslint-module-utils", "npm:2.7.4"]\ + ["eslint-module-utils", "npm:2.8.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:bd6906041f26404b69936f019863470d6b0f75b1c61c4157b266eb36d096227fb0d250c76d47e694906c4d352d0c4c1a1a71e1f575fbbb05fe72b26198a32c57#npm:2.7.4", {\ - "packageLocation": "./.yarn/__virtual__/eslint-module-utils-virtual-5ee98b4501/0/cache/eslint-module-utils-npm-2.7.4-a1640084cb-5da13645da.zip/node_modules/eslint-module-utils/",\ + ["virtual:caddce79266c9767570f5c081ff9adaab1d8b040965749cfca6a3f3f4fbd011bf36f7d755f18ef80e67a5402a33b10c9e1ffc34efb6909461044fc5d60cfbcd0#npm:2.8.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-module-utils-virtual-d80573de1e/0/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-74c6dfea76.zip/node_modules/eslint-module-utils/",\ "packageDependencies": [\ - ["eslint-module-utils", "virtual:bd6906041f26404b69936f019863470d6b0f75b1c61c4157b266eb36d096227fb0d250c76d47e694906c4d352d0c4c1a1a71e1f575fbbb05fe72b26198a32c57#npm:2.7.4"],\ + ["eslint-module-utils", "virtual:caddce79266c9767570f5c081ff9adaab1d8b040965749cfca6a3f3f4fbd011bf36f7d755f18ef80e67a5402a33b10c9e1ffc34efb6909461044fc5d60cfbcd0#npm:2.8.0"],\ ["@types/eslint", null],\ ["@types/eslint-import-resolver-node", null],\ ["@types/eslint-import-resolver-typescript", null],\ ["@types/eslint-import-resolver-webpack", null],\ ["@types/typescript-eslint__parser", null],\ ["@typescript-eslint/parser", null],\ - ["debug", "virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7"],\ - ["eslint", "npm:8.39.0"],\ - ["eslint-import-resolver-node", "npm:0.3.7"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["eslint", "npm:8.57.0"],\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ ["eslint-import-resolver-typescript", null],\ ["eslint-import-resolver-webpack", null]\ ],\ @@ -4490,20 +4897,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["eslint-plugin-cypress", [\ - ["npm:2.13.3", {\ - "packageLocation": "./.yarn/cache/eslint-plugin-cypress-npm-2.13.3-0ad3bff9c9-9affbcee29.zip/node_modules/eslint-plugin-cypress/",\ + ["npm:2.15.1", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-cypress-npm-2.15.1-90f777d9bd-3e66fa9a94.zip/node_modules/eslint-plugin-cypress/",\ "packageDependencies": [\ - ["eslint-plugin-cypress", "npm:2.13.3"]\ + ["eslint-plugin-cypress", "npm:2.15.1"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.13.3", {\ - "packageLocation": "./.yarn/__virtual__/eslint-plugin-cypress-virtual-2dc00cb202/0/cache/eslint-plugin-cypress-npm-2.13.3-0ad3bff9c9-9affbcee29.zip/node_modules/eslint-plugin-cypress/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.15.1", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-cypress-virtual-33ce75aabf/0/cache/eslint-plugin-cypress-npm-2.15.1-90f777d9bd-3e66fa9a94.zip/node_modules/eslint-plugin-cypress/",\ "packageDependencies": [\ - ["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.13.3"],\ + ["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.15.1"],\ ["@types/eslint", null],\ - ["eslint", "npm:8.39.0"],\ - ["globals", "npm:11.12.0"]\ + ["eslint", "npm:8.57.0"],\ + ["globals", "npm:13.21.0"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -4520,19 +4927,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["npm:4.1.0", {\ - "packageLocation": "./.yarn/cache/eslint-plugin-es-npm-4.1.0-a4cf26d3cd-26b87a216d.zip/node_modules/eslint-plugin-es/",\ - "packageDependencies": [\ - ["eslint-plugin-es", "npm:4.1.0"]\ - ],\ - "linkType": "SOFT"\ - }],\ ["virtual:5cccaf00e87dfff96dbbb5eaf7a3055373358b8114d6a1adfb32f54ed6b40ba06068d3aa1fdd8062899a0cad040f68c17cc6b72bac2cdbe9700f3d6330d112f3#npm:3.0.1", {\ "packageLocation": "./.yarn/__virtual__/eslint-plugin-es-virtual-9a126af2f5/0/cache/eslint-plugin-es-npm-3.0.1-95e8015220-e57592c523.zip/node_modules/eslint-plugin-es/",\ "packageDependencies": [\ ["eslint-plugin-es", "virtual:5cccaf00e87dfff96dbbb5eaf7a3055373358b8114d6a1adfb32f54ed6b40ba06068d3aa1fdd8062899a0cad040f68c17cc6b72bac2cdbe9700f3d6330d112f3#npm:3.0.1"],\ ["@types/eslint", null],\ - ["eslint", "npm:8.39.0"],\ + ["eslint", "npm:8.57.0"],\ ["eslint-utils", "npm:2.1.0"],\ ["regexpp", "npm:3.2.0"]\ ],\ @@ -4541,15 +4941,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "eslint"\ ],\ "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-es-x", [\ + ["npm:7.5.0", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-es-x-npm-7.5.0-77e84d6e5d-e770e57df7.zip/node_modules/eslint-plugin-es-x/",\ + "packageDependencies": [\ + ["eslint-plugin-es-x", "npm:7.5.0"]\ + ],\ + "linkType": "SOFT"\ }],\ - ["virtual:fbb8c3721066ef61887f5309241d337d9cae043cc5c9fede0ea8d900cdabf786b9dea63ee87ce779e1ffd85e6a35d182759c106301f028068c68edced9b12f1f#npm:4.1.0", {\ - "packageLocation": "./.yarn/__virtual__/eslint-plugin-es-virtual-b9c0bc467b/0/cache/eslint-plugin-es-npm-4.1.0-a4cf26d3cd-26b87a216d.zip/node_modules/eslint-plugin-es/",\ + ["virtual:e72a0a9306438b1033938dd0da350cf9f4ec062648c9360382edaa21499b6290430f07b640481cdb3f67c818af79a821eb8f3071ebf7284ab09c47cb982d8502#npm:7.5.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-es-x-virtual-ff64d06f93/0/cache/eslint-plugin-es-x-npm-7.5.0-77e84d6e5d-e770e57df7.zip/node_modules/eslint-plugin-es-x/",\ "packageDependencies": [\ - ["eslint-plugin-es", "virtual:fbb8c3721066ef61887f5309241d337d9cae043cc5c9fede0ea8d900cdabf786b9dea63ee87ce779e1ffd85e6a35d182759c106301f028068c68edced9b12f1f#npm:4.1.0"],\ + ["eslint-plugin-es-x", "virtual:e72a0a9306438b1033938dd0da350cf9f4ec062648c9360382edaa21499b6290430f07b640481cdb3f67c818af79a821eb8f3071ebf7284ab09c47cb982d8502#npm:7.5.0"],\ + ["@eslint-community/eslint-utils", "virtual:4286e12a3a0f74af013bc8f16c6d8fdde823cfbf6389660266b171e551f576c805b0a7a8eb2a7087a5cee7dfe6ebb6e1ea3808d93daf915edc95656907a381bb#npm:4.4.0"],\ + ["@eslint-community/regexpp", "npm:4.10.0"],\ ["@types/eslint", null],\ - ["eslint", "npm:8.39.0"],\ - ["eslint-utils", "npm:2.1.0"],\ - ["regexpp", "npm:3.2.0"]\ + ["eslint", "npm:8.57.0"],\ + ["eslint-compat-utils", "virtual:ff64d06f93654b25d9cae47199e62d111efde9ee7d408664ae44397cd2ddf7906aefd54fcc2557f4d5619d92da3af68c7898126469c2a57c381e05b06491f0da#npm:0.1.2"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -4559,36 +4969,38 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["eslint-plugin-import", [\ - ["npm:2.27.5", {\ - "packageLocation": "./.yarn/cache/eslint-plugin-import-npm-2.27.5-35b044b26f-f500571a38.zip/node_modules/eslint-plugin-import/",\ + ["npm:2.29.1", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-e65159aef8.zip/node_modules/eslint-plugin-import/",\ "packageDependencies": [\ - ["eslint-plugin-import", "npm:2.27.5"]\ + ["eslint-plugin-import", "npm:2.29.1"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.27.5", {\ - "packageLocation": "./.yarn/__virtual__/eslint-plugin-import-virtual-bd6906041f/0/cache/eslint-plugin-import-npm-2.27.5-35b044b26f-f500571a38.zip/node_modules/eslint-plugin-import/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.29.1", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-import-virtual-caddce7926/0/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-e65159aef8.zip/node_modules/eslint-plugin-import/",\ "packageDependencies": [\ - ["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.27.5"],\ + ["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.29.1"],\ ["@types/eslint", null],\ ["@types/typescript-eslint__parser", null],\ ["@typescript-eslint/parser", null],\ - ["array-includes", "npm:3.1.6"],\ - ["array.prototype.flat", "npm:1.3.1"],\ - ["array.prototype.flatmap", "npm:1.3.1"],\ - ["debug", "virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7"],\ + ["array-includes", "npm:3.1.7"],\ + ["array.prototype.findlastindex", "npm:1.2.3"],\ + ["array.prototype.flat", "npm:1.3.2"],\ + ["array.prototype.flatmap", "npm:1.3.2"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ ["doctrine", "npm:2.1.0"],\ - ["eslint", "npm:8.39.0"],\ - ["eslint-import-resolver-node", "npm:0.3.7"],\ - ["eslint-module-utils", "virtual:bd6906041f26404b69936f019863470d6b0f75b1c61c4157b266eb36d096227fb0d250c76d47e694906c4d352d0c4c1a1a71e1f575fbbb05fe72b26198a32c57#npm:2.7.4"],\ - ["has", "npm:1.0.3"],\ - ["is-core-module", "npm:2.11.0"],\ + ["eslint", "npm:8.57.0"],\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ + ["eslint-module-utils", "virtual:caddce79266c9767570f5c081ff9adaab1d8b040965749cfca6a3f3f4fbd011bf36f7d755f18ef80e67a5402a33b10c9e1ffc34efb6909461044fc5d60cfbcd0#npm:2.8.0"],\ + ["hasown", "npm:2.0.0"],\ + ["is-core-module", "npm:2.13.1"],\ ["is-glob", "npm:4.0.3"],\ ["minimatch", "npm:3.1.2"],\ - ["object.values", "npm:1.1.6"],\ - ["resolve", "patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b"],\ - ["semver", "npm:6.3.0"],\ - ["tsconfig-paths", "npm:3.14.1"]\ + ["object.fromentries", "npm:2.0.7"],\ + ["object.groupby", "npm:1.0.1"],\ + ["object.values", "npm:1.1.7"],\ + ["semver", "npm:6.3.1"],\ + ["tsconfig-paths", "npm:3.15.0"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -4600,27 +5012,30 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["eslint-plugin-n", [\ - ["npm:15.7.0", {\ - "packageLocation": "./.yarn/cache/eslint-plugin-n-npm-15.7.0-8ea46b0c89-cfbcc67e62.zip/node_modules/eslint-plugin-n/",\ + ["npm:16.6.2", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-n-npm-16.6.2-77775852d0-3b468da003.zip/node_modules/eslint-plugin-n/",\ "packageDependencies": [\ - ["eslint-plugin-n", "npm:15.7.0"]\ + ["eslint-plugin-n", "npm:16.6.2"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:15.7.0", {\ - "packageLocation": "./.yarn/__virtual__/eslint-plugin-n-virtual-fbb8c37210/0/cache/eslint-plugin-n-npm-15.7.0-8ea46b0c89-cfbcc67e62.zip/node_modules/eslint-plugin-n/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-n-virtual-e72a0a9306/0/cache/eslint-plugin-n-npm-16.6.2-77775852d0-3b468da003.zip/node_modules/eslint-plugin-n/",\ "packageDependencies": [\ - ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:15.7.0"],\ + ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2"],\ + ["@eslint-community/eslint-utils", "virtual:4286e12a3a0f74af013bc8f16c6d8fdde823cfbf6389660266b171e551f576c805b0a7a8eb2a7087a5cee7dfe6ebb6e1ea3808d93daf915edc95656907a381bb#npm:4.4.0"],\ ["@types/eslint", null],\ ["builtins", "npm:5.0.1"],\ - ["eslint", "npm:8.39.0"],\ - ["eslint-plugin-es", "virtual:fbb8c3721066ef61887f5309241d337d9cae043cc5c9fede0ea8d900cdabf786b9dea63ee87ce779e1ffd85e6a35d182759c106301f028068c68edced9b12f1f#npm:4.1.0"],\ - ["eslint-utils", "virtual:fbb8c3721066ef61887f5309241d337d9cae043cc5c9fede0ea8d900cdabf786b9dea63ee87ce779e1ffd85e6a35d182759c106301f028068c68edced9b12f1f#npm:3.0.0"],\ - ["ignore", "npm:5.2.0"],\ - ["is-core-module", "npm:2.11.0"],\ + ["eslint", "npm:8.57.0"],\ + ["eslint-plugin-es-x", "virtual:e72a0a9306438b1033938dd0da350cf9f4ec062648c9360382edaa21499b6290430f07b640481cdb3f67c818af79a821eb8f3071ebf7284ab09c47cb982d8502#npm:7.5.0"],\ + ["get-tsconfig", "npm:4.7.2"],\ + ["globals", "npm:13.24.0"],\ + ["ignore", "npm:5.2.4"],\ + ["is-builtin-module", "npm:3.2.1"],\ + ["is-core-module", "npm:2.12.1"],\ ["minimatch", "npm:3.1.2"],\ - ["resolve", "patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b"],\ - ["semver", "npm:7.3.8"]\ + ["resolve", "patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=07638b"],\ + ["semver", "npm:7.5.3"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -4642,7 +5057,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\ ["@types/eslint", null],\ - ["eslint", "npm:8.39.0"],\ + ["eslint", "npm:8.57.0"],\ ["eslint-plugin-es", "virtual:5cccaf00e87dfff96dbbb5eaf7a3055373358b8114d6a1adfb32f54ed6b40ba06068d3aa1fdd8062899a0cad040f68c17cc6b72bac2cdbe9700f3d6330d112f3#npm:3.0.1"],\ ["eslint-utils", "npm:2.1.0"],\ ["ignore", "npm:5.2.0"],\ @@ -4670,7 +5085,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\ ["@types/eslint", null],\ - ["eslint", "npm:8.39.0"]\ + ["eslint", "npm:8.57.0"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -4680,25 +5095,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["eslint-plugin-vue", [\ - ["npm:9.11.0", {\ - "packageLocation": "./.yarn/cache/eslint-plugin-vue-npm-9.11.0-b3c0e8ae5d-1bcb6cf768.zip/node_modules/eslint-plugin-vue/",\ + ["npm:9.24.0", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-vue-npm-9.24.0-4c6dba51bf-2309b919d8.zip/node_modules/eslint-plugin-vue/",\ "packageDependencies": [\ - ["eslint-plugin-vue", "npm:9.11.0"]\ + ["eslint-plugin-vue", "npm:9.24.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.11.0", {\ - "packageLocation": "./.yarn/__virtual__/eslint-plugin-vue-virtual-b496f670e3/0/cache/eslint-plugin-vue-npm-9.11.0-b3c0e8ae5d-1bcb6cf768.zip/node_modules/eslint-plugin-vue/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.24.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-vue-virtual-e080dd5dc6/0/cache/eslint-plugin-vue-npm-9.24.0-4c6dba51bf-2309b919d8.zip/node_modules/eslint-plugin-vue/",\ "packageDependencies": [\ - ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.11.0"],\ - ["@eslint-community/eslint-utils", "virtual:d92bace04d6d26247b24721a8766993aa3a98c631265bb389d6aa7c17b2a0708ccc877f009bd6a9cb50b8597fbe776c68dae7621d198ff292ee4bc23bd4b012f#npm:4.4.0"],\ + ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.24.0"],\ + ["@eslint-community/eslint-utils", "virtual:4286e12a3a0f74af013bc8f16c6d8fdde823cfbf6389660266b171e551f576c805b0a7a8eb2a7087a5cee7dfe6ebb6e1ea3808d93daf915edc95656907a381bb#npm:4.4.0"],\ ["@types/eslint", null],\ - ["eslint", "npm:8.39.0"],\ + ["eslint", "npm:8.57.0"],\ + ["globals", "npm:13.24.0"],\ ["natural-compare", "npm:1.4.0"],\ ["nth-check", "npm:2.1.1"],\ - ["postcss-selector-parser", "npm:6.0.10"],\ - ["semver", "npm:7.3.7"],\ - ["vue-eslint-parser", "virtual:b496f670e3acb84cc194f988fd3fa15eff7479fe9212e466815f1d307efda1d2ed5782452f48c17f7b772004bd86fa771d60b67ce1881c71b828caf6fc2a9603#npm:9.0.3"],\ + ["postcss-selector-parser", "npm:6.0.15"],\ + ["semver", "npm:7.6.0"],\ + ["vue-eslint-parser", "virtual:e080dd5dc65fb3541eb98fd929c3a1d3733f3aff4bb24b09a6b5cce9fba4a29aca07e286ef93079f2144caa0fd33bb6545549286d3a9f2b9a211caa1f4b68ff9#npm:9.4.2"],\ ["xml-name-validator", "npm:4.0.0"]\ ],\ "packagePeers": [\ @@ -4718,10 +5134,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:7.2.0", {\ - "packageLocation": "./.yarn/cache/eslint-scope-npm-7.2.0-88784f5a38-64591a2d8b.zip/node_modules/eslint-scope/",\ + ["npm:7.2.2", {\ + "packageLocation": "./.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip/node_modules/eslint-scope/",\ "packageDependencies": [\ - ["eslint-scope", "npm:7.2.0"],\ + ["eslint-scope", "npm:7.2.2"],\ ["esrecurse", "npm:4.3.0"],\ ["estraverse", "npm:5.3.0"]\ ],\ @@ -4736,27 +5152,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["eslint-visitor-keys", "npm:1.3.0"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:3.0.0", {\ - "packageLocation": "./.yarn/cache/eslint-utils-npm-3.0.0-630b3a4013-0668fe02f5.zip/node_modules/eslint-utils/",\ - "packageDependencies": [\ - ["eslint-utils", "npm:3.0.0"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:fbb8c3721066ef61887f5309241d337d9cae043cc5c9fede0ea8d900cdabf786b9dea63ee87ce779e1ffd85e6a35d182759c106301f028068c68edced9b12f1f#npm:3.0.0", {\ - "packageLocation": "./.yarn/__virtual__/eslint-utils-virtual-673271877c/0/cache/eslint-utils-npm-3.0.0-630b3a4013-0668fe02f5.zip/node_modules/eslint-utils/",\ - "packageDependencies": [\ - ["eslint-utils", "virtual:fbb8c3721066ef61887f5309241d337d9cae043cc5c9fede0ea8d900cdabf786b9dea63ee87ce779e1ffd85e6a35d182759c106301f028068c68edced9b12f1f#npm:3.0.0"],\ - ["@types/eslint", null],\ - ["eslint", "npm:8.39.0"],\ - ["eslint-visitor-keys", "npm:2.1.0"]\ - ],\ - "packagePeers": [\ - "@types/eslint",\ - "eslint"\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["eslint-visitor-keys", [\ @@ -4767,24 +5162,24 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:2.1.0", {\ - "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-2.1.0-c31806b6b9-e3081d7dd2.zip/node_modules/eslint-visitor-keys/",\ + ["npm:3.3.0", {\ + "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.3.0-d329af7c8c-d59e68a7c5.zip/node_modules/eslint-visitor-keys/",\ "packageDependencies": [\ - ["eslint-visitor-keys", "npm:2.1.0"]\ + ["eslint-visitor-keys", "npm:3.3.0"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:3.3.0", {\ - "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.3.0-d329af7c8c-d59e68a7c5.zip/node_modules/eslint-visitor-keys/",\ + ["npm:3.4.1", {\ + "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.4.1-a5d0a58208-f05121d868.zip/node_modules/eslint-visitor-keys/",\ "packageDependencies": [\ - ["eslint-visitor-keys", "npm:3.3.0"]\ + ["eslint-visitor-keys", "npm:3.4.1"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:3.4.0", {\ - "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.4.0-dc8683d774-3315916946.zip/node_modules/eslint-visitor-keys/",\ + ["npm:3.4.3", {\ + "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-36e9ef87fc.zip/node_modules/eslint-visitor-keys/",\ "packageDependencies": [\ - ["eslint-visitor-keys", "npm:3.4.0"]\ + ["eslint-visitor-keys", "npm:3.4.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -4800,13 +5195,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:9.5.1", {\ - "packageLocation": "./.yarn/cache/espree-npm-9.5.1-057dc7b3c1-cdf6e43540.zip/node_modules/espree/",\ + ["npm:9.6.1", {\ + "packageLocation": "./.yarn/cache/espree-npm-9.6.1-a50722a5a9-eb8c149c7a.zip/node_modules/espree/",\ "packageDependencies": [\ - ["espree", "npm:9.5.1"],\ - ["acorn", "npm:8.8.0"],\ - ["acorn-jsx", "virtual:057dc7b3c1f6024b5a316c7e5d452c8397d903f7ff9736e8d71b89efc60141dc4c8c777c0c1057fa0d3bf0d3dd59eec8694b4efb6f0fb20c747ec060bab7195d#npm:5.3.2"],\ - ["eslint-visitor-keys", "npm:3.4.0"]\ + ["espree", "npm:9.6.1"],\ + ["acorn", "npm:8.10.0"],\ + ["acorn-jsx", "virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2"],\ + ["eslint-visitor-keys", "npm:3.4.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -4999,15 +5394,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["foreground-child", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/foreground-child-npm-2.0.0-80c976b61e-f77ec9aff6.zip/node_modules/foreground-child/",\ - "packageDependencies": [\ - ["foreground-child", "npm:2.0.0"],\ - ["cross-spawn", "npm:7.0.3"],\ - ["signal-exit", "npm:3.0.7"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.1.1", {\ "packageLocation": "./.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-139d270bc8.zip/node_modules/foreground-child/",\ "packageDependencies": [\ @@ -5063,16 +5449,23 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["function-bind", "npm:1.1.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.1.2", {\ + "packageLocation": "./.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip/node_modules/function-bind/",\ + "packageDependencies": [\ + ["function-bind", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["function.prototype.name", [\ - ["npm:1.1.5", {\ - "packageLocation": "./.yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-acd21d733a.zip/node_modules/function.prototype.name/",\ + ["npm:1.1.6", {\ + "packageLocation": "./.yarn/cache/function.prototype.name-npm-1.1.6-fd3a6a5cdd-7a3f9bd98a.zip/node_modules/function.prototype.name/",\ "packageDependencies": [\ - ["function.prototype.name", "npm:1.1.5"],\ + ["function.prototype.name", "npm:1.1.6"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.4"],\ - ["es-abstract", "npm:1.21.1"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"],\ ["functions-have-names", "npm:1.2.3"]\ ],\ "linkType": "HARD"\ @@ -5133,6 +5526,28 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["has-symbols", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/get-intrinsic-npm-1.2.1-ae857fd610-5b61d88552.zip/node_modules/get-intrinsic/",\ + "packageDependencies": [\ + ["get-intrinsic", "npm:1.2.1"],\ + ["function-bind", "npm:1.1.1"],\ + ["has", "npm:1.0.3"],\ + ["has-proto", "npm:1.0.1"],\ + ["has-symbols", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.2.2", {\ + "packageLocation": "./.yarn/cache/get-intrinsic-npm-1.2.2-3f446d8847-447ff0724d.zip/node_modules/get-intrinsic/",\ + "packageDependencies": [\ + ["get-intrinsic", "npm:1.2.2"],\ + ["function-bind", "npm:1.1.2"],\ + ["has-proto", "npm:1.0.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["get-port", [\ @@ -5155,6 +5570,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["get-tsconfig", [\ + ["npm:4.7.2", {\ + "packageLocation": "./.yarn/cache/get-tsconfig-npm-4.7.2-8fbccd9fcf-1723589032.zip/node_modules/get-tsconfig/",\ + "packageDependencies": [\ + ["get-tsconfig", "npm:4.7.2"],\ + ["resolve-pkg-maps", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["glob", [\ ["npm:10.2.4", {\ "packageLocation": "./.yarn/cache/glob-npm-10.2.4-49f715fccc-29845faaa1.zip/node_modules/glob/",\ @@ -5213,13 +5638,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["globals", [\ - ["npm:11.12.0", {\ - "packageLocation": "./.yarn/cache/globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip/node_modules/globals/",\ - "packageDependencies": [\ - ["globals", "npm:11.12.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:13.15.0", {\ "packageLocation": "./.yarn/cache/globals-npm-13.15.0-c0b0c83a7a-383ade0873.zip/node_modules/globals/",\ "packageDependencies": [\ @@ -5235,6 +5653,22 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["type-fest", "npm:0.20.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:13.21.0", {\ + "packageLocation": "./.yarn/cache/globals-npm-13.21.0-c0829ce1cb-86c92ca8a0.zip/node_modules/globals/",\ + "packageDependencies": [\ + ["globals", "npm:13.21.0"],\ + ["type-fest", "npm:0.20.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:13.24.0", {\ + "packageLocation": "./.yarn/cache/globals-npm-13.24.0-cc7713139c-56066ef058.zip/node_modules/globals/",\ + "packageDependencies": [\ + ["globals", "npm:13.24.0"],\ + ["type-fest", "npm:0.20.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["globalthis", [\ @@ -5266,11 +5700,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["grapheme-splitter", [\ - ["npm:1.0.4", {\ - "packageLocation": "./.yarn/cache/grapheme-splitter-npm-1.0.4-648f2bf509-0c22ec54de.zip/node_modules/grapheme-splitter/",\ + ["graphemer", [\ + ["npm:1.4.0", {\ + "packageLocation": "./.yarn/cache/graphemer-npm-1.4.0-0627732d35-bab8f0be9b.zip/node_modules/graphemer/",\ "packageDependencies": [\ - ["grapheme-splitter", "npm:1.0.4"]\ + ["graphemer", "npm:1.4.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -5357,20 +5791,30 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["hasown", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/hasown-npm-2.0.0-78b794ceef-6151c75ca1.zip/node_modules/hasown/",\ + "packageDependencies": [\ + ["hasown", "npm:2.0.0"],\ + ["function-bind", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["highcharts", [\ - ["npm:11.0.1", {\ - "packageLocation": "./.yarn/cache/highcharts-npm-11.0.1-05a14e3887-773a7b8765.zip/node_modules/highcharts/",\ + ["npm:11.4.0", {\ + "packageLocation": "./.yarn/cache/highcharts-npm-11.4.0-8a1f46b545-873e661914.zip/node_modules/highcharts/",\ "packageDependencies": [\ - ["highcharts", "npm:11.0.1"]\ + ["highcharts", "npm:11.4.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["highlight.js", [\ - ["npm:11.5.1", {\ - "packageLocation": "./.yarn/cache/highlight.js-npm-11.5.1-0fb1167640-bff556101d.zip/node_modules/highlight.js/",\ + ["npm:11.9.0", {\ + "packageLocation": "./.yarn/cache/highlight.js-npm-11.9.0-ec99f7b12f-4043d31c5d.zip/node_modules/highlight.js/",\ "packageDependencies": [\ - ["highlight.js", "npm:11.5.1"]\ + ["highlight.js", "npm:11.9.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -5385,44 +5829,46 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["html-validate", [\ - ["npm:7.16.0", {\ - "packageLocation": "./.yarn/cache/html-validate-npm-7.16.0-ceaf62fb08-cce9a9e8f7.zip/node_modules/html-validate/",\ + ["npm:8.18.1", {\ + "packageLocation": "./.yarn/cache/html-validate-npm-8.18.1-c5271a0fb9-53479bf75b.zip/node_modules/html-validate/",\ "packageDependencies": [\ - ["html-validate", "npm:7.16.0"]\ + ["html-validate", "npm:8.18.1"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:7.16.0", {\ - "packageLocation": "./.yarn/__virtual__/html-validate-virtual-681f166fa5/0/cache/html-validate-npm-7.16.0-ceaf62fb08-cce9a9e8f7.zip/node_modules/html-validate/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.18.1", {\ + "packageLocation": "./.yarn/__virtual__/html-validate-virtual-640261ed3b/0/cache/html-validate-npm-8.18.1-c5271a0fb9-53479bf75b.zip/node_modules/html-validate/",\ "packageDependencies": [\ - ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:7.16.0"],\ + ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.18.1"],\ ["@babel/code-frame", "npm:7.16.7"],\ - ["@html-validate/stylish", "npm:4.0.1"],\ - ["@sidvind/better-ajv-errors", "virtual:681f166fa525f4703ee9c1e8e4559a36bfdac9fdcbccdfeb239624a192c2aaee56211c254f7093e696cd71a2eaed6484d2ba2bb9ec45b8d53cb66b299a635a53#npm:2.0.0"],\ + ["@html-validate/stylish", "npm:4.1.0"],\ + ["@sidvind/better-ajv-errors", "virtual:640261ed3b7a9880a388cc504caacf8ea790dd52f1cb31fbc3be445cb2adc6e73fc87097de620863105eb917510145ef2457d30000c7361456ab67ec0b895136#npm:2.1.3"],\ ["@types/jest", null],\ ["@types/jest-diff", null],\ ["@types/jest-snapshot", null],\ - ["acorn-walk", "npm:8.2.0"],\ + ["@types/vitest", null],\ ["ajv", "npm:8.11.0"],\ - ["deepmerge", "npm:4.2.2"],\ - ["espree", "npm:9.3.2"],\ + ["deepmerge", "npm:4.3.1"],\ ["glob", "npm:10.2.4"],\ - ["ignore", "npm:5.2.0"],\ + ["ignore", "npm:5.3.1"],\ ["jest", null],\ ["jest-diff", null],\ ["jest-snapshot", null],\ ["kleur", "npm:4.1.4"],\ ["minimist", "npm:1.2.6"],\ ["prompts", "npm:2.4.2"],\ - ["semver", "npm:7.3.7"]\ + ["semver", "npm:7.3.7"],\ + ["vitest", null]\ ],\ "packagePeers": [\ "@types/jest-diff",\ "@types/jest-snapshot",\ "@types/jest",\ + "@types/vitest",\ "jest-diff",\ "jest-snapshot",\ - "jest"\ + "jest",\ + "vitest"\ ],\ "linkType": "HARD"\ }]\ @@ -5435,10 +5881,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:62c761ef265a1bb47118c5f610ff8bb4c7a43de129089ff7c8e3644d9427d7669d4e7e8fe06763510806415fe32bf491fdfbec2819a7040538b412dfe2ab9cb1#npm:2.0.2", {\ - "packageLocation": "./.yarn/__virtual__/htmlnano-virtual-b07a7d37fd/0/cache/htmlnano-npm-2.0.2-a89803bfeb-41f9e0c0e5.zip/node_modules/htmlnano/",\ + ["virtual:cdd2835c1202e86fad55b2266578ff3755267672440481af37bdfff670fd205f561469a10385c20d1ff403af7fad49006bc71ffff21d12592a8ebd0c8be79c0c#npm:2.0.2", {\ + "packageLocation": "./.yarn/__virtual__/htmlnano-virtual-d2bb6df599/0/cache/htmlnano-npm-2.0.2-a89803bfeb-41f9e0c0e5.zip/node_modules/htmlnano/",\ "packageDependencies": [\ - ["htmlnano", "virtual:62c761ef265a1bb47118c5f610ff8bb4c7a43de129089ff7c8e3644d9427d7669d4e7e8fe06763510806415fe32bf491fdfbec2819a7040538b412dfe2ab9cb1#npm:2.0.2"],\ + ["htmlnano", "virtual:cdd2835c1202e86fad55b2266578ff3755267672440481af37bdfff670fd205f561469a10385c20d1ff403af7fad49006bc71ffff21d12592a8ebd0c8be79c0c#npm:2.0.2"],\ ["@types/cssnano", null],\ ["@types/postcss", null],\ ["@types/purgecss", null],\ @@ -5575,6 +6021,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ignore", "npm:5.2.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:5.2.4", {\ + "packageLocation": "./.yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip/node_modules/ignore/",\ + "packageDependencies": [\ + ["ignore", "npm:5.2.4"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.3.1", {\ + "packageLocation": "./.yarn/cache/ignore-npm-5.3.1-f6947c5df7-71d7bb4c1d.zip/node_modules/ignore/",\ + "packageDependencies": [\ + ["ignore", "npm:5.3.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["immutable", [\ @@ -5645,11 +6105,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["internal-slot", [\ - ["npm:1.0.4", {\ - "packageLocation": "./.yarn/cache/internal-slot-npm-1.0.4-9183007374-8974588d06.zip/node_modules/internal-slot/",\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/internal-slot-npm-1.0.5-a2241f3e66-97e84046bf.zip/node_modules/internal-slot/",\ "packageDependencies": [\ - ["internal-slot", "npm:1.0.4"],\ - ["get-intrinsic", "npm:1.2.0"],\ + ["internal-slot", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.1"],\ ["has", "npm:1.0.3"],\ ["side-channel", "npm:1.0.4"]\ ],\ @@ -5684,6 +6144,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["is-typed-array", "npm:1.1.10"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/is-array-buffer-npm-3.0.2-0dec897785-dcac9dda66.zip/node_modules/is-array-buffer/",\ + "packageDependencies": [\ + ["is-array-buffer", "npm:3.0.2"],\ + ["call-bind", "npm:1.0.2"],\ + ["get-intrinsic", "npm:1.2.1"],\ + ["is-typed-array", "npm:1.1.10"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["is-arrayish", [\ @@ -5726,6 +6196,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["is-builtin-module", [\ + ["npm:3.2.1", {\ + "packageLocation": "./.yarn/cache/is-builtin-module-npm-3.2.1-2f92a5d353-e8f0ffc19a.zip/node_modules/is-builtin-module/",\ + "packageDependencies": [\ + ["is-builtin-module", "npm:3.2.1"],\ + ["builtin-modules", "npm:3.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-callable", [\ ["npm:1.2.4", {\ "packageLocation": "./.yarn/cache/is-callable-npm-1.2.4-03fc17459c-1a28d57dc4.zip/node_modules/is-callable/",\ @@ -5743,22 +6223,30 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["is-core-module", [\ - ["npm:2.10.0", {\ - "packageLocation": "./.yarn/cache/is-core-module-npm-2.10.0-6dff9310aa-0f3f77811f.zip/node_modules/is-core-module/",\ + ["npm:2.12.1", {\ + "packageLocation": "./.yarn/cache/is-core-module-npm-2.12.1-ce74e89160-f04ea30533.zip/node_modules/is-core-module/",\ "packageDependencies": [\ - ["is-core-module", "npm:2.10.0"],\ + ["is-core-module", "npm:2.12.1"],\ ["has", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:2.11.0", {\ - "packageLocation": "./.yarn/cache/is-core-module-npm-2.11.0-70061e141a-f96fd490c6.zip/node_modules/is-core-module/",\ + ["npm:2.13.0", {\ + "packageLocation": "./.yarn/cache/is-core-module-npm-2.13.0-e444c50225-053ab101fb.zip/node_modules/is-core-module/",\ "packageDependencies": [\ - ["is-core-module", "npm:2.11.0"],\ + ["is-core-module", "npm:2.13.0"],\ ["has", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ }],\ + ["npm:2.13.1", {\ + "packageLocation": "./.yarn/cache/is-core-module-npm-2.13.1-36e17434f9-256559ee8a.zip/node_modules/is-core-module/",\ + "packageDependencies": [\ + ["is-core-module", "npm:2.13.1"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:2.9.0", {\ "packageLocation": "./.yarn/cache/is-core-module-npm-2.9.0-5ba77c35ae-b27034318b.zip/node_modules/is-core-module/",\ "packageDependencies": [\ @@ -5934,6 +6422,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["has-tostringtag", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.1.12", {\ + "packageLocation": "./.yarn/cache/is-typed-array-npm-1.1.12-6135c91b1a-4c89c4a3be.zip/node_modules/is-typed-array/",\ + "packageDependencies": [\ + ["is-typed-array", "npm:1.1.12"],\ + ["which-typed-array", "npm:1.1.13"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["is-weakref", [\ @@ -5946,6 +6442,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["isarray", [\ + ["npm:2.0.5", {\ + "packageLocation": "./.yarn/cache/isarray-npm-2.0.5-4ba522212d-bd5bbe4104.zip/node_modules/isarray/",\ + "packageDependencies": [\ + ["isarray", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["isbinaryfile", [\ ["npm:4.0.10", {\ "packageLocation": "./.yarn/cache/isbinaryfile-npm-4.0.10-91d1251522-a6b28db7e2.zip/node_modules/isbinaryfile/",\ @@ -5983,13 +6488,23 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["supports-color", "npm:7.2.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/istanbul-lib-report-npm-3.0.1-b17446ab24-fd17a1b879.zip/node_modules/istanbul-lib-report/",\ + "packageDependencies": [\ + ["istanbul-lib-report", "npm:3.0.1"],\ + ["istanbul-lib-coverage", "npm:3.2.0"],\ + ["make-dir", "npm:4.0.0"],\ + ["supports-color", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["istanbul-reports", [\ - ["npm:3.1.4", {\ - "packageLocation": "./.yarn/cache/istanbul-reports-npm-3.1.4-5faaa9636c-2132983355.zip/node_modules/istanbul-reports/",\ + ["npm:3.1.6", {\ + "packageLocation": "./.yarn/cache/istanbul-reports-npm-3.1.6-66918eb97f-44c4c0582f.zip/node_modules/istanbul-reports/",\ "packageDependencies": [\ - ["istanbul-reports", "npm:3.1.4"],\ + ["istanbul-reports", "npm:3.1.6"],\ ["html-escaper", "npm:2.0.2"],\ ["istanbul-lib-report", "npm:3.0.0"]\ ],\ @@ -6007,46 +6522,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["jest-diff", [\ - ["npm:27.5.1", {\ - "packageLocation": "./.yarn/cache/jest-diff-npm-27.5.1-818e549196-8be27c1e1e.zip/node_modules/jest-diff/",\ - "packageDependencies": [\ - ["jest-diff", "npm:27.5.1"],\ - ["chalk", "npm:4.1.2"],\ - ["diff-sequences", "npm:27.5.1"],\ - ["jest-get-type", "npm:27.5.1"],\ - ["pretty-format", "npm:27.5.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["jest-get-type", [\ - ["npm:27.5.1", {\ - "packageLocation": "./.yarn/cache/jest-get-type-npm-27.5.1-980fbf7a43-63064ab701.zip/node_modules/jest-get-type/",\ - "packageDependencies": [\ - ["jest-get-type", "npm:27.5.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["jest-matcher-utils", [\ - ["npm:27.5.1", {\ - "packageLocation": "./.yarn/cache/jest-matcher-utils-npm-27.5.1-0c47b071fb-bb2135fc48.zip/node_modules/jest-matcher-utils/",\ - "packageDependencies": [\ - ["jest-matcher-utils", "npm:27.5.1"],\ - ["chalk", "npm:4.1.2"],\ - ["jest-diff", "npm:27.5.1"],\ - ["jest-get-type", "npm:27.5.1"],\ - ["pretty-format", "npm:27.5.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["jquery", [\ - ["npm:3.6.4", {\ - "packageLocation": "./.yarn/cache/jquery-npm-3.6.4-c665e9b5ea-8354f7bd0a.zip/node_modules/jquery/",\ + ["npm:3.7.1", {\ + "packageLocation": "./.yarn/cache/jquery-npm-3.7.1-eeeac0f21e-4370b8139d.zip/node_modules/jquery/",\ "packageDependencies": [\ - ["jquery", "npm:3.6.4"]\ + ["jquery", "npm:3.7.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -6064,7 +6544,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\ ["@types/jquery", null],\ - ["jquery", "npm:3.6.4"]\ + ["jquery", "npm:3.7.1"]\ ],\ "packagePeers": [\ "@types/jquery",\ @@ -6082,15 +6562,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["js-sdsl", [\ - ["npm:4.1.5", {\ - "packageLocation": "./.yarn/cache/js-sdsl-npm-4.1.5-66fcf4f580-695f657ddc.zip/node_modules/js-sdsl/",\ - "packageDependencies": [\ - ["js-sdsl", "npm:4.1.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["js-stringify", [\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/js-stringify-npm-1.0.2-898ffeac57-f9701d9e53.zip/node_modules/js-stringify/",\ @@ -6336,6 +6807,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["weak-lru-cache", "npm:1.2.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.8.5", {\ + "packageLocation": "./.yarn/unplugged/lmdb-npm-2.8.5-e5fdd937dd/node_modules/lmdb/",\ + "packageDependencies": [\ + ["lmdb", "npm:2.8.5"],\ + ["@lmdb/lmdb-darwin-arm64", "npm:2.8.5"],\ + ["@lmdb/lmdb-darwin-x64", "npm:2.8.5"],\ + ["@lmdb/lmdb-linux-arm", "npm:2.8.5"],\ + ["@lmdb/lmdb-linux-arm64", "npm:2.8.5"],\ + ["@lmdb/lmdb-linux-x64", "npm:2.8.5"],\ + ["@lmdb/lmdb-win32-x64", "npm:2.8.5"],\ + ["msgpackr", "npm:1.9.9"],\ + ["node-addon-api", "npm:6.1.0"],\ + ["node-gyp", "npm:9.0.0"],\ + ["node-gyp-build-optional-packages", "npm:5.1.1"],\ + ["ordered-binary", "npm:1.4.1"],\ + ["weak-lru-cache", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["locate-path", [\ @@ -6400,20 +6890,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["luxon", [\ - ["npm:3.3.0", {\ - "packageLocation": "./.yarn/cache/luxon-npm-3.3.0-bdbae9bfd5-50cf17a0dc.zip/node_modules/luxon/",\ + ["npm:3.4.4", {\ + "packageLocation": "./.yarn/cache/luxon-npm-3.4.4-c93f95dde8-36c1f99c47.zip/node_modules/luxon/",\ "packageDependencies": [\ - ["luxon", "npm:3.3.0"]\ + ["luxon", "npm:3.4.4"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["magic-string", [\ - ["npm:0.25.9", {\ - "packageLocation": "./.yarn/cache/magic-string-npm-0.25.9-0b51c0ea50-9a0e55a15c.zip/node_modules/magic-string/",\ + ["npm:0.30.7", {\ + "packageLocation": "./.yarn/cache/magic-string-npm-0.30.7-0bb5819095-bdf102e36a.zip/node_modules/magic-string/",\ "packageDependencies": [\ - ["magic-string", "npm:0.25.9"],\ - ["sourcemap-codec", "npm:1.4.8"]\ + ["magic-string", "npm:0.30.7"],\ + ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ ],\ "linkType": "HARD"\ }]\ @@ -6426,6 +6916,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["semver", "npm:6.3.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/make-dir-npm-4.0.0-ec3cd921cc-bf0731a2dd.zip/node_modules/make-dir/",\ + "packageDependencies": [\ + ["make-dir", "npm:4.0.0"],\ + ["semver", "npm:7.5.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["make-fetch-happen", [\ @@ -6610,13 +7108,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["moment", "npm:2.29.4"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.30.1", {\ + "packageLocation": "./.yarn/cache/moment-npm-2.30.1-1c51a5c631-859236bab1.zip/node_modules/moment/",\ + "packageDependencies": [\ + ["moment", "npm:2.30.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["moment-timezone", [\ - ["npm:0.5.43", {\ - "packageLocation": "./.yarn/cache/moment-timezone-npm-0.5.43-1304d8602a-8075c897ed.zip/node_modules/moment-timezone/",\ + ["npm:0.5.45", {\ + "packageLocation": "./.yarn/cache/moment-timezone-npm-0.5.45-2df3ad72a4-a22e9f983f.zip/node_modules/moment-timezone/",\ "packageDependencies": [\ - ["moment-timezone", "npm:0.5.43"],\ + ["moment-timezone", "npm:0.5.45"],\ ["moment", "npm:2.29.4"]\ ],\ "linkType": "HARD"\ @@ -6646,6 +7151,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["msgpackr", [\ + ["npm:1.10.1", {\ + "packageLocation": "./.yarn/cache/msgpackr-npm-1.10.1-5c5ff5c553-e422d18b01.zip/node_modules/msgpackr/",\ + "packageDependencies": [\ + ["msgpackr", "npm:1.10.1"],\ + ["msgpackr-extract", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:1.6.0", {\ "packageLocation": "./.yarn/cache/msgpackr-npm-1.6.0-de9303a46e-7f94acbe93.zip/node_modules/msgpackr/",\ "packageDependencies": [\ @@ -6653,6 +7166,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["msgpackr-extract", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.9.9", {\ + "packageLocation": "./.yarn/cache/msgpackr-npm-1.9.9-75b366d55f-b63182d99f.zip/node_modules/msgpackr/",\ + "packageDependencies": [\ + ["msgpackr", "npm:1.9.9"],\ + ["msgpackr-extract", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["msgpackr-extract", [\ @@ -6670,6 +7191,30 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["node-gyp-build-optional-packages", "npm:5.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/unplugged/msgpackr-extract-npm-3.0.2-93e8773fad/node_modules/msgpackr-extract/",\ + "packageDependencies": [\ + ["msgpackr-extract", "npm:3.0.2"],\ + ["@msgpackr-extract/msgpackr-extract-darwin-arm64", "npm:3.0.2"],\ + ["@msgpackr-extract/msgpackr-extract-darwin-x64", "npm:3.0.2"],\ + ["@msgpackr-extract/msgpackr-extract-linux-arm", "npm:3.0.2"],\ + ["@msgpackr-extract/msgpackr-extract-linux-arm64", "npm:3.0.2"],\ + ["@msgpackr-extract/msgpackr-extract-linux-x64", "npm:3.0.2"],\ + ["@msgpackr-extract/msgpackr-extract-win32-x64", "npm:3.0.2"],\ + ["node-gyp", "npm:9.0.0"],\ + ["node-gyp-build-optional-packages", "npm:5.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["muggle-string", [\ + ["npm:0.4.1", {\ + "packageLocation": "./.yarn/cache/muggle-string-npm-0.4.1-fe3c825cc2-85fe1766d1.zip/node_modules/muggle-string/",\ + "packageDependencies": [\ + ["muggle-string", "npm:0.4.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["murmurhash-js", [\ @@ -6682,37 +7227,38 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["naive-ui", [\ - ["npm:2.34.3", {\ - "packageLocation": "./.yarn/cache/naive-ui-npm-2.34.3-ba2dfb08d8-792d9e6c51.zip/node_modules/naive-ui/",\ + ["npm:2.38.1", {\ + "packageLocation": "./.yarn/cache/naive-ui-npm-2.38.1-0edd2e5816-88a8f981de.zip/node_modules/naive-ui/",\ "packageDependencies": [\ - ["naive-ui", "npm:2.34.3"]\ + ["naive-ui", "npm:2.38.1"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.34.3", {\ - "packageLocation": "./.yarn/__virtual__/naive-ui-virtual-4fa5810747/0/cache/naive-ui-npm-2.34.3-ba2dfb08d8-792d9e6c51.zip/node_modules/naive-ui/",\ - "packageDependencies": [\ - ["naive-ui", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.34.3"],\ - ["@css-render/plugin-bem", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.15.10"],\ - ["@css-render/vue3-ssr", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.15.10"],\ - ["@types/katex", "npm:0.14.0"],\ - ["@types/lodash", "npm:4.14.182"],\ - ["@types/lodash-es", "npm:4.17.6"],\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.38.1", {\ + "packageLocation": "./.yarn/__virtual__/naive-ui-virtual-32fd9c861d/0/cache/naive-ui-npm-2.38.1-0edd2e5816-88a8f981de.zip/node_modules/naive-ui/",\ + "packageDependencies": [\ + ["naive-ui", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.38.1"],\ + ["@css-render/plugin-bem", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.15.12"],\ + ["@css-render/vue3-ssr", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.15.12"],\ + ["@types/katex", "npm:0.16.5"],\ + ["@types/lodash", "npm:4.14.200"],\ + ["@types/lodash-es", "npm:4.17.10"],\ ["@types/vue", null],\ - ["async-validator", "npm:4.1.1"],\ - ["css-render", "npm:0.15.10"],\ - ["date-fns", "npm:2.28.0"],\ - ["date-fns-tz", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:1.3.3"],\ + ["async-validator", "npm:4.2.5"],\ + ["css-render", "npm:0.15.12"],\ + ["csstype", "npm:3.1.3"],\ + ["date-fns", "npm:2.30.0"],\ + ["date-fns-tz", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:2.0.0"],\ ["evtd", "npm:0.2.4"],\ - ["highlight.js", "npm:11.5.1"],\ + ["highlight.js", "npm:11.9.0"],\ ["lodash", "npm:4.17.21"],\ ["lodash-es", "npm:4.17.21"],\ - ["seemly", "npm:0.3.6"],\ + ["seemly", "npm:0.3.8"],\ ["treemate", "npm:0.3.11"],\ - ["vdirs", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.1.8"],\ - ["vooks", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.2.12"],\ - ["vue", "npm:3.2.47"],\ - ["vueuc", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.4.47"]\ + ["vdirs", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.1.8"],\ + ["vooks", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.2.12"],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\ + ["vueuc", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.4.58"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -6722,17 +7268,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["nanoid", [\ - ["npm:3.3.3", {\ - "packageLocation": "./.yarn/cache/nanoid-npm-3.3.3-25d865be84-ada019402a.zip/node_modules/nanoid/",\ - "packageDependencies": [\ - ["nanoid", "npm:3.3.3"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:3.3.6", {\ - "packageLocation": "./.yarn/cache/nanoid-npm-3.3.6-e6d6ae7e71-7d0eda6570.zip/node_modules/nanoid/",\ + ["npm:3.3.7", {\ + "packageLocation": "./.yarn/cache/nanoid-npm-3.3.7-98824ba130-d36c427e53.zip/node_modules/nanoid/",\ "packageDependencies": [\ - ["nanoid", "npm:3.3.6"]\ + ["nanoid", "npm:3.3.7"]\ ],\ "linkType": "HARD"\ }]\ @@ -6771,6 +7310,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["node-gyp", "npm:9.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:6.1.0", {\ + "packageLocation": "./.yarn/unplugged/node-addon-api-npm-6.1.0-634c545b39/node_modules/node-addon-api/",\ + "packageDependencies": [\ + ["node-addon-api", "npm:6.1.0"],\ + ["node-gyp", "npm:9.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["node-gyp", [\ @@ -6815,6 +7362,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["node-gyp-build-optional-packages", "npm:5.0.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:5.0.7", {\ + "packageLocation": "./.yarn/cache/node-gyp-build-optional-packages-npm-5.0.7-40f21a5d68-bcb4537af1.zip/node_modules/node-gyp-build-optional-packages/",\ + "packageDependencies": [\ + ["node-gyp-build-optional-packages", "npm:5.0.7"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.1", {\ + "packageLocation": "./.yarn/cache/node-gyp-build-optional-packages-npm-5.1.1-ff11e179dd-f3cb197862.zip/node_modules/node-gyp-build-optional-packages/",\ + "packageDependencies": [\ + ["node-gyp-build-optional-packages", "npm:5.1.1"],\ + ["detect-libc", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["node-releases", [\ @@ -6894,10 +7456,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:1.12.3", {\ - "packageLocation": "./.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-dabfd824d9.zip/node_modules/object-inspect/",\ + ["npm:1.13.1", {\ + "packageLocation": "./.yarn/cache/object-inspect-npm-1.13.1-fd038a2f0a-7d9fa9221d.zip/node_modules/object-inspect/",\ "packageDependencies": [\ - ["object-inspect", "npm:1.12.3"]\ + ["object-inspect", "npm:1.13.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -6924,14 +7486,39 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["object.fromentries", [\ + ["npm:2.0.7", {\ + "packageLocation": "./.yarn/cache/object.fromentries-npm-2.0.7-2e38392540-7341ce246e.zip/node_modules/object.fromentries/",\ + "packageDependencies": [\ + ["object.fromentries", "npm:2.0.7"],\ + ["call-bind", "npm:1.0.2"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.groupby", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/object.groupby-npm-1.0.1-fc268391fe-d7959d6eaa.zip/node_modules/object.groupby/",\ + "packageDependencies": [\ + ["object.groupby", "npm:1.0.1"],\ + ["call-bind", "npm:1.0.2"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["object.values", [\ - ["npm:1.1.6", {\ - "packageLocation": "./.yarn/cache/object.values-npm-1.1.6-ab9b67ccd3-f6fff9fd81.zip/node_modules/object.values/",\ + ["npm:1.1.7", {\ + "packageLocation": "./.yarn/cache/object.values-npm-1.1.7-deae619f88-f3e4ae4f21.zip/node_modules/object.values/",\ "packageDependencies": [\ - ["object.values", "npm:1.1.6"],\ + ["object.values", "npm:1.1.7"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.4"],\ - ["es-abstract", "npm:1.21.1"]\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -6957,16 +7544,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["optionator", [\ - ["npm:0.9.1", {\ - "packageLocation": "./.yarn/cache/optionator-npm-0.9.1-577e397aae-dbc6fa0656.zip/node_modules/optionator/",\ + ["npm:0.9.3", {\ + "packageLocation": "./.yarn/cache/optionator-npm-0.9.3-56c3a4bf80-0928199944.zip/node_modules/optionator/",\ "packageDependencies": [\ - ["optionator", "npm:0.9.1"],\ + ["optionator", "npm:0.9.3"],\ + ["@aashutoshrathi/word-wrap", "npm:1.2.6"],\ ["deep-is", "npm:0.1.4"],\ ["fast-levenshtein", "npm:2.0.6"],\ ["levn", "npm:0.4.1"],\ ["prelude-ls", "npm:1.2.1"],\ - ["type-check", "npm:0.4.0"],\ - ["word-wrap", "npm:1.2.3"]\ + ["type-check", "npm:0.4.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -6978,6 +7565,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ordered-binary", "npm:1.2.5"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.4.1", {\ + "packageLocation": "./.yarn/cache/ordered-binary-npm-1.4.1-9ad6b7c6b5-274940b4ef.zip/node_modules/ordered-binary/",\ + "packageDependencies": [\ + ["ordered-binary", "npm:1.4.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["p-limit", [\ @@ -7011,32 +7605,32 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["parcel", [\ - ["npm:2.8.3", {\ - "packageLocation": "./.yarn/cache/parcel-npm-2.8.3-5d8a8e1092-09cd2dc23c.zip/node_modules/parcel/",\ + ["npm:2.12.0", {\ + "packageLocation": "./.yarn/cache/parcel-npm-2.12.0-96a4bb6cc3-d8e6cb690a.zip/node_modules/parcel/",\ "packageDependencies": [\ - ["parcel", "npm:2.8.3"]\ + ["parcel", "npm:2.12.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.8.3", {\ - "packageLocation": "./.yarn/__virtual__/parcel-virtual-079004f749/0/cache/parcel-npm-2.8.3-5d8a8e1092-09cd2dc23c.zip/node_modules/parcel/",\ - "packageDependencies": [\ - ["parcel", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.8.3"],\ - ["@parcel/config-default", "virtual:079004f749aaa3b41d1755e479be6fc0871d8df3c6d97e1317ea81a49502572ac0da821e08a1cc3e408b007d7607c0863e93b8975d65134412812579e6733926#npm:2.8.3"],\ - ["@parcel/core", "npm:2.8.3"],\ - ["@parcel/diagnostic", "npm:2.8.3"],\ - ["@parcel/events", "npm:2.8.3"],\ - ["@parcel/fs", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/logger", "npm:2.8.3"],\ - ["@parcel/package-manager", "virtual:1751106c31c022beab60638c8a9494de4916f0aa7d7ea5bf610db1916ce86c51e464d56c223dd24e1a6fe3f7439c0465735b9968451150db84bbb38b4819b62c#npm:2.8.3"],\ - ["@parcel/reporter-cli", "npm:2.8.3"],\ - ["@parcel/reporter-dev-server", "npm:2.8.3"],\ - ["@parcel/utils", "npm:2.8.3"],\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.12.0", {\ + "packageLocation": "./.yarn/__virtual__/parcel-virtual-fdd74b573c/0/cache/parcel-npm-2.12.0-96a4bb6cc3-d8e6cb690a.zip/node_modules/parcel/",\ + "packageDependencies": [\ + ["parcel", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.12.0"],\ + ["@parcel/config-default", "virtual:fdd74b573cf769bcde15fb47c39fbe0d73f59838182900fd59d3d43b2214ea01b1d45084fb49d0c192fc3e8a49adea5782afcb7fe14e09c63bedaf09f4939e35#npm:2.12.0"],\ + ["@parcel/core", "npm:2.12.0"],\ + ["@parcel/diagnostic", "npm:2.12.0"],\ + ["@parcel/events", "npm:2.12.0"],\ + ["@parcel/fs", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/logger", "npm:2.12.0"],\ + ["@parcel/package-manager", "virtual:8f08b883d4cc438aa2ec719eb5cec278f9ea627197c55f35530bcaf9cd4e4738e04be8abe946bd2702b3f5c94b812f529f1b87c05c7d6de04e1ade9b3f3e00f6#npm:2.12.0"],\ + ["@parcel/reporter-cli", "npm:2.12.0"],\ + ["@parcel/reporter-dev-server", "npm:2.12.0"],\ + ["@parcel/reporter-tracer", "npm:2.12.0"],\ + ["@parcel/utils", "npm:2.12.0"],\ ["@types/parcel__core", null],\ ["chalk", "npm:4.1.2"],\ ["commander", "npm:7.2.0"],\ - ["get-port", "npm:4.2.0"],\ - ["v8-compile-cache", "npm:2.3.0"]\ + ["get-port", "npm:4.2.0"]\ ],\ "packagePeers": [\ "@types/parcel__core"\ @@ -7142,25 +7736,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["pinia", [\ - ["npm:2.0.35", {\ - "packageLocation": "./.yarn/cache/pinia-npm-2.0.35-60f8addaf8-cecb1e1e97.zip/node_modules/pinia/",\ + ["npm:2.1.7", {\ + "packageLocation": "./.yarn/cache/pinia-npm-2.1.7-195409c154-1b7882aab2.zip/node_modules/pinia/",\ "packageDependencies": [\ - ["pinia", "npm:2.0.35"]\ + ["pinia", "npm:2.1.7"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.0.35", {\ - "packageLocation": "./.yarn/__virtual__/pinia-virtual-9f965060ea/0/cache/pinia-npm-2.0.35-60f8addaf8-cecb1e1e97.zip/node_modules/pinia/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.1.7", {\ + "packageLocation": "./.yarn/__virtual__/pinia-virtual-cf6f7439ee/0/cache/pinia-npm-2.1.7-195409c154-1b7882aab2.zip/node_modules/pinia/",\ "packageDependencies": [\ - ["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.0.35"],\ + ["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.1.7"],\ ["@types/typescript", null],\ ["@types/vue", null],\ ["@types/vue__composition-api", null],\ ["@vue/composition-api", null],\ ["@vue/devtools-api", "npm:6.5.0"],\ ["typescript", null],\ - ["vue", "npm:3.2.47"],\ - ["vue-demi", "virtual:9f965060eafe5d7d052212cc7fd6fef913db724957f695b650ecef8b5179ad752b46bfcd2beb1965c04a72ea327c1241f8e860a445f77aaf193b4f78ba29f8b4#npm:0.13.1"]\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\ + ["vue-demi", "virtual:cf6f7439ee76dfd2e7f8f2565ae847d76901434fc49c65702190cdf3d1c61e61c701a5c45b514c4bdeacb8f4bcac9c8a98bd4db3d0bc8e403d9e8db2cf14372a#npm:0.14.5"]\ ],\ "packagePeers": [\ "@types/typescript",\ @@ -7189,8 +7783,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/vue", null],\ ["@types/vue__composition-api", null],\ ["@vue/composition-api", null],\ - ["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.0.35"],\ - ["vue", "npm:3.2.47"],\ + ["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.1.7"],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\ ["vue-demi", "virtual:f56fcf19bbebc2ada1b28955da8cc216b1e9a569a1a7337d2d1926c1ebd1bc7a5bd91aedae1d05c15c8562f33caf7c59bd3020a667340f6bdc6a7b13fc2ba847#npm:0.12.5"]\ ],\ "packagePeers": [\ @@ -7205,21 +7799,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["postcss", [\ - ["npm:8.4.12", {\ - "packageLocation": "./.yarn/cache/postcss-npm-8.4.12-e941d78a98-248e3d0f9b.zip/node_modules/postcss/",\ + ["npm:8.4.33", {\ + "packageLocation": "./.yarn/cache/postcss-npm-8.4.33-6ba8157009-6f98b2af4b.zip/node_modules/postcss/",\ "packageDependencies": [\ - ["postcss", "npm:8.4.12"],\ - ["nanoid", "npm:3.3.3"],\ + ["postcss", "npm:8.4.33"],\ + ["nanoid", "npm:3.3.7"],\ ["picocolors", "npm:1.0.0"],\ ["source-map-js", "npm:1.0.2"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:8.4.23", {\ - "packageLocation": "./.yarn/cache/postcss-npm-8.4.23-d4a02a832d-8bb9d1b2ea.zip/node_modules/postcss/",\ + ["npm:8.4.35", {\ + "packageLocation": "./.yarn/cache/postcss-npm-8.4.35-6bc1848fff-cf3c3124d3.zip/node_modules/postcss/",\ "packageDependencies": [\ - ["postcss", "npm:8.4.23"],\ - ["nanoid", "npm:3.3.6"],\ + ["postcss", "npm:8.4.35"],\ + ["nanoid", "npm:3.3.7"],\ ["picocolors", "npm:1.0.0"],\ ["source-map-js", "npm:1.0.2"]\ ],\ @@ -7227,10 +7821,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["postcss-selector-parser", [\ - ["npm:6.0.10", {\ - "packageLocation": "./.yarn/cache/postcss-selector-parser-npm-6.0.10-a4d7aaa270-46afaa60e3.zip/node_modules/postcss-selector-parser/",\ + ["npm:6.0.15", {\ + "packageLocation": "./.yarn/cache/postcss-selector-parser-npm-6.0.15-0ec4819b4e-57decb9415.zip/node_modules/postcss-selector-parser/",\ "packageDependencies": [\ - ["postcss-selector-parser", "npm:6.0.10"],\ + ["postcss-selector-parser", "npm:6.0.15"],\ ["cssesc", "npm:3.0.0"],\ ["util-deprecate", "npm:1.0.2"]\ ],\ @@ -7303,18 +7897,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["pretty-format", [\ - ["npm:27.5.1", {\ - "packageLocation": "./.yarn/cache/pretty-format-npm-27.5.1-cd7d49696f-cf610cffcb.zip/node_modules/pretty-format/",\ - "packageDependencies": [\ - ["pretty-format", "npm:27.5.1"],\ - ["ansi-regex", "npm:5.0.1"],\ - ["ansi-styles", "npm:5.2.0"],\ - ["react-is", "npm:17.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["promise", [\ ["npm:7.3.1", {\ "packageLocation": "./.yarn/cache/promise-npm-7.3.1-5d81d474c0-475bb06913.zip/node_modules/promise/",\ @@ -7547,15 +8129,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["react-is", [\ - ["npm:17.0.2", {\ - "packageLocation": "./.yarn/cache/react-is-npm-17.0.2-091bbb8db6-9d6d111d89.zip/node_modules/react-is/",\ - "packageDependencies": [\ - ["react-is", "npm:17.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["react-refresh", [\ ["npm:0.9.0", {\ "packageLocation": "./.yarn/cache/react-refresh-npm-0.9.0-02c61ee045-6440146176.zip/node_modules/react-refresh/",\ @@ -7594,16 +8167,23 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["regenerator-runtime", "npm:0.13.9"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:0.14.0", {\ + "packageLocation": "./.yarn/cache/regenerator-runtime-npm-0.14.0-e060897cf7-1c977ad82a.zip/node_modules/regenerator-runtime/",\ + "packageDependencies": [\ + ["regenerator-runtime", "npm:0.14.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["regexp.prototype.flags", [\ - ["npm:1.4.3", {\ - "packageLocation": "./.yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-51228bae73.zip/node_modules/regexp.prototype.flags/",\ + ["npm:1.5.1", {\ + "packageLocation": "./.yarn/cache/regexp.prototype.flags-npm-1.5.1-b8faeee306-869edff002.zip/node_modules/regexp.prototype.flags/",\ "packageDependencies": [\ - ["regexp.prototype.flags", "npm:1.4.3"],\ + ["regexp.prototype.flags", "npm:1.5.1"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.4"],\ - ["functions-have-names", "npm:1.2.3"]\ + ["define-properties", "npm:1.2.0"],\ + ["set-function-name", "npm:2.0.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -7646,11 +8226,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b", {\ - "packageLocation": "./.yarn/cache/resolve-patch-46f9469d0d-5656f4d0be.zip/node_modules/resolve/",\ + ["patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=07638b", {\ + "packageLocation": "./.yarn/cache/resolve-patch-8df1eb26d0-ad59734723.zip/node_modules/resolve/",\ + "packageDependencies": [\ + ["resolve", "patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=07638b"],\ + ["is-core-module", "npm:2.12.1"],\ + ["path-parse", "npm:1.0.7"],\ + ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b", {\ + "packageLocation": "./.yarn/cache/resolve-patch-f6b5304cab-5479b7d431.zip/node_modules/resolve/",\ "packageDependencies": [\ - ["resolve", "patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b"],\ - ["is-core-module", "npm:2.10.0"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b"],\ + ["is-core-module", "npm:2.13.0"],\ ["path-parse", "npm:1.0.7"],\ ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ ],\ @@ -7666,6 +8256,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["resolve-pkg-maps", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/resolve-pkg-maps-npm-1.0.0-135b70c854-1012afc566.zip/node_modules/resolve-pkg-maps/",\ + "packageDependencies": [\ + ["resolve-pkg-maps", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["retry", [\ ["npm:0.12.0", {\ "packageLocation": "./.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip/node_modules/retry/",\ @@ -7704,10 +8303,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["rollup", [\ - ["npm:3.21.6", {\ - "packageLocation": "./.yarn/cache/rollup-npm-3.21.6-ae95b73a21-bb6786ee0d.zip/node_modules/rollup/",\ + ["npm:3.29.4", {\ + "packageLocation": "./.yarn/cache/rollup-npm-3.29.4-5e5e5f2087-8bb20a39c8.zip/node_modules/rollup/",\ "packageDependencies": [\ - ["rollup", "npm:3.21.6"],\ + ["rollup", "npm:3.29.4"],\ ["fsevents", "patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7"]\ ],\ "linkType": "HARD"\ @@ -7718,70 +8317,70 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./",\ "packageDependencies": [\ ["root-workspace-0b6124", "workspace:."],\ - ["@faker-js/faker", "npm:7.6.0"],\ - ["@fullcalendar/bootstrap5", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/core", "npm:6.1.6"],\ - ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/interaction", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/list", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/luxon2", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/timegrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@fullcalendar/vue3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.6"],\ - ["@parcel/optimizer-data-url", "npm:2.8.3"],\ - ["@parcel/transformer-inline-string", "npm:2.8.3"],\ - ["@parcel/transformer-sass", "npm:2.8.3"],\ - ["@popperjs/core", "npm:2.11.7"],\ - ["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.2"],\ + ["@fullcalendar/bootstrap5", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/core", "npm:6.1.11"],\ + ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/interaction", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/list", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/luxon3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/timegrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@fullcalendar/vue3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\ + ["@parcel/optimizer-data-url", "npm:2.12.0"],\ + ["@parcel/transformer-inline-string", "npm:2.12.0"],\ + ["@parcel/transformer-sass", "npm:2.12.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ + ["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.1.0"],\ ["@twuni/emojify", "npm:1.0.2"],\ - ["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.1"],\ - ["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.2.3"],\ - ["bootstrap-icons", "npm:1.10.5"],\ - ["browser-fs-access", "npm:0.33.1"],\ + ["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.6.2"],\ + ["@vue/language-plugin-pug", "npm:2.0.7"],\ + ["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.3"],\ + ["bootstrap-icons", "npm:1.11.3"],\ + ["browser-fs-access", "npm:0.35.0"],\ ["browserlist", "npm:1.0.1"],\ - ["c8", "npm:7.13.0"],\ - ["caniuse-lite", "npm:1.0.30001481"],\ - ["d3", "npm:7.8.4"],\ - ["eslint", "npm:8.39.0"],\ - ["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.0.0"],\ - ["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.13.3"],\ - ["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.27.5"],\ - ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:15.7.0"],\ + ["c8", "npm:9.1.0"],\ + ["caniuse-lite", "npm:1.0.30001603"],\ + ["d3", "npm:7.9.0"],\ + ["eslint", "npm:8.57.0"],\ + ["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\ + ["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.15.1"],\ + ["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.29.1"],\ + ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2"],\ ["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\ ["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\ - ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.11.0"],\ + ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.24.0"],\ ["file-saver", "npm:2.0.5"],\ - ["highcharts", "npm:11.0.1"],\ - ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:7.16.0"],\ + ["highcharts", "npm:11.4.0"],\ + ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.18.1"],\ ["ical.js", "npm:1.5.0"],\ - ["jquery", "npm:3.6.4"],\ + ["jquery", "npm:3.7.1"],\ ["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\ ["js-cookie", "npm:3.0.5"],\ ["list.js", "npm:2.3.1"],\ ["lodash", "npm:4.17.21"],\ ["lodash-es", "npm:4.17.21"],\ - ["luxon", "npm:3.3.0"],\ - ["moment", "npm:2.29.4"],\ - ["moment-timezone", "npm:0.5.43"],\ + ["luxon", "npm:3.4.4"],\ + ["moment", "npm:2.30.1"],\ + ["moment-timezone", "npm:0.5.45"],\ ["ms", "npm:2.1.3"],\ ["murmurhash-js", "npm:1.0.0"],\ - ["naive-ui", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.34.3"],\ - ["parcel", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.8.3"],\ - ["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.0.35"],\ + ["naive-ui", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.38.1"],\ + ["parcel", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.12.0"],\ + ["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.1.7"],\ ["pinia-plugin-persist", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:1.0.0"],\ ["pug", "npm:3.0.2"],\ - ["sass", "npm:1.62.1"],\ + ["sass", "npm:1.72.0"],\ ["seedrandom", "npm:3.0.5"],\ ["select2", "npm:4.1.0-rc.0"],\ ["select2-bootstrap-5-theme", "npm:1.3.0"],\ ["send", "npm:0.18.0"],\ - ["shepherd.js", "npm:11.1.1"],\ + ["shepherd.js", "npm:11.2.0"],\ ["slugify", "npm:1.6.6"],\ - ["sortablejs", "npm:1.15.0"],\ - ["vanillajs-datepicker", "npm:1.3.1"],\ - ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.4"],\ - ["vue", "npm:3.2.47"],\ - ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.1.6"],\ + ["sortablejs", "npm:1.15.2"],\ + ["vanillajs-datepicker", "npm:1.3.4"],\ + ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3"],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\ + ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.0"],\ ["zxcvbn", "npm:4.4.2"]\ ],\ "linkType": "SOFT"\ @@ -7806,6 +8405,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["safe-array-concat", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/safe-array-concat-npm-1.0.1-8a42907bbf-001ecf1d8a.zip/node_modules/safe-array-concat/",\ + "packageDependencies": [\ + ["safe-array-concat", "npm:1.0.1"],\ + ["call-bind", "npm:1.0.2"],\ + ["get-intrinsic", "npm:1.2.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["isarray", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["safe-buffer", [\ ["npm:5.1.2", {\ "packageLocation": "./.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-f2f1f7943c.zip/node_modules/safe-buffer/",\ @@ -7854,10 +8466,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:1.62.1", {\ - "packageLocation": "./.yarn/cache/sass-npm-1.62.1-c16d65fd28-1b1b3584b3.zip/node_modules/sass/",\ + ["npm:1.72.0", {\ + "packageLocation": "./.yarn/cache/sass-npm-1.72.0-fb38bb530c-f420079c7d.zip/node_modules/sass/",\ "packageDependencies": [\ - ["sass", "npm:1.62.1"],\ + ["sass", "npm:1.72.0"],\ ["chokidar", "npm:3.5.3"],\ ["immutable", "npm:4.0.0"],\ ["source-map-js", "npm:1.0.2"]\ @@ -7875,18 +8487,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["seemly", [\ - ["npm:0.3.3", {\ - "packageLocation": "./.yarn/cache/seemly-npm-0.3.3-1df3254399-b6445553f8.zip/node_modules/seemly/",\ + ["npm:0.3.6", {\ + "packageLocation": "./.yarn/cache/seemly-npm-0.3.6-87ae398976-56d0472d99.zip/node_modules/seemly/",\ "packageDependencies": [\ - ["seemly", "npm:0.3.3"],\ - ["@types/jest", "npm:27.4.1"]\ + ["seemly", "npm:0.3.6"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:0.3.6", {\ - "packageLocation": "./.yarn/cache/seemly-npm-0.3.6-87ae398976-56d0472d99.zip/node_modules/seemly/",\ + ["npm:0.3.8", {\ + "packageLocation": "./.yarn/cache/seemly-npm-0.3.8-4940336497-98171fd4d9.zip/node_modules/seemly/",\ "packageDependencies": [\ - ["seemly", "npm:0.3.6"]\ + ["seemly", "npm:0.3.8"]\ ],\ "linkType": "HARD"\ }]\ @@ -7926,6 +8537,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ + ["npm:6.3.1", {\ + "packageLocation": "./.yarn/cache/semver-npm-6.3.1-bcba31fdbe-ae47d06de2.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:6.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:7.3.7", {\ "packageLocation": "./.yarn/cache/semver-npm-7.3.7-3bfe704194-2fa3e87756.zip/node_modules/semver/",\ "packageDependencies": [\ @@ -7934,10 +8552,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:7.3.8", {\ - "packageLocation": "./.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip/node_modules/semver/",\ + ["npm:7.5.3", {\ + "packageLocation": "./.yarn/cache/semver-npm-7.5.3-275095dbf3-9d58db1652.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:7.5.3"],\ + ["lru-cache", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.5.4", {\ + "packageLocation": "./.yarn/cache/semver-npm-7.5.4-c4ad957fcd-12d8ad952f.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:7.5.4"],\ + ["lru-cache", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.6.0", {\ + "packageLocation": "./.yarn/cache/semver-npm-7.6.0-f4630729f6-7427f05b70.zip/node_modules/semver/",\ "packageDependencies": [\ - ["semver", "npm:7.3.8"],\ + ["semver", "npm:7.6.0"],\ ["lru-cache", "npm:6.0.0"]\ ],\ "linkType": "HARD"\ @@ -7974,6 +8608,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["set-function-length", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/set-function-length-npm-1.1.1-d362bf8221-c131d7569c.zip/node_modules/set-function-length/",\ + "packageDependencies": [\ + ["set-function-length", "npm:1.1.1"],\ + ["define-data-property", "npm:1.1.1"],\ + ["get-intrinsic", "npm:1.2.1"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["set-function-name", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/set-function-name-npm-2.0.1-a9f970eea0-4975d17d90.zip/node_modules/set-function-name/",\ + "packageDependencies": [\ + ["set-function-name", "npm:2.0.1"],\ + ["define-data-property", "npm:1.1.1"],\ + ["functions-have-names", "npm:1.2.3"],\ + ["has-property-descriptors", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["setprototypeof", [\ ["npm:1.2.0", {\ "packageLocation": "./.yarn/cache/setprototypeof-npm-1.2.0-0fedbdcd3a-be18cbbf70.zip/node_modules/setprototypeof/",\ @@ -8003,11 +8662,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["shepherd.js", [\ - ["npm:11.1.1", {\ - "packageLocation": "./.yarn/cache/shepherd.js-npm-11.1.1-c87ab2ed73-1d2a0563b6.zip/node_modules/shepherd.js/",\ + ["npm:11.2.0", {\ + "packageLocation": "./.yarn/cache/shepherd.js-npm-11.2.0-94b9af1487-0e71e63e51.zip/node_modules/shepherd.js/",\ "packageDependencies": [\ - ["shepherd.js", "npm:11.1.1"],\ - ["@floating-ui/dom", "npm:1.2.6"],\ + ["shepherd.js", "npm:11.2.0"],\ + ["@floating-ui/dom", "npm:1.5.2"],\ ["deepmerge", "npm:4.3.1"]\ ],\ "linkType": "HARD"\ @@ -8092,10 +8751,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["sortablejs", [\ - ["npm:1.15.0", {\ - "packageLocation": "./.yarn/cache/sortablejs-npm-1.15.0-f3a393abcc-bb82223a66.zip/node_modules/sortablejs/",\ + ["npm:1.15.2", {\ + "packageLocation": "./.yarn/cache/sortablejs-npm-1.15.2-73347ae85a-36b20b144f.zip/node_modules/sortablejs/",\ "packageDependencies": [\ - ["sortablejs", "npm:1.15.0"]\ + ["sortablejs", "npm:1.15.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -8118,26 +8777,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["source-map-support", [\ - ["npm:0.5.21", {\ - "packageLocation": "./.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip/node_modules/source-map-support/",\ - "packageDependencies": [\ - ["source-map-support", "npm:0.5.21"],\ - ["buffer-from", "npm:1.1.2"],\ - ["source-map", "npm:0.6.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["sourcemap-codec", [\ - ["npm:1.4.8", {\ - "packageLocation": "./.yarn/cache/sourcemap-codec-npm-1.4.8-3a1a9e60b1-b57981c056.zip/node_modules/sourcemap-codec/",\ - "packageDependencies": [\ - ["sourcemap-codec", "npm:1.4.8"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["srcset", [\ ["npm:4.0.0", {\ "packageLocation": "./.yarn/cache/srcset-npm-4.0.0-4e99d43236-aceb898c92.zip/node_modules/srcset/",\ @@ -8206,26 +8845,38 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["string.prototype.trim", [\ + ["npm:1.2.8", {\ + "packageLocation": "./.yarn/cache/string.prototype.trim-npm-1.2.8-7ed4517ce8-49eb1a862a.zip/node_modules/string.prototype.trim/",\ + "packageDependencies": [\ + ["string.prototype.trim", "npm:1.2.8"],\ + ["call-bind", "npm:1.0.2"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["string.prototype.trimend", [\ - ["npm:1.0.6", {\ - "packageLocation": "./.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-0fdc34645a.zip/node_modules/string.prototype.trimend/",\ + ["npm:1.0.7", {\ + "packageLocation": "./.yarn/cache/string.prototype.trimend-npm-1.0.7-159b9dcfbc-2375516272.zip/node_modules/string.prototype.trimend/",\ "packageDependencies": [\ - ["string.prototype.trimend", "npm:1.0.6"],\ + ["string.prototype.trimend", "npm:1.0.7"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.4"],\ - ["es-abstract", "npm:1.21.1"]\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["string.prototype.trimstart", [\ - ["npm:1.0.6", {\ - "packageLocation": "./.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-89080feef4.zip/node_modules/string.prototype.trimstart/",\ + ["npm:1.0.7", {\ + "packageLocation": "./.yarn/cache/string.prototype.trimstart-npm-1.0.7-ae2f803b78-13d0c2cb0d.zip/node_modules/string.prototype.trimstart/",\ "packageDependencies": [\ - ["string.prototype.trimstart", "npm:1.0.6"],\ + ["string.prototype.trimstart", "npm:1.0.7"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.4"],\ - ["es-abstract", "npm:1.21.1"]\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.22.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -8343,19 +8994,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["terser", [\ - ["npm:5.16.5", {\ - "packageLocation": "./.yarn/cache/terser-npm-5.16.5-b3f4101afe-f2c1a087fa.zip/node_modules/terser/",\ - "packageDependencies": [\ - ["terser", "npm:5.16.5"],\ - ["@jridgewell/source-map", "npm:0.3.2"],\ - ["acorn", "npm:8.7.1"],\ - ["commander", "npm:2.20.3"],\ - ["source-map-support", "npm:0.5.21"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["test-exclude", [\ ["npm:6.0.0", {\ "packageLocation": "./.yarn/cache/test-exclude-npm-6.0.0-3fb03d69df-3b34a3d771.zip/node_modules/test-exclude/",\ @@ -8433,10 +9071,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["tsconfig-paths", [\ - ["npm:3.14.1", {\ - "packageLocation": "./.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip/node_modules/tsconfig-paths/",\ + ["npm:3.15.0", {\ + "packageLocation": "./.yarn/cache/tsconfig-paths-npm-3.15.0-ff68930e0e-59f35407a3.zip/node_modules/tsconfig-paths/",\ "packageDependencies": [\ - ["tsconfig-paths", "npm:3.14.1"],\ + ["tsconfig-paths", "npm:3.15.0"],\ ["@types/json5", "npm:0.0.29"],\ ["json5", "npm:1.0.2"],\ ["minimist", "npm:1.2.6"],\ @@ -8473,6 +9111,45 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["typed-array-buffer", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/typed-array-buffer-npm-1.0.0-95cb610310-3e0281c79b.zip/node_modules/typed-array-buffer/",\ + "packageDependencies": [\ + ["typed-array-buffer", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.2"],\ + ["get-intrinsic", "npm:1.2.1"],\ + ["is-typed-array", "npm:1.1.10"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-byte-length", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/typed-array-byte-length-npm-1.0.0-94d79975ca-b03db16458.zip/node_modules/typed-array-byte-length/",\ + "packageDependencies": [\ + ["typed-array-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.2"],\ + ["for-each", "npm:0.3.3"],\ + ["has-proto", "npm:1.0.1"],\ + ["is-typed-array", "npm:1.1.10"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-byte-offset", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/typed-array-byte-offset-npm-1.0.0-8cbb911cf5-04f6f02d0e.zip/node_modules/typed-array-byte-offset/",\ + "packageDependencies": [\ + ["typed-array-byte-offset", "npm:1.0.0"],\ + ["available-typed-arrays", "npm:1.0.5"],\ + ["call-bind", "npm:1.0.2"],\ + ["for-each", "npm:0.3.3"],\ + ["has-proto", "npm:1.0.1"],\ + ["is-typed-array", "npm:1.1.10"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["typed-array-length", [\ ["npm:1.0.4", {\ "packageLocation": "./.yarn/cache/typed-array-length-npm-1.0.4-92771b81fc-2228febc93.zip/node_modules/typed-array-length/",\ @@ -8546,15 +9223,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["v8-compile-cache", [\ - ["npm:2.3.0", {\ - "packageLocation": "./.yarn/cache/v8-compile-cache-npm-2.3.0-961375f150-adb0a271ea.zip/node_modules/v8-compile-cache/",\ - "packageDependencies": [\ - ["v8-compile-cache", "npm:2.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["v8-to-istanbul", [\ ["npm:9.0.1", {\ "packageLocation": "./.yarn/cache/v8-to-istanbul-npm-9.0.1-58bbce7857-a49c34bf0a.zip/node_modules/v8-to-istanbul/",\ @@ -8568,10 +9236,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["vanillajs-datepicker", [\ - ["npm:1.3.1", {\ - "packageLocation": "./.yarn/cache/vanillajs-datepicker-npm-1.3.1-75a9d66ea4-c01ea7ec70.zip/node_modules/vanillajs-datepicker/",\ + ["npm:1.3.4", {\ + "packageLocation": "./.yarn/cache/vanillajs-datepicker-npm-1.3.4-bc86e15a9c-830958f8af.zip/node_modules/vanillajs-datepicker/",\ "packageDependencies": [\ - ["vanillajs-datepicker", "npm:1.3.1"]\ + ["vanillajs-datepicker", "npm:1.3.4"]\ ],\ "linkType": "HARD"\ }]\ @@ -8584,13 +9252,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.1.8", {\ - "packageLocation": "./.yarn/__virtual__/vdirs-virtual-f3d9f623fd/0/cache/vdirs-npm-0.1.8-59a32a98d6-a7be8ccad3.zip/node_modules/vdirs/",\ + ["virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.1.8", {\ + "packageLocation": "./.yarn/__virtual__/vdirs-virtual-6e8e27ef7d/0/cache/vdirs-npm-0.1.8-59a32a98d6-a7be8ccad3.zip/node_modules/vdirs/",\ "packageDependencies": [\ - ["vdirs", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.1.8"],\ + ["vdirs", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.1.8"],\ ["@types/vue", null],\ ["evtd", "npm:0.2.3"],\ - ["vue", "npm:3.2.47"]\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -8600,41 +9268,45 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["vite", [\ - ["npm:4.3.4", {\ - "packageLocation": "./.yarn/cache/vite-npm-4.3.4-4744edd48c-90ce3923ef.zip/node_modules/vite/",\ + ["npm:4.5.3", {\ + "packageLocation": "./.yarn/cache/vite-npm-4.5.3-5cedc7cb8f-fd3f512ce4.zip/node_modules/vite/",\ "packageDependencies": [\ - ["vite", "npm:4.3.4"]\ + ["vite", "npm:4.5.3"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.4", {\ - "packageLocation": "./.yarn/__virtual__/vite-virtual-610e3576a6/0/cache/vite-npm-4.3.4-4744edd48c-90ce3923ef.zip/node_modules/vite/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3", {\ + "packageLocation": "./.yarn/__virtual__/vite-virtual-69c30fd9fd/0/cache/vite-npm-4.5.3-5cedc7cb8f-fd3f512ce4.zip/node_modules/vite/",\ "packageDependencies": [\ - ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.4"],\ + ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3"],\ ["@types/less", null],\ + ["@types/lightningcss", null],\ ["@types/node", null],\ ["@types/sass", null],\ ["@types/stylus", null],\ ["@types/sugarss", null],\ ["@types/terser", null],\ - ["esbuild", "npm:0.17.13"],\ + ["esbuild", "npm:0.18.20"],\ ["fsevents", "patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7"],\ ["less", null],\ - ["postcss", "npm:8.4.23"],\ - ["rollup", "npm:3.21.6"],\ - ["sass", "npm:1.62.1"],\ + ["lightningcss", null],\ + ["postcss", "npm:8.4.33"],\ + ["rollup", "npm:3.29.4"],\ + ["sass", "npm:1.72.0"],\ ["stylus", null],\ ["sugarss", null],\ ["terser", null]\ ],\ "packagePeers": [\ "@types/less",\ + "@types/lightningcss",\ "@types/node",\ "@types/sass",\ "@types/stylus",\ "@types/sugarss",\ "@types/terser",\ "less",\ + "lightningcss",\ "sass",\ "stylus",\ "sugarss",\ @@ -8652,6 +9324,46 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["volar-service-html", [\ + ["npm:0.0.34", {\ + "packageLocation": "./.yarn/cache/volar-service-html-npm-0.0.34-32b6d24136-83b50cd805.zip/node_modules/volar-service-html/",\ + "packageDependencies": [\ + ["volar-service-html", "npm:0.0.34"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:6f5429e17c4ecd390af605a4e97ecc7b34f2f1374a5e30c21f0a978cbdc904738a42d0d6f5d44d2e969250218b3c205853d6afefd88b87bcda877286d12bef83#npm:0.0.34", {\ + "packageLocation": "./.yarn/__virtual__/volar-service-html-virtual-5a9107a24d/0/cache/volar-service-html-npm-0.0.34-32b6d24136-83b50cd805.zip/node_modules/volar-service-html/",\ + "packageDependencies": [\ + ["volar-service-html", "virtual:6f5429e17c4ecd390af605a4e97ecc7b34f2f1374a5e30c21f0a978cbdc904738a42d0d6f5d44d2e969250218b3c205853d6afefd88b87bcda877286d12bef83#npm:0.0.34"],\ + ["@types/volar__language-service", null],\ + ["@volar/language-service", "npm:2.1.4"],\ + ["vscode-html-languageservice", "npm:5.1.2"],\ + ["vscode-languageserver-textdocument", "npm:1.0.11"],\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "packagePeers": [\ + "@types/volar__language-service",\ + "@volar/language-service"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["volar-service-pug", [\ + ["npm:0.0.34", {\ + "packageLocation": "./.yarn/cache/volar-service-pug-npm-0.0.34-6f5429e17c-4691aa1c8e.zip/node_modules/volar-service-pug/",\ + "packageDependencies": [\ + ["volar-service-pug", "npm:0.0.34"],\ + ["@volar/language-service", "npm:2.1.4"],\ + ["pug-lexer", "npm:5.0.1"],\ + ["pug-parser", "npm:6.0.0"],\ + ["volar-service-html", "virtual:6f5429e17c4ecd390af605a4e97ecc7b34f2f1374a5e30c21f0a978cbdc904738a42d0d6f5d44d2e969250218b3c205853d6afefd88b87bcda877286d12bef83#npm:0.0.34"],\ + ["vscode-html-languageservice", "npm:5.1.2"],\ + ["vscode-languageserver-textdocument", "npm:1.0.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["vooks", [\ ["npm:0.2.12", {\ "packageLocation": "./.yarn/cache/vooks-npm-0.2.12-0d1a2d856b-e6841ec5b6.zip/node_modules/vooks/",\ @@ -8660,13 +9372,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.2.12", {\ - "packageLocation": "./.yarn/__virtual__/vooks-virtual-f44f5b55b4/0/cache/vooks-npm-0.2.12-0d1a2d856b-e6841ec5b6.zip/node_modules/vooks/",\ + ["virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.2.12", {\ + "packageLocation": "./.yarn/__virtual__/vooks-virtual-ca0a47c4bf/0/cache/vooks-npm-0.2.12-0d1a2d856b-e6841ec5b6.zip/node_modules/vooks/",\ "packageDependencies": [\ - ["vooks", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.2.12"],\ + ["vooks", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.2.12"],\ ["@types/vue", null],\ ["evtd", "npm:0.2.3"],\ - ["vue", "npm:3.2.47"]\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -8675,16 +9387,89 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["vscode-html-languageservice", [\ + ["npm:5.1.2", {\ + "packageLocation": "./.yarn/cache/vscode-html-languageservice-npm-5.1.2-2ea2618bdd-3a2a5ee5ad.zip/node_modules/vscode-html-languageservice/",\ + "packageDependencies": [\ + ["vscode-html-languageservice", "npm:5.1.2"],\ + ["@vscode/l10n", "npm:0.0.18"],\ + ["vscode-languageserver-textdocument", "npm:1.0.11"],\ + ["vscode-languageserver-types", "npm:3.17.5"],\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-jsonrpc", [\ + ["npm:8.2.0", {\ + "packageLocation": "./.yarn/cache/vscode-jsonrpc-npm-8.2.0-b7d2e5b553-f302a01e59.zip/node_modules/vscode-jsonrpc/",\ + "packageDependencies": [\ + ["vscode-jsonrpc", "npm:8.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-languageserver-protocol", [\ + ["npm:3.17.5", {\ + "packageLocation": "./.yarn/cache/vscode-languageserver-protocol-npm-3.17.5-2b07e16989-dfb42d276d.zip/node_modules/vscode-languageserver-protocol/",\ + "packageDependencies": [\ + ["vscode-languageserver-protocol", "npm:3.17.5"],\ + ["vscode-jsonrpc", "npm:8.2.0"],\ + ["vscode-languageserver-types", "npm:3.17.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-languageserver-textdocument", [\ + ["npm:1.0.11", {\ + "packageLocation": "./.yarn/cache/vscode-languageserver-textdocument-npm-1.0.11-6fc94d2b7b-ea7cdc9d4f.zip/node_modules/vscode-languageserver-textdocument/",\ + "packageDependencies": [\ + ["vscode-languageserver-textdocument", "npm:1.0.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-languageserver-types", [\ + ["npm:3.17.5", {\ + "packageLocation": "./.yarn/cache/vscode-languageserver-types-npm-3.17.5-aca3b71a5a-79b420e757.zip/node_modules/vscode-languageserver-types/",\ + "packageDependencies": [\ + ["vscode-languageserver-types", "npm:3.17.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-uri", [\ + ["npm:3.0.8", {\ + "packageLocation": "./.yarn/cache/vscode-uri-npm-3.0.8-56f46b9d24-5142491268.zip/node_modules/vscode-uri/",\ + "packageDependencies": [\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["vue", [\ - ["npm:3.2.47", {\ - "packageLocation": "./.yarn/cache/vue-npm-3.2.47-487db916e1-3b586f61fd.zip/node_modules/vue/",\ + ["npm:3.4.21", {\ + "packageLocation": "./.yarn/cache/vue-npm-3.4.21-02110aa6d9-3c477982a0.zip/node_modules/vue/",\ + "packageDependencies": [\ + ["vue", "npm:3.4.21"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21", {\ + "packageLocation": "./.yarn/__virtual__/vue-virtual-b79af6274d/0/cache/vue-npm-3.4.21-02110aa6d9-3c477982a0.zip/node_modules/vue/",\ "packageDependencies": [\ - ["vue", "npm:3.2.47"],\ - ["@vue/compiler-dom", "npm:3.2.47"],\ - ["@vue/compiler-sfc", "npm:3.2.47"],\ - ["@vue/runtime-dom", "npm:3.2.47"],\ - ["@vue/server-renderer", "virtual:487db916e160a571ff50687ed972004ec0078aa76b7fedf7bdabfd607dfed3ba7b2d1f51e99387f885501b4dbb11471c0ce20d647adb7ae38656bbc259642ae8#npm:3.2.47"],\ - ["@vue/shared", "npm:3.2.47"]\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\ + ["@types/typescript", null],\ + ["@vue/compiler-dom", "npm:3.4.21"],\ + ["@vue/compiler-sfc", "npm:3.4.21"],\ + ["@vue/runtime-dom", "npm:3.4.21"],\ + ["@vue/server-renderer", "virtual:b79af6274dddda2b283f42be2b827e30c3e5389bce2938ee73bdb74ee9781811fc079c6836719e57940708d59b3beeb14d9e3c12f37f2d22582a53e6c32e4c97#npm:3.4.21"],\ + ["@vue/shared", "npm:3.4.21"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ ],\ "linkType": "HARD"\ }]\ @@ -8697,21 +9482,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["npm:0.13.1", {\ - "packageLocation": "./.yarn/unplugged/vue-demi-virtual-89e28ee82b/node_modules/vue-demi/",\ + ["npm:0.14.5", {\ + "packageLocation": "./.yarn/unplugged/vue-demi-virtual-b0e571907e/node_modules/vue-demi/",\ "packageDependencies": [\ - ["vue-demi", "npm:0.13.1"]\ + ["vue-demi", "npm:0.14.5"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:9f965060eafe5d7d052212cc7fd6fef913db724957f695b650ecef8b5179ad752b46bfcd2beb1965c04a72ea327c1241f8e860a445f77aaf193b4f78ba29f8b4#npm:0.13.1", {\ - "packageLocation": "./.yarn/unplugged/vue-demi-virtual-89e28ee82b/node_modules/vue-demi/",\ + ["virtual:cf6f7439ee76dfd2e7f8f2565ae847d76901434fc49c65702190cdf3d1c61e61c701a5c45b514c4bdeacb8f4bcac9c8a98bd4db3d0bc8e403d9e8db2cf14372a#npm:0.14.5", {\ + "packageLocation": "./.yarn/unplugged/vue-demi-virtual-b0e571907e/node_modules/vue-demi/",\ "packageDependencies": [\ - ["vue-demi", "virtual:9f965060eafe5d7d052212cc7fd6fef913db724957f695b650ecef8b5179ad752b46bfcd2beb1965c04a72ea327c1241f8e860a445f77aaf193b4f78ba29f8b4#npm:0.13.1"],\ + ["vue-demi", "virtual:cf6f7439ee76dfd2e7f8f2565ae847d76901434fc49c65702190cdf3d1c61e61c701a5c45b514c4bdeacb8f4bcac9c8a98bd4db3d0bc8e403d9e8db2cf14372a#npm:0.14.5"],\ ["@types/vue", null],\ ["@types/vue__composition-api", null],\ ["@vue/composition-api", null],\ - ["vue", "npm:3.2.47"]\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -8728,7 +9513,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/vue", null],\ ["@types/vue__composition-api", null],\ ["@vue/composition-api", null],\ - ["vue", "npm:3.2.47"]\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -8740,20 +9525,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["vue-eslint-parser", [\ - ["npm:9.0.3", {\ - "packageLocation": "./.yarn/cache/vue-eslint-parser-npm-9.0.3-1d52721799-61248eb504.zip/node_modules/vue-eslint-parser/",\ + ["npm:9.4.2", {\ + "packageLocation": "./.yarn/cache/vue-eslint-parser-npm-9.4.2-3e4e696025-67f14c8ea1.zip/node_modules/vue-eslint-parser/",\ "packageDependencies": [\ - ["vue-eslint-parser", "npm:9.0.3"]\ + ["vue-eslint-parser", "npm:9.4.2"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:b496f670e3acb84cc194f988fd3fa15eff7479fe9212e466815f1d307efda1d2ed5782452f48c17f7b772004bd86fa771d60b67ce1881c71b828caf6fc2a9603#npm:9.0.3", {\ - "packageLocation": "./.yarn/__virtual__/vue-eslint-parser-virtual-a1ca4a04bf/0/cache/vue-eslint-parser-npm-9.0.3-1d52721799-61248eb504.zip/node_modules/vue-eslint-parser/",\ + ["virtual:e080dd5dc65fb3541eb98fd929c3a1d3733f3aff4bb24b09a6b5cce9fba4a29aca07e286ef93079f2144caa0fd33bb6545549286d3a9f2b9a211caa1f4b68ff9#npm:9.4.2", {\ + "packageLocation": "./.yarn/__virtual__/vue-eslint-parser-virtual-f703c550a2/0/cache/vue-eslint-parser-npm-9.4.2-3e4e696025-67f14c8ea1.zip/node_modules/vue-eslint-parser/",\ "packageDependencies": [\ - ["vue-eslint-parser", "virtual:b496f670e3acb84cc194f988fd3fa15eff7479fe9212e466815f1d307efda1d2ed5782452f48c17f7b772004bd86fa771d60b67ce1881c71b828caf6fc2a9603#npm:9.0.3"],\ + ["vue-eslint-parser", "virtual:e080dd5dc65fb3541eb98fd929c3a1d3733f3aff4bb24b09a6b5cce9fba4a29aca07e286ef93079f2144caa0fd33bb6545549286d3a9f2b9a211caa1f4b68ff9#npm:9.4.2"],\ ["@types/eslint", null],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ - ["eslint", "npm:8.39.0"],\ + ["eslint", "npm:8.57.0"],\ ["eslint-scope", "npm:7.1.1"],\ ["eslint-visitor-keys", "npm:3.3.0"],\ ["espree", "npm:9.3.2"],\ @@ -8769,20 +9554,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["vue-router", [\ - ["npm:4.1.6", {\ - "packageLocation": "./.yarn/cache/vue-router-npm-4.1.6-ccab7109e1-c7f0156ac0.zip/node_modules/vue-router/",\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/vue-router-npm-4.3.0-b765d40138-0059261d39.zip/node_modules/vue-router/",\ "packageDependencies": [\ - ["vue-router", "npm:4.1.6"]\ + ["vue-router", "npm:4.3.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.1.6", {\ - "packageLocation": "./.yarn/__virtual__/vue-router-virtual-670ec833a5/0/cache/vue-router-npm-4.1.6-ccab7109e1-c7f0156ac0.zip/node_modules/vue-router/",\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.0", {\ + "packageLocation": "./.yarn/__virtual__/vue-router-virtual-82f54143bf/0/cache/vue-router-npm-4.3.0-b765d40138-0059261d39.zip/node_modules/vue-router/",\ "packageDependencies": [\ - ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.1.6"],\ + ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.0"],\ ["@types/vue", null],\ - ["@vue/devtools-api", "npm:6.4.5"],\ - ["vue", "npm:3.2.47"]\ + ["@vue/devtools-api", "npm:6.6.1"],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -8792,26 +9577,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["vueuc", [\ - ["npm:0.4.47", {\ - "packageLocation": "./.yarn/cache/vueuc-npm-0.4.47-ad081ddd15-b82b77a882.zip/node_modules/vueuc/",\ + ["npm:0.4.58", {\ + "packageLocation": "./.yarn/cache/vueuc-npm-0.4.58-be5584770c-fb0b9a69be.zip/node_modules/vueuc/",\ "packageDependencies": [\ - ["vueuc", "npm:0.4.47"]\ + ["vueuc", "npm:0.4.58"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.4.47", {\ - "packageLocation": "./.yarn/__virtual__/vueuc-virtual-326ef48c83/0/cache/vueuc-npm-0.4.47-ad081ddd15-b82b77a882.zip/node_modules/vueuc/",\ + ["virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.4.58", {\ + "packageLocation": "./.yarn/__virtual__/vueuc-virtual-2366be83ef/0/cache/vueuc-npm-0.4.58-be5584770c-fb0b9a69be.zip/node_modules/vueuc/",\ "packageDependencies": [\ - ["vueuc", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.4.47"],\ - ["@css-render/vue3-ssr", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.15.10"],\ + ["vueuc", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.4.58"],\ + ["@css-render/vue3-ssr", "virtual:2366be83ef58a728ebb5a5e9ed4600f4465f98b2a844262fcfbe89415361d5d5f9e964ec3b9a72d6a5004f37c1024d017c65e67473dd9cc39cd61f51768c65e6#npm:0.15.10"],\ ["@juggle/resize-observer", "npm:3.3.1"],\ ["@types/vue", null],\ ["css-render", "npm:0.15.10"],\ - ["evtd", "npm:0.2.3"],\ - ["seemly", "npm:0.3.3"],\ - ["vdirs", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.1.8"],\ - ["vooks", "virtual:4fa5810747c131dcf20cc36c17e835ba5fa42265b3b1f99a6712420e8672195f31ac73d077125c82af29bde6232df6ecc61b1f3ff0dde337b62085ef712e7d6a#npm:0.2.12"],\ - ["vue", "npm:3.2.47"]\ + ["evtd", "npm:0.2.4"],\ + ["seemly", "npm:0.3.6"],\ + ["vdirs", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.1.8"],\ + ["vooks", "virtual:32fd9c861d759cd42dabb479e4fd652286369e629cc7ef63c9cf4f1af5387c64be25fafc985023ea8534b1ec1f4cc92e6c918c7f3b594aa0f8acad026c671a6a#npm:0.2.12"],\ + ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ],\ "packagePeers": [\ "@types/vue",\ @@ -8854,16 +9639,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["which-typed-array", [\ - ["npm:1.1.9", {\ - "packageLocation": "./.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-fe0178ca44.zip/node_modules/which-typed-array/",\ + ["npm:1.1.13", {\ + "packageLocation": "./.yarn/cache/which-typed-array-npm-1.1.13-92c18b4878-3828a0d5d7.zip/node_modules/which-typed-array/",\ "packageDependencies": [\ - ["which-typed-array", "npm:1.1.9"],\ + ["which-typed-array", "npm:1.1.13"],\ ["available-typed-arrays", "npm:1.0.5"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["for-each", "npm:0.3.3"],\ ["gopd", "npm:1.0.1"],\ - ["has-tostringtag", "npm:1.0.0"],\ - ["is-typed-array", "npm:1.1.10"]\ + ["has-tostringtag", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -8891,15 +9675,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["word-wrap", [\ - ["npm:1.2.3", {\ - "packageLocation": "./.yarn/cache/word-wrap-npm-1.2.3-7fb15ab002-30b48f91fc.zip/node_modules/word-wrap/",\ - "packageDependencies": [\ - ["word-wrap", "npm:1.2.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["wrap-ansi", [\ ["npm:7.0.0", {\ "packageLocation": "./.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-a790b846fd.zip/node_modules/wrap-ansi/",\ @@ -8977,26 +9752,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["yargs", [\ - ["npm:16.2.0", {\ - "packageLocation": "./.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip/node_modules/yargs/",\ + ["npm:17.7.2", {\ + "packageLocation": "./.yarn/cache/yargs-npm-17.7.2-80b62638e1-73b572e863.zip/node_modules/yargs/",\ "packageDependencies": [\ - ["yargs", "npm:16.2.0"],\ - ["cliui", "npm:7.0.4"],\ + ["yargs", "npm:17.7.2"],\ + ["cliui", "npm:8.0.1"],\ ["escalade", "npm:3.1.1"],\ ["get-caller-file", "npm:2.0.5"],\ ["require-directory", "npm:2.1.1"],\ ["string-width", "npm:4.2.3"],\ ["y18n", "npm:5.0.8"],\ - ["yargs-parser", "npm:20.2.9"]\ + ["yargs-parser", "npm:21.1.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["yargs-parser", [\ - ["npm:20.2.9", {\ - "packageLocation": "./.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip/node_modules/yargs-parser/",\ + ["npm:21.1.1", {\ + "packageLocation": "./.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-ed2d96a616.zip/node_modules/yargs-parser/",\ "packageDependencies": [\ - ["yargs-parser", "npm:20.2.9"]\ + ["yargs-parser", "npm:21.1.1"]\ ],\ "linkType": "HARD"\ }]\ diff --git a/.vscode/launch.json b/.vscode/launch.json index 8dfc1b9b7a3..227eb8f6155 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,7 +12,7 @@ "program": "${workspaceFolder}/ietf/manage.py", "args": [ "runserver", - "0.0.0.0:8000", + "0.0.0.0:8001", "--settings=settings_local" ], "django": true, @@ -30,7 +30,7 @@ "program": "${workspaceFolder}/ietf/manage.py", "args": [ "runserver", - "0.0.0.0:8000", + "0.0.0.0:8001", "--settings=settings_local_vite" ], "django": true, @@ -48,7 +48,7 @@ "program": "${workspaceFolder}/ietf/manage.py", "args": [ "runserver", - "0.0.0.0:8000", + "0.0.0.0:8001", "--settings=settings_local_debug" ], "django": true, diff --git a/.vscode/settings.json b/.vscode/settings.json index 6acc6412645..b323cd02f77 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,55 +1,61 @@ { - "taskExplorer.exclude": [ - "**/.vscode-test/**", - "**/bin/**", - "**/build/**", - "**/CompiledOutput/**", - "**/dist/**", - "**/doc/**", - "**/ext/**", - "**/out/**", - "**/output/**", - "**/packages/**", - "**/release/**", - "**/releases/**", - "**/samples/**", - "**/sdks/**", - "**/static/**", - "**/target/**", - "**/test/**", - "**/third_party/**", - "**/vendor/**", - "**/work/**", - "/workspace/bootstrap/nuget/MyGet.ps1" - ], - "taskExplorer.enableAnt": false, - "taskExplorer.enableAppPublisher": false, - "taskExplorer.enablePipenv": false, - "taskExplorer.enableBash": false, - "taskExplorer.enableBatch": false, - "taskExplorer.enableGradle": false, - "taskExplorer.enableGrunt": false, - "taskExplorer.enableGulp": false, - "taskExplorer.enablePerl": false, - "taskExplorer.enableMake": false, - "taskExplorer.enableMaven": false, - "taskExplorer.enableNsis": false, - "taskExplorer.enableNpm": false, - "taskExplorer.enablePowershell": false, - "taskExplorer.enablePython": false, - "taskExplorer.enableRuby": false, - "taskExplorer.enableTsc": false, - "taskExplorer.enableWorkspace": true, - "taskExplorer.enableExplorerView": false, - "taskExplorer.enableSideBar": true, - "search.exclude": { - "**/.yarn": true, - "**/.pnp.*": true - }, - "eslint.nodePath": ".yarn/sdks", - "eslint.validate": [ - "javascript", - "javascriptreact", - "vue" - ] + "taskExplorer.exclude": [ + "**/.vscode-test/**", + "**/bin/**", + "**/build/**", + "**/CompiledOutput/**", + "**/dist/**", + "**/doc/**", + "**/ext/**", + "**/out/**", + "**/output/**", + "**/packages/**", + "**/release/**", + "**/releases/**", + "**/samples/**", + "**/sdks/**", + "**/static/**", + "**/target/**", + "**/test/**", + "**/third_party/**", + "**/vendor/**", + "**/work/**", + "/workspace/bootstrap/nuget/MyGet.ps1" + ], + "taskExplorer.enabledTasks": { + "ant": false, + "bash": false, + "batch": false, + "composer": false, + "gradle": false, + "grunt": false, + "gulp": false, + "make": false, + "maven": false, + "npm": false, + "perl": false, + "pipenv": false, + "powershell": false, + "python": false, + "ruby": false, + "tsc": false + }, + "taskExplorer.enableExplorerView": false, + "taskExplorer.enableSideBar": true, + "taskExplorer.showLastTasks": false, + "search.exclude": { + "**/.yarn": true, + "**/.pnp.*": true + }, + "eslint.nodePath": ".yarn/sdks", + "eslint.validate": [ + "javascript", + "javascriptreact", + "vue" + ], + "python.linting.pylintArgs": ["--load-plugins", "pylint_django"], + "python.testing.pytestEnabled": false, + "python.testing.unittestEnabled": false, + "python.linting.enabled": true, + "python.terminal.shellIntegration.enabled": false } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 7e43a30f885..8b36b0e6ac9 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -48,7 +48,7 @@ "args": [ "${workspaceFolder}/ietf/manage.py", "test", - "--settings=settings_postgrestest" + "--settings=settings_test" ], "group": "test", "presentation": { @@ -68,7 +68,7 @@ "args": [ "${workspaceFolder}/ietf/manage.py", "test", - "--settings=settings_postgrestest", + "--settings=settings_test", "--pattern=tests_js.py" ], "group": "test", @@ -105,10 +105,11 @@ "command": "/usr/local/bin/python", "args": [ "-m", - "smtpd", + "aiosmtpd", "-n", "-c", - "DebuggingServer", + "ietf.utils.aiosmtpd.DevDebuggingHandler", + "-l", "localhost:2025" ], "presentation": { diff --git a/.yarn/cache/@aashutoshrathi-word-wrap-npm-1.2.6-5b1d95e487-ada901b9e7.zip b/.yarn/cache/@aashutoshrathi-word-wrap-npm-1.2.6-5b1d95e487-ada901b9e7.zip new file mode 100644 index 00000000000..9334304c2a2 Binary files /dev/null and b/.yarn/cache/@aashutoshrathi-word-wrap-npm-1.2.6-5b1d95e487-ada901b9e7.zip differ diff --git a/.yarn/cache/@babel-parser-npm-7.23.9-720a0b56cb-e7cd4960ac.zip b/.yarn/cache/@babel-parser-npm-7.23.9-720a0b56cb-e7cd4960ac.zip new file mode 100644 index 00000000000..7b6c44fc3f1 Binary files /dev/null and b/.yarn/cache/@babel-parser-npm-7.23.9-720a0b56cb-e7cd4960ac.zip differ diff --git a/.yarn/cache/@babel-runtime-npm-7.23.2-d013d6cf7e-6c4df4839e.zip b/.yarn/cache/@babel-runtime-npm-7.23.2-d013d6cf7e-6c4df4839e.zip new file mode 100644 index 00000000000..f0d44978579 Binary files /dev/null and b/.yarn/cache/@babel-runtime-npm-7.23.2-d013d6cf7e-6c4df4839e.zip differ diff --git a/.yarn/cache/@css-render-plugin-bem-npm-0.15.10-41ccecaa2f-cbab72a7b5.zip b/.yarn/cache/@css-render-plugin-bem-npm-0.15.10-41ccecaa2f-cbab72a7b5.zip deleted file mode 100644 index 7df7772871c..00000000000 Binary files a/.yarn/cache/@css-render-plugin-bem-npm-0.15.10-41ccecaa2f-cbab72a7b5.zip and /dev/null differ diff --git a/.yarn/cache/@css-render-plugin-bem-npm-0.15.12-bf8b43dc1f-9fa7ddd62b.zip b/.yarn/cache/@css-render-plugin-bem-npm-0.15.12-bf8b43dc1f-9fa7ddd62b.zip new file mode 100644 index 00000000000..7145fae1186 Binary files /dev/null and b/.yarn/cache/@css-render-plugin-bem-npm-0.15.12-bf8b43dc1f-9fa7ddd62b.zip differ diff --git a/.yarn/cache/@css-render-vue3-ssr-npm-0.15.12-a130f4db3a-a5505ae161.zip b/.yarn/cache/@css-render-vue3-ssr-npm-0.15.12-a130f4db3a-a5505ae161.zip new file mode 100644 index 00000000000..0e75f8a4c7e Binary files /dev/null and b/.yarn/cache/@css-render-vue3-ssr-npm-0.15.12-a130f4db3a-a5505ae161.zip differ diff --git a/.yarn/cache/@esbuild-darwin-arm64-npm-0.17.13-3c31ee9bef-8.zip b/.yarn/cache/@esbuild-darwin-arm64-npm-0.17.13-3c31ee9bef-8.zip deleted file mode 100644 index 90c4b9139a3..00000000000 Binary files a/.yarn/cache/@esbuild-darwin-arm64-npm-0.17.13-3c31ee9bef-8.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-darwin-arm64-npm-0.18.20-00b3504077-8.zip b/.yarn/cache/@esbuild-darwin-arm64-npm-0.18.20-00b3504077-8.zip new file mode 100644 index 00000000000..dfd7b765546 Binary files /dev/null and b/.yarn/cache/@esbuild-darwin-arm64-npm-0.18.20-00b3504077-8.zip differ diff --git a/.yarn/cache/@esbuild-darwin-x64-npm-0.17.13-2af4bfbe4a-8.zip b/.yarn/cache/@esbuild-darwin-x64-npm-0.17.13-2af4bfbe4a-8.zip deleted file mode 100644 index 13d316951e8..00000000000 Binary files a/.yarn/cache/@esbuild-darwin-x64-npm-0.17.13-2af4bfbe4a-8.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-darwin-x64-npm-0.18.20-767fe27d1b-8.zip b/.yarn/cache/@esbuild-darwin-x64-npm-0.18.20-767fe27d1b-8.zip new file mode 100644 index 00000000000..432802b69e8 Binary files /dev/null and b/.yarn/cache/@esbuild-darwin-x64-npm-0.18.20-767fe27d1b-8.zip differ diff --git a/.yarn/cache/@esbuild-linux-arm64-npm-0.17.13-533eb0e4eb-8.zip b/.yarn/cache/@esbuild-linux-arm64-npm-0.17.13-533eb0e4eb-8.zip deleted file mode 100644 index d69620a547d..00000000000 Binary files a/.yarn/cache/@esbuild-linux-arm64-npm-0.17.13-533eb0e4eb-8.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-linux-arm64-npm-0.18.20-7b48b328fe-8.zip b/.yarn/cache/@esbuild-linux-arm64-npm-0.18.20-7b48b328fe-8.zip new file mode 100644 index 00000000000..6eb51fcc998 Binary files /dev/null and b/.yarn/cache/@esbuild-linux-arm64-npm-0.18.20-7b48b328fe-8.zip differ diff --git a/.yarn/cache/@esbuild-linux-x64-npm-0.17.13-01575597b4-8.zip b/.yarn/cache/@esbuild-linux-x64-npm-0.17.13-01575597b4-8.zip deleted file mode 100644 index e8d42bffa6c..00000000000 Binary files a/.yarn/cache/@esbuild-linux-x64-npm-0.17.13-01575597b4-8.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-linux-x64-npm-0.18.20-de8e99b449-8.zip b/.yarn/cache/@esbuild-linux-x64-npm-0.18.20-de8e99b449-8.zip new file mode 100644 index 00000000000..bcbc77a84f4 Binary files /dev/null and b/.yarn/cache/@esbuild-linux-x64-npm-0.18.20-de8e99b449-8.zip differ diff --git a/.yarn/cache/@esbuild-win32-arm64-npm-0.17.13-cd496c2d1d-8.zip b/.yarn/cache/@esbuild-win32-arm64-npm-0.17.13-cd496c2d1d-8.zip deleted file mode 100644 index 233ca33f756..00000000000 Binary files a/.yarn/cache/@esbuild-win32-arm64-npm-0.17.13-cd496c2d1d-8.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-win32-arm64-npm-0.18.20-a58fe6c6a3-8.zip b/.yarn/cache/@esbuild-win32-arm64-npm-0.18.20-a58fe6c6a3-8.zip new file mode 100644 index 00000000000..cf9c15613b3 Binary files /dev/null and b/.yarn/cache/@esbuild-win32-arm64-npm-0.18.20-a58fe6c6a3-8.zip differ diff --git a/.yarn/cache/@esbuild-win32-x64-npm-0.17.13-29882f65f7-8.zip b/.yarn/cache/@esbuild-win32-x64-npm-0.17.13-29882f65f7-8.zip deleted file mode 100644 index 5e0f19912b2..00000000000 Binary files a/.yarn/cache/@esbuild-win32-x64-npm-0.17.13-29882f65f7-8.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-win32-x64-npm-0.18.20-37a9ab2bda-8.zip b/.yarn/cache/@esbuild-win32-x64-npm-0.18.20-37a9ab2bda-8.zip new file mode 100644 index 00000000000..768cc68f13c Binary files /dev/null and b/.yarn/cache/@esbuild-win32-x64-npm-0.18.20-37a9ab2bda-8.zip differ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-2a6e345429.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-2a6e345429.zip new file mode 100644 index 00000000000..7ef5a489734 Binary files /dev/null and b/.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-2a6e345429.zip differ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.4.1-44c7391499-db97d8d08e.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.4.1-44c7391499-db97d8d08e.zip deleted file mode 100644 index 7399004e87c..00000000000 Binary files a/.yarn/cache/@eslint-community-regexpp-npm-4.4.1-44c7391499-db97d8d08e.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.8.0-92ece47e3d-601e6d033d.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.8.0-92ece47e3d-601e6d033d.zip new file mode 100644 index 00000000000..0cbfbf8d840 Binary files /dev/null and b/.yarn/cache/@eslint-community-regexpp-npm-4.8.0-92ece47e3d-601e6d033d.zip differ diff --git a/.yarn/cache/@eslint-eslintrc-npm-2.0.2-d308674d86-cfcf5e12c7.zip b/.yarn/cache/@eslint-eslintrc-npm-2.0.2-d308674d86-cfcf5e12c7.zip deleted file mode 100644 index 5c48d0ca96e..00000000000 Binary files a/.yarn/cache/@eslint-eslintrc-npm-2.0.2-d308674d86-cfcf5e12c7.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-10957c7592.zip b/.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-10957c7592.zip new file mode 100644 index 00000000000..58788ff7a69 Binary files /dev/null and b/.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-10957c7592.zip differ diff --git a/.yarn/cache/@eslint-js-npm-8.39.0-558d35aa2d-63fe36e2bf.zip b/.yarn/cache/@eslint-js-npm-8.39.0-558d35aa2d-63fe36e2bf.zip deleted file mode 100644 index 8d2d49225c9..00000000000 Binary files a/.yarn/cache/@eslint-js-npm-8.39.0-558d35aa2d-63fe36e2bf.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-js-npm-8.57.0-00ead3710a-315dc65b0e.zip b/.yarn/cache/@eslint-js-npm-8.57.0-00ead3710a-315dc65b0e.zip new file mode 100644 index 00000000000..82eab16e7cf Binary files /dev/null and b/.yarn/cache/@eslint-js-npm-8.57.0-00ead3710a-315dc65b0e.zip differ diff --git a/.yarn/cache/@faker-js-faker-npm-7.6.0-fa135883e9-942af62217.zip b/.yarn/cache/@faker-js-faker-npm-7.6.0-fa135883e9-942af62217.zip deleted file mode 100644 index 1317dcc1a8d..00000000000 Binary files a/.yarn/cache/@faker-js-faker-npm-7.6.0-fa135883e9-942af62217.zip and /dev/null differ diff --git a/.yarn/cache/@floating-ui-core-npm-1.2.6-083bec342c-e4aa96c435.zip b/.yarn/cache/@floating-ui-core-npm-1.2.6-083bec342c-e4aa96c435.zip deleted file mode 100644 index 7f721669d59..00000000000 Binary files a/.yarn/cache/@floating-ui-core-npm-1.2.6-083bec342c-e4aa96c435.zip and /dev/null differ diff --git a/.yarn/cache/@floating-ui-core-npm-1.4.1-fe89c45d92-be4ab864fe.zip b/.yarn/cache/@floating-ui-core-npm-1.4.1-fe89c45d92-be4ab864fe.zip new file mode 100644 index 00000000000..e8ce36ae61f Binary files /dev/null and b/.yarn/cache/@floating-ui-core-npm-1.4.1-fe89c45d92-be4ab864fe.zip differ diff --git a/.yarn/cache/@floating-ui-dom-npm-1.2.6-9d4be07ec3-2226c6c244.zip b/.yarn/cache/@floating-ui-dom-npm-1.2.6-9d4be07ec3-2226c6c244.zip deleted file mode 100644 index ba1a82c7223..00000000000 Binary files a/.yarn/cache/@floating-ui-dom-npm-1.2.6-9d4be07ec3-2226c6c244.zip and /dev/null differ diff --git a/.yarn/cache/@floating-ui-dom-npm-1.5.2-f1b8ca0c30-3c71eed50b.zip b/.yarn/cache/@floating-ui-dom-npm-1.5.2-f1b8ca0c30-3c71eed50b.zip new file mode 100644 index 00000000000..a984181e2c0 Binary files /dev/null and b/.yarn/cache/@floating-ui-dom-npm-1.5.2-f1b8ca0c30-3c71eed50b.zip differ diff --git a/.yarn/cache/@floating-ui-utils-npm-0.1.2-22eefe56f0-3e29fd3c69.zip b/.yarn/cache/@floating-ui-utils-npm-0.1.2-22eefe56f0-3e29fd3c69.zip new file mode 100644 index 00000000000..ada2c49e446 Binary files /dev/null and b/.yarn/cache/@floating-ui-utils-npm-0.1.2-22eefe56f0-3e29fd3c69.zip differ diff --git a/.yarn/cache/@fullcalendar-bootstrap5-npm-6.1.11-6e0fbf281a-a0c3b94346.zip b/.yarn/cache/@fullcalendar-bootstrap5-npm-6.1.11-6e0fbf281a-a0c3b94346.zip new file mode 100644 index 00000000000..edc7da3b252 Binary files /dev/null and b/.yarn/cache/@fullcalendar-bootstrap5-npm-6.1.11-6e0fbf281a-a0c3b94346.zip differ diff --git a/.yarn/cache/@fullcalendar-bootstrap5-npm-6.1.6-3eb2f2a80e-09f2bdf7dc.zip b/.yarn/cache/@fullcalendar-bootstrap5-npm-6.1.6-3eb2f2a80e-09f2bdf7dc.zip deleted file mode 100644 index 82448f2e595..00000000000 Binary files a/.yarn/cache/@fullcalendar-bootstrap5-npm-6.1.6-3eb2f2a80e-09f2bdf7dc.zip and /dev/null differ diff --git a/.yarn/cache/@fullcalendar-core-npm-6.1.11-ae049c8ace-0078a6f96b.zip b/.yarn/cache/@fullcalendar-core-npm-6.1.11-ae049c8ace-0078a6f96b.zip new file mode 100644 index 00000000000..c9eee67d634 Binary files /dev/null and b/.yarn/cache/@fullcalendar-core-npm-6.1.11-ae049c8ace-0078a6f96b.zip differ diff --git a/.yarn/cache/@fullcalendar-core-npm-6.1.6-a28815a826-72ec698bd2.zip b/.yarn/cache/@fullcalendar-core-npm-6.1.6-a28815a826-72ec698bd2.zip deleted file mode 100644 index ca97c59c2c0..00000000000 Binary files a/.yarn/cache/@fullcalendar-core-npm-6.1.6-a28815a826-72ec698bd2.zip and /dev/null differ diff --git a/.yarn/cache/@fullcalendar-daygrid-npm-6.1.11-2187ca1b8f-6eb5606de5.zip b/.yarn/cache/@fullcalendar-daygrid-npm-6.1.11-2187ca1b8f-6eb5606de5.zip new file mode 100644 index 00000000000..3a7449a3a8c Binary files /dev/null and b/.yarn/cache/@fullcalendar-daygrid-npm-6.1.11-2187ca1b8f-6eb5606de5.zip differ diff --git a/.yarn/cache/@fullcalendar-daygrid-npm-6.1.6-13b72a08b0-e7b60e359b.zip b/.yarn/cache/@fullcalendar-daygrid-npm-6.1.6-13b72a08b0-e7b60e359b.zip deleted file mode 100644 index 28546a4017b..00000000000 Binary files a/.yarn/cache/@fullcalendar-daygrid-npm-6.1.6-13b72a08b0-e7b60e359b.zip and /dev/null differ diff --git a/.yarn/cache/@fullcalendar-icalendar-npm-6.1.11-73807e790d-4e6eff15a8.zip b/.yarn/cache/@fullcalendar-icalendar-npm-6.1.11-73807e790d-4e6eff15a8.zip new file mode 100644 index 00000000000..861ed1b3660 Binary files /dev/null and b/.yarn/cache/@fullcalendar-icalendar-npm-6.1.11-73807e790d-4e6eff15a8.zip differ diff --git a/.yarn/cache/@fullcalendar-icalendar-npm-6.1.6-8b28c6e7df-50d290346a.zip b/.yarn/cache/@fullcalendar-icalendar-npm-6.1.6-8b28c6e7df-50d290346a.zip deleted file mode 100644 index 77442c19e80..00000000000 Binary files a/.yarn/cache/@fullcalendar-icalendar-npm-6.1.6-8b28c6e7df-50d290346a.zip and /dev/null differ diff --git a/.yarn/cache/@fullcalendar-interaction-npm-6.1.11-39630596c7-c67d4cfa0b.zip b/.yarn/cache/@fullcalendar-interaction-npm-6.1.11-39630596c7-c67d4cfa0b.zip new file mode 100644 index 00000000000..b04343467b9 Binary files /dev/null and b/.yarn/cache/@fullcalendar-interaction-npm-6.1.11-39630596c7-c67d4cfa0b.zip differ diff --git a/.yarn/cache/@fullcalendar-interaction-npm-6.1.6-68ac4c3627-b7dea49059.zip b/.yarn/cache/@fullcalendar-interaction-npm-6.1.6-68ac4c3627-b7dea49059.zip deleted file mode 100644 index 5ef3e72602a..00000000000 Binary files a/.yarn/cache/@fullcalendar-interaction-npm-6.1.6-68ac4c3627-b7dea49059.zip and /dev/null differ diff --git a/.yarn/cache/@fullcalendar-list-npm-6.1.11-8f1846f302-84a8cd6e63.zip b/.yarn/cache/@fullcalendar-list-npm-6.1.11-8f1846f302-84a8cd6e63.zip new file mode 100644 index 00000000000..93cd34af81e Binary files /dev/null and b/.yarn/cache/@fullcalendar-list-npm-6.1.11-8f1846f302-84a8cd6e63.zip differ diff --git a/.yarn/cache/@fullcalendar-list-npm-6.1.6-ada94f2f8a-e5beb01c62.zip b/.yarn/cache/@fullcalendar-list-npm-6.1.6-ada94f2f8a-e5beb01c62.zip deleted file mode 100644 index 47074403e26..00000000000 Binary files a/.yarn/cache/@fullcalendar-list-npm-6.1.6-ada94f2f8a-e5beb01c62.zip and /dev/null differ diff --git a/.yarn/cache/@fullcalendar-luxon2-npm-6.1.6-514b9ce297-48d76dc556.zip b/.yarn/cache/@fullcalendar-luxon2-npm-6.1.6-514b9ce297-48d76dc556.zip deleted file mode 100644 index c9bff7378c2..00000000000 Binary files a/.yarn/cache/@fullcalendar-luxon2-npm-6.1.6-514b9ce297-48d76dc556.zip and /dev/null differ diff --git a/.yarn/cache/@fullcalendar-luxon3-npm-6.1.11-3e90656a71-8e7f45aab2.zip b/.yarn/cache/@fullcalendar-luxon3-npm-6.1.11-3e90656a71-8e7f45aab2.zip new file mode 100644 index 00000000000..6e717b3495d Binary files /dev/null and b/.yarn/cache/@fullcalendar-luxon3-npm-6.1.11-3e90656a71-8e7f45aab2.zip differ diff --git a/.yarn/cache/@fullcalendar-timegrid-npm-6.1.11-1d43455bfd-4a11e6dd90.zip b/.yarn/cache/@fullcalendar-timegrid-npm-6.1.11-1d43455bfd-4a11e6dd90.zip new file mode 100644 index 00000000000..917beeda690 Binary files /dev/null and b/.yarn/cache/@fullcalendar-timegrid-npm-6.1.11-1d43455bfd-4a11e6dd90.zip differ diff --git a/.yarn/cache/@fullcalendar-timegrid-npm-6.1.6-6c6109a419-ef79183dad.zip b/.yarn/cache/@fullcalendar-timegrid-npm-6.1.6-6c6109a419-ef79183dad.zip deleted file mode 100644 index ea839748d4a..00000000000 Binary files a/.yarn/cache/@fullcalendar-timegrid-npm-6.1.6-6c6109a419-ef79183dad.zip and /dev/null differ diff --git a/.yarn/cache/@fullcalendar-vue3-npm-6.1.11-f6b8b48da4-5891a596e9.zip b/.yarn/cache/@fullcalendar-vue3-npm-6.1.11-f6b8b48da4-5891a596e9.zip new file mode 100644 index 00000000000..3054aa761fa Binary files /dev/null and b/.yarn/cache/@fullcalendar-vue3-npm-6.1.11-f6b8b48da4-5891a596e9.zip differ diff --git a/.yarn/cache/@fullcalendar-vue3-npm-6.1.6-b1a9d6f44b-68fe3ce204.zip b/.yarn/cache/@fullcalendar-vue3-npm-6.1.6-b1a9d6f44b-68fe3ce204.zip deleted file mode 100644 index b64d739f4d4..00000000000 Binary files a/.yarn/cache/@fullcalendar-vue3-npm-6.1.6-b1a9d6f44b-68fe3ce204.zip and /dev/null differ diff --git a/.yarn/cache/@html-validate-stylish-npm-4.0.1-a5ee83fd48-89c83ea1ae.zip b/.yarn/cache/@html-validate-stylish-npm-4.0.1-a5ee83fd48-89c83ea1ae.zip deleted file mode 100644 index c7eff4b6c95..00000000000 Binary files a/.yarn/cache/@html-validate-stylish-npm-4.0.1-a5ee83fd48-89c83ea1ae.zip and /dev/null differ diff --git a/.yarn/cache/@html-validate-stylish-npm-4.1.0-aba0cf2d6c-4af90db4f9.zip b/.yarn/cache/@html-validate-stylish-npm-4.1.0-aba0cf2d6c-4af90db4f9.zip new file mode 100644 index 00000000000..d56d9f34cff Binary files /dev/null and b/.yarn/cache/@html-validate-stylish-npm-4.1.0-aba0cf2d6c-4af90db4f9.zip differ diff --git a/.yarn/cache/@humanwhocodes-config-array-npm-0.11.14-94a02fcc87-861ccce9ea.zip b/.yarn/cache/@humanwhocodes-config-array-npm-0.11.14-94a02fcc87-861ccce9ea.zip new file mode 100644 index 00000000000..166fee4b827 Binary files /dev/null and b/.yarn/cache/@humanwhocodes-config-array-npm-0.11.14-94a02fcc87-861ccce9ea.zip differ diff --git a/.yarn/cache/@humanwhocodes-config-array-npm-0.11.8-7955bfecc2-0fd6b3c54f.zip b/.yarn/cache/@humanwhocodes-config-array-npm-0.11.8-7955bfecc2-0fd6b3c54f.zip deleted file mode 100755 index dc21af1cbc7..00000000000 Binary files a/.yarn/cache/@humanwhocodes-config-array-npm-0.11.8-7955bfecc2-0fd6b3c54f.zip and /dev/null differ diff --git a/.yarn/cache/@humanwhocodes-object-schema-npm-1.2.1-eb622b5d0e-a824a1ec31.zip b/.yarn/cache/@humanwhocodes-object-schema-npm-1.2.1-eb622b5d0e-a824a1ec31.zip deleted file mode 100644 index 2b79104af59..00000000000 Binary files a/.yarn/cache/@humanwhocodes-object-schema-npm-1.2.1-eb622b5d0e-a824a1ec31.zip and /dev/null differ diff --git a/.yarn/cache/@humanwhocodes-object-schema-npm-2.0.2-77b42018f9-2fc1150336.zip b/.yarn/cache/@humanwhocodes-object-schema-npm-2.0.2-77b42018f9-2fc1150336.zip new file mode 100644 index 00000000000..cf6847cf44f Binary files /dev/null and b/.yarn/cache/@humanwhocodes-object-schema-npm-2.0.2-77b42018f9-2fc1150336.zip differ diff --git a/.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip b/.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip deleted file mode 100644 index e030e7e42fd..00000000000 Binary files a/.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip and /dev/null differ diff --git a/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip b/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip deleted file mode 100644 index 3b901fc14bc..00000000000 Binary files a/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip and /dev/null differ diff --git a/.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1b83f0eb94.zip b/.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1b83f0eb94.zip deleted file mode 100644 index cdc4bd0e2fd..00000000000 Binary files a/.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1b83f0eb94.zip and /dev/null differ diff --git a/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip b/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip new file mode 100644 index 00000000000..402f52b7ae2 Binary files /dev/null and b/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip differ diff --git a/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip b/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip deleted file mode 100644 index 29e13633c13..00000000000 Binary files a/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip and /dev/null differ diff --git a/.yarn/cache/@lmdb-lmdb-darwin-arm64-npm-2.8.5-a9ab00615c-8.zip b/.yarn/cache/@lmdb-lmdb-darwin-arm64-npm-2.8.5-a9ab00615c-8.zip new file mode 100644 index 00000000000..6df931b4afd Binary files /dev/null and b/.yarn/cache/@lmdb-lmdb-darwin-arm64-npm-2.8.5-a9ab00615c-8.zip differ diff --git a/.yarn/cache/@lmdb-lmdb-darwin-x64-npm-2.8.5-080b8c9329-8.zip b/.yarn/cache/@lmdb-lmdb-darwin-x64-npm-2.8.5-080b8c9329-8.zip new file mode 100644 index 00000000000..db77cafaeaf Binary files /dev/null and b/.yarn/cache/@lmdb-lmdb-darwin-x64-npm-2.8.5-080b8c9329-8.zip differ diff --git a/.yarn/cache/@lmdb-lmdb-linux-arm64-npm-2.8.5-9dfda9f24f-8.zip b/.yarn/cache/@lmdb-lmdb-linux-arm64-npm-2.8.5-9dfda9f24f-8.zip new file mode 100644 index 00000000000..d4522df85ef Binary files /dev/null and b/.yarn/cache/@lmdb-lmdb-linux-arm64-npm-2.8.5-9dfda9f24f-8.zip differ diff --git a/.yarn/cache/@lmdb-lmdb-linux-x64-npm-2.8.5-0f668ba9a7-8.zip b/.yarn/cache/@lmdb-lmdb-linux-x64-npm-2.8.5-0f668ba9a7-8.zip new file mode 100644 index 00000000000..8820ec421fe Binary files /dev/null and b/.yarn/cache/@lmdb-lmdb-linux-x64-npm-2.8.5-0f668ba9a7-8.zip differ diff --git a/.yarn/cache/@lmdb-lmdb-win32-x64-npm-2.8.5-3702de4edb-8.zip b/.yarn/cache/@lmdb-lmdb-win32-x64-npm-2.8.5-3702de4edb-8.zip new file mode 100644 index 00000000000..201d7cb1f17 Binary files /dev/null and b/.yarn/cache/@lmdb-lmdb-win32-x64-npm-2.8.5-3702de4edb-8.zip differ diff --git a/.yarn/cache/@msgpackr-extract-msgpackr-extract-darwin-arm64-npm-3.0.2-18ac236cc4-8.zip b/.yarn/cache/@msgpackr-extract-msgpackr-extract-darwin-arm64-npm-3.0.2-18ac236cc4-8.zip new file mode 100644 index 00000000000..06cbbf0cff3 Binary files /dev/null and b/.yarn/cache/@msgpackr-extract-msgpackr-extract-darwin-arm64-npm-3.0.2-18ac236cc4-8.zip differ diff --git a/.yarn/cache/@msgpackr-extract-msgpackr-extract-darwin-x64-npm-3.0.2-39dd07082a-8.zip b/.yarn/cache/@msgpackr-extract-msgpackr-extract-darwin-x64-npm-3.0.2-39dd07082a-8.zip new file mode 100644 index 00000000000..110c9561156 Binary files /dev/null and b/.yarn/cache/@msgpackr-extract-msgpackr-extract-darwin-x64-npm-3.0.2-39dd07082a-8.zip differ diff --git a/.yarn/cache/@msgpackr-extract-msgpackr-extract-linux-arm64-npm-3.0.2-cfbf50d4c6-8.zip b/.yarn/cache/@msgpackr-extract-msgpackr-extract-linux-arm64-npm-3.0.2-cfbf50d4c6-8.zip new file mode 100644 index 00000000000..ab2c36a442c Binary files /dev/null and b/.yarn/cache/@msgpackr-extract-msgpackr-extract-linux-arm64-npm-3.0.2-cfbf50d4c6-8.zip differ diff --git a/.yarn/cache/@msgpackr-extract-msgpackr-extract-linux-x64-npm-3.0.2-262fca760d-8.zip b/.yarn/cache/@msgpackr-extract-msgpackr-extract-linux-x64-npm-3.0.2-262fca760d-8.zip new file mode 100644 index 00000000000..2fa6ef4f77b Binary files /dev/null and b/.yarn/cache/@msgpackr-extract-msgpackr-extract-linux-x64-npm-3.0.2-262fca760d-8.zip differ diff --git a/.yarn/cache/@msgpackr-extract-msgpackr-extract-win32-x64-npm-3.0.2-c627beab89-8.zip b/.yarn/cache/@msgpackr-extract-msgpackr-extract-win32-x64-npm-3.0.2-c627beab89-8.zip new file mode 100644 index 00000000000..b63546421d9 Binary files /dev/null and b/.yarn/cache/@msgpackr-extract-msgpackr-extract-win32-x64-npm-3.0.2-c627beab89-8.zip differ diff --git a/.yarn/cache/@parcel-bundler-default-npm-2.12.0-9ba57d919c-f211a76f55.zip b/.yarn/cache/@parcel-bundler-default-npm-2.12.0-9ba57d919c-f211a76f55.zip new file mode 100644 index 00000000000..024e0363912 Binary files /dev/null and b/.yarn/cache/@parcel-bundler-default-npm-2.12.0-9ba57d919c-f211a76f55.zip differ diff --git a/.yarn/cache/@parcel-bundler-default-npm-2.8.3-b2fd23cf03-219b2be341.zip b/.yarn/cache/@parcel-bundler-default-npm-2.8.3-b2fd23cf03-219b2be341.zip deleted file mode 100644 index a7da1dbf88f..00000000000 Binary files a/.yarn/cache/@parcel-bundler-default-npm-2.8.3-b2fd23cf03-219b2be341.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-cache-npm-2.12.0-3389909f2c-a45e799809.zip b/.yarn/cache/@parcel-cache-npm-2.12.0-3389909f2c-a45e799809.zip new file mode 100644 index 00000000000..a358668eb7b Binary files /dev/null and b/.yarn/cache/@parcel-cache-npm-2.12.0-3389909f2c-a45e799809.zip differ diff --git a/.yarn/cache/@parcel-cache-npm-2.8.3-7b70a160bc-cd679053d2.zip b/.yarn/cache/@parcel-cache-npm-2.8.3-7b70a160bc-cd679053d2.zip deleted file mode 100644 index 9bab66eb462..00000000000 Binary files a/.yarn/cache/@parcel-cache-npm-2.8.3-7b70a160bc-cd679053d2.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-codeframe-npm-2.12.0-aa8027940e-265c4d7ebe.zip b/.yarn/cache/@parcel-codeframe-npm-2.12.0-aa8027940e-265c4d7ebe.zip new file mode 100644 index 00000000000..f4239d8ba7c Binary files /dev/null and b/.yarn/cache/@parcel-codeframe-npm-2.12.0-aa8027940e-265c4d7ebe.zip differ diff --git a/.yarn/cache/@parcel-codeframe-npm-2.8.3-e5df811b95-a6e82c30e6.zip b/.yarn/cache/@parcel-codeframe-npm-2.8.3-e5df811b95-a6e82c30e6.zip deleted file mode 100644 index 630555b5c81..00000000000 Binary files a/.yarn/cache/@parcel-codeframe-npm-2.8.3-e5df811b95-a6e82c30e6.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-compressor-raw-npm-2.12.0-19f313c172-16c56704f3.zip b/.yarn/cache/@parcel-compressor-raw-npm-2.12.0-19f313c172-16c56704f3.zip new file mode 100644 index 00000000000..da576253816 Binary files /dev/null and b/.yarn/cache/@parcel-compressor-raw-npm-2.12.0-19f313c172-16c56704f3.zip differ diff --git a/.yarn/cache/@parcel-compressor-raw-npm-2.8.3-387b54c6ce-ca3b8a4f60.zip b/.yarn/cache/@parcel-compressor-raw-npm-2.8.3-387b54c6ce-ca3b8a4f60.zip deleted file mode 100644 index d09d13d2cbe..00000000000 Binary files a/.yarn/cache/@parcel-compressor-raw-npm-2.8.3-387b54c6ce-ca3b8a4f60.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-config-default-npm-2.12.0-aefd3c699e-72877c5dc4.zip b/.yarn/cache/@parcel-config-default-npm-2.12.0-aefd3c699e-72877c5dc4.zip new file mode 100644 index 00000000000..a4934d017e7 Binary files /dev/null and b/.yarn/cache/@parcel-config-default-npm-2.12.0-aefd3c699e-72877c5dc4.zip differ diff --git a/.yarn/cache/@parcel-config-default-npm-2.8.3-465d8ed464-08c700a7a2.zip b/.yarn/cache/@parcel-config-default-npm-2.8.3-465d8ed464-08c700a7a2.zip deleted file mode 100644 index 9089d4f8ec9..00000000000 Binary files a/.yarn/cache/@parcel-config-default-npm-2.8.3-465d8ed464-08c700a7a2.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-core-npm-2.12.0-8f08b883d4-5bf6746308.zip b/.yarn/cache/@parcel-core-npm-2.12.0-8f08b883d4-5bf6746308.zip new file mode 100644 index 00000000000..42c39ebe36a Binary files /dev/null and b/.yarn/cache/@parcel-core-npm-2.12.0-8f08b883d4-5bf6746308.zip differ diff --git a/.yarn/cache/@parcel-core-npm-2.8.3-1751106c31-68adceb1b0.zip b/.yarn/cache/@parcel-core-npm-2.8.3-1751106c31-68adceb1b0.zip deleted file mode 100644 index 5c32746cac6..00000000000 Binary files a/.yarn/cache/@parcel-core-npm-2.8.3-1751106c31-68adceb1b0.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-diagnostic-npm-2.12.0-6e89ddad28-a4b918c1a0.zip b/.yarn/cache/@parcel-diagnostic-npm-2.12.0-6e89ddad28-a4b918c1a0.zip new file mode 100644 index 00000000000..a8e890bf5c0 Binary files /dev/null and b/.yarn/cache/@parcel-diagnostic-npm-2.12.0-6e89ddad28-a4b918c1a0.zip differ diff --git a/.yarn/cache/@parcel-diagnostic-npm-2.8.3-2e1d38a83b-c24d98a2db.zip b/.yarn/cache/@parcel-diagnostic-npm-2.8.3-2e1d38a83b-c24d98a2db.zip deleted file mode 100644 index 8cb3bdc723d..00000000000 Binary files a/.yarn/cache/@parcel-diagnostic-npm-2.8.3-2e1d38a83b-c24d98a2db.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-events-npm-2.12.0-e6eff18c8c-136a8a2921.zip b/.yarn/cache/@parcel-events-npm-2.12.0-e6eff18c8c-136a8a2921.zip new file mode 100644 index 00000000000..b806eb99acf Binary files /dev/null and b/.yarn/cache/@parcel-events-npm-2.12.0-e6eff18c8c-136a8a2921.zip differ diff --git a/.yarn/cache/@parcel-events-npm-2.8.3-40eebe35e5-9d23c6663e.zip b/.yarn/cache/@parcel-events-npm-2.8.3-40eebe35e5-9d23c6663e.zip deleted file mode 100644 index 64e1abfcb42..00000000000 Binary files a/.yarn/cache/@parcel-events-npm-2.8.3-40eebe35e5-9d23c6663e.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-fs-npm-2.12.0-3c46842e62-43d454d55d.zip b/.yarn/cache/@parcel-fs-npm-2.12.0-3c46842e62-43d454d55d.zip new file mode 100644 index 00000000000..52cbc5f7f1a Binary files /dev/null and b/.yarn/cache/@parcel-fs-npm-2.12.0-3c46842e62-43d454d55d.zip differ diff --git a/.yarn/cache/@parcel-fs-npm-2.8.3-a413e84c2d-cc421552da.zip b/.yarn/cache/@parcel-fs-npm-2.8.3-a413e84c2d-cc421552da.zip deleted file mode 100644 index 8226ced942c..00000000000 Binary files a/.yarn/cache/@parcel-fs-npm-2.8.3-a413e84c2d-cc421552da.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-fs-search-npm-2.8.3-aafc0a2ad7-25e8eda694.zip b/.yarn/cache/@parcel-fs-search-npm-2.8.3-aafc0a2ad7-25e8eda694.zip deleted file mode 100644 index 8277ed6b0a6..00000000000 Binary files a/.yarn/cache/@parcel-fs-search-npm-2.8.3-aafc0a2ad7-25e8eda694.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-graph-npm-2.8.3-15d2d4448e-ceed8445f5.zip b/.yarn/cache/@parcel-graph-npm-2.8.3-15d2d4448e-ceed8445f5.zip deleted file mode 100644 index 919aa79628c..00000000000 Binary files a/.yarn/cache/@parcel-graph-npm-2.8.3-15d2d4448e-ceed8445f5.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-graph-npm-3.2.0-92821d4289-b4d31624fc.zip b/.yarn/cache/@parcel-graph-npm-3.2.0-92821d4289-b4d31624fc.zip new file mode 100644 index 00000000000..27f3718928a Binary files /dev/null and b/.yarn/cache/@parcel-graph-npm-3.2.0-92821d4289-b4d31624fc.zip differ diff --git a/.yarn/cache/@parcel-hash-npm-2.8.3-48d5e2907f-29cef199fe.zip b/.yarn/cache/@parcel-hash-npm-2.8.3-48d5e2907f-29cef199fe.zip deleted file mode 100644 index 4fec7f1d702..00000000000 Binary files a/.yarn/cache/@parcel-hash-npm-2.8.3-48d5e2907f-29cef199fe.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-logger-npm-2.12.0-7d2f85a906-be3fe9d9ea.zip b/.yarn/cache/@parcel-logger-npm-2.12.0-7d2f85a906-be3fe9d9ea.zip new file mode 100644 index 00000000000..7231e4c65db Binary files /dev/null and b/.yarn/cache/@parcel-logger-npm-2.12.0-7d2f85a906-be3fe9d9ea.zip differ diff --git a/.yarn/cache/@parcel-logger-npm-2.8.3-f13624d366-04fd463131.zip b/.yarn/cache/@parcel-logger-npm-2.8.3-f13624d366-04fd463131.zip deleted file mode 100644 index 07da31249ec..00000000000 Binary files a/.yarn/cache/@parcel-logger-npm-2.8.3-f13624d366-04fd463131.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-markdown-ansi-npm-2.12.0-6b0fe453df-850ee665d9.zip b/.yarn/cache/@parcel-markdown-ansi-npm-2.12.0-6b0fe453df-850ee665d9.zip new file mode 100644 index 00000000000..22582b46fa1 Binary files /dev/null and b/.yarn/cache/@parcel-markdown-ansi-npm-2.12.0-6b0fe453df-850ee665d9.zip differ diff --git a/.yarn/cache/@parcel-markdown-ansi-npm-2.8.3-4b66177a38-1985f149b2.zip b/.yarn/cache/@parcel-markdown-ansi-npm-2.8.3-4b66177a38-1985f149b2.zip deleted file mode 100644 index 6a28973b587..00000000000 Binary files a/.yarn/cache/@parcel-markdown-ansi-npm-2.8.3-4b66177a38-1985f149b2.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-namer-default-npm-2.12.0-28980cfd47-dc92ec0945.zip b/.yarn/cache/@parcel-namer-default-npm-2.12.0-28980cfd47-dc92ec0945.zip new file mode 100644 index 00000000000..7db7fb405c2 Binary files /dev/null and b/.yarn/cache/@parcel-namer-default-npm-2.12.0-28980cfd47-dc92ec0945.zip differ diff --git a/.yarn/cache/@parcel-namer-default-npm-2.8.3-486a772540-7c2c343446.zip b/.yarn/cache/@parcel-namer-default-npm-2.8.3-486a772540-7c2c343446.zip deleted file mode 100644 index a6e34e55b2c..00000000000 Binary files a/.yarn/cache/@parcel-namer-default-npm-2.8.3-486a772540-7c2c343446.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-node-resolver-core-npm-2.8.3-40a48fa4e7-4976d3ecc9.zip b/.yarn/cache/@parcel-node-resolver-core-npm-2.8.3-40a48fa4e7-4976d3ecc9.zip deleted file mode 100644 index 3bcae151b65..00000000000 Binary files a/.yarn/cache/@parcel-node-resolver-core-npm-2.8.3-40a48fa4e7-4976d3ecc9.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-node-resolver-core-npm-3.3.0-53804df663-acc3721678.zip b/.yarn/cache/@parcel-node-resolver-core-npm-3.3.0-53804df663-acc3721678.zip new file mode 100644 index 00000000000..76a69962a64 Binary files /dev/null and b/.yarn/cache/@parcel-node-resolver-core-npm-3.3.0-53804df663-acc3721678.zip differ diff --git a/.yarn/cache/@parcel-optimizer-css-npm-2.12.0-f95bd4d060-abcdf58c29.zip b/.yarn/cache/@parcel-optimizer-css-npm-2.12.0-f95bd4d060-abcdf58c29.zip new file mode 100644 index 00000000000..f1c61749b92 Binary files /dev/null and b/.yarn/cache/@parcel-optimizer-css-npm-2.12.0-f95bd4d060-abcdf58c29.zip differ diff --git a/.yarn/cache/@parcel-optimizer-css-npm-2.8.3-6e7102b9ab-ffac43a2c2.zip b/.yarn/cache/@parcel-optimizer-css-npm-2.8.3-6e7102b9ab-ffac43a2c2.zip deleted file mode 100644 index fd8439d218d..00000000000 Binary files a/.yarn/cache/@parcel-optimizer-css-npm-2.8.3-6e7102b9ab-ffac43a2c2.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-optimizer-data-url-npm-2.12.0-dad3731170-0397293961.zip b/.yarn/cache/@parcel-optimizer-data-url-npm-2.12.0-dad3731170-0397293961.zip new file mode 100644 index 00000000000..28497d33271 Binary files /dev/null and b/.yarn/cache/@parcel-optimizer-data-url-npm-2.12.0-dad3731170-0397293961.zip differ diff --git a/.yarn/cache/@parcel-optimizer-data-url-npm-2.8.3-dd2c9afc59-5df8d88826.zip b/.yarn/cache/@parcel-optimizer-data-url-npm-2.8.3-dd2c9afc59-5df8d88826.zip deleted file mode 100644 index 43f688f184d..00000000000 Binary files a/.yarn/cache/@parcel-optimizer-data-url-npm-2.8.3-dd2c9afc59-5df8d88826.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-optimizer-htmlnano-npm-2.12.0-cdd2835c12-64e571f56f.zip b/.yarn/cache/@parcel-optimizer-htmlnano-npm-2.12.0-cdd2835c12-64e571f56f.zip new file mode 100644 index 00000000000..4089a870fb0 Binary files /dev/null and b/.yarn/cache/@parcel-optimizer-htmlnano-npm-2.12.0-cdd2835c12-64e571f56f.zip differ diff --git a/.yarn/cache/@parcel-optimizer-htmlnano-npm-2.8.3-62c761ef26-ca1cab7b1e.zip b/.yarn/cache/@parcel-optimizer-htmlnano-npm-2.8.3-62c761ef26-ca1cab7b1e.zip deleted file mode 100644 index d052e87e37a..00000000000 Binary files a/.yarn/cache/@parcel-optimizer-htmlnano-npm-2.8.3-62c761ef26-ca1cab7b1e.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-optimizer-image-npm-2.12.0-4cbc56f72d-7d28379bf1.zip b/.yarn/cache/@parcel-optimizer-image-npm-2.12.0-4cbc56f72d-7d28379bf1.zip new file mode 100644 index 00000000000..8b0a44e7568 Binary files /dev/null and b/.yarn/cache/@parcel-optimizer-image-npm-2.12.0-4cbc56f72d-7d28379bf1.zip differ diff --git a/.yarn/cache/@parcel-optimizer-image-npm-2.8.3-4a1aa225b2-72c5acffae.zip b/.yarn/cache/@parcel-optimizer-image-npm-2.8.3-4a1aa225b2-72c5acffae.zip deleted file mode 100644 index 5b564498b22..00000000000 Binary files a/.yarn/cache/@parcel-optimizer-image-npm-2.8.3-4a1aa225b2-72c5acffae.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-optimizer-svgo-npm-2.12.0-08c0f1b17f-d3a4d2de9f.zip b/.yarn/cache/@parcel-optimizer-svgo-npm-2.12.0-08c0f1b17f-d3a4d2de9f.zip new file mode 100644 index 00000000000..441bead99b8 Binary files /dev/null and b/.yarn/cache/@parcel-optimizer-svgo-npm-2.12.0-08c0f1b17f-d3a4d2de9f.zip differ diff --git a/.yarn/cache/@parcel-optimizer-svgo-npm-2.8.3-b5d4af08b7-b3544c08fa.zip b/.yarn/cache/@parcel-optimizer-svgo-npm-2.8.3-b5d4af08b7-b3544c08fa.zip deleted file mode 100644 index f7837f38ced..00000000000 Binary files a/.yarn/cache/@parcel-optimizer-svgo-npm-2.8.3-b5d4af08b7-b3544c08fa.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-optimizer-swc-npm-2.12.0-fb535e4283-0b7fdf3df1.zip b/.yarn/cache/@parcel-optimizer-swc-npm-2.12.0-fb535e4283-0b7fdf3df1.zip new file mode 100644 index 00000000000..8b137cf673d Binary files /dev/null and b/.yarn/cache/@parcel-optimizer-swc-npm-2.12.0-fb535e4283-0b7fdf3df1.zip differ diff --git a/.yarn/cache/@parcel-optimizer-terser-npm-2.8.3-5e561ce7db-ee1959f596.zip b/.yarn/cache/@parcel-optimizer-terser-npm-2.8.3-5e561ce7db-ee1959f596.zip deleted file mode 100644 index 544b923d5ca..00000000000 Binary files a/.yarn/cache/@parcel-optimizer-terser-npm-2.8.3-5e561ce7db-ee1959f596.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-package-manager-npm-2.12.0-fc90aacf70-a517e9efe1.zip b/.yarn/cache/@parcel-package-manager-npm-2.12.0-fc90aacf70-a517e9efe1.zip new file mode 100644 index 00000000000..1e757bdf2f3 Binary files /dev/null and b/.yarn/cache/@parcel-package-manager-npm-2.12.0-fc90aacf70-a517e9efe1.zip differ diff --git a/.yarn/cache/@parcel-package-manager-npm-2.8.3-0dc329e43e-572a5aacfd.zip b/.yarn/cache/@parcel-package-manager-npm-2.8.3-0dc329e43e-572a5aacfd.zip deleted file mode 100644 index 7a3b45cfac8..00000000000 Binary files a/.yarn/cache/@parcel-package-manager-npm-2.8.3-0dc329e43e-572a5aacfd.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-packager-css-npm-2.12.0-b1c27a8323-684aaa1d85.zip b/.yarn/cache/@parcel-packager-css-npm-2.12.0-b1c27a8323-684aaa1d85.zip new file mode 100644 index 00000000000..4cf7815f57f Binary files /dev/null and b/.yarn/cache/@parcel-packager-css-npm-2.12.0-b1c27a8323-684aaa1d85.zip differ diff --git a/.yarn/cache/@parcel-packager-css-npm-2.8.3-c127d6c552-bb28fc9f02.zip b/.yarn/cache/@parcel-packager-css-npm-2.8.3-c127d6c552-bb28fc9f02.zip deleted file mode 100644 index 13645d27271..00000000000 Binary files a/.yarn/cache/@parcel-packager-css-npm-2.8.3-c127d6c552-bb28fc9f02.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-packager-html-npm-2.12.0-ad361b1265-ee558ad616.zip b/.yarn/cache/@parcel-packager-html-npm-2.12.0-ad361b1265-ee558ad616.zip new file mode 100644 index 00000000000..989402a62c2 Binary files /dev/null and b/.yarn/cache/@parcel-packager-html-npm-2.12.0-ad361b1265-ee558ad616.zip differ diff --git a/.yarn/cache/@parcel-packager-html-npm-2.8.3-4e3da006ce-631f98fca0.zip b/.yarn/cache/@parcel-packager-html-npm-2.8.3-4e3da006ce-631f98fca0.zip deleted file mode 100644 index 3128a18fc55..00000000000 Binary files a/.yarn/cache/@parcel-packager-html-npm-2.8.3-4e3da006ce-631f98fca0.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-packager-js-npm-2.12.0-093e3200cd-2189b7ff15.zip b/.yarn/cache/@parcel-packager-js-npm-2.12.0-093e3200cd-2189b7ff15.zip new file mode 100644 index 00000000000..461ec50d284 Binary files /dev/null and b/.yarn/cache/@parcel-packager-js-npm-2.12.0-093e3200cd-2189b7ff15.zip differ diff --git a/.yarn/cache/@parcel-packager-js-npm-2.8.3-3441713a0f-92ac88244b.zip b/.yarn/cache/@parcel-packager-js-npm-2.8.3-3441713a0f-92ac88244b.zip deleted file mode 100644 index f74455017a4..00000000000 Binary files a/.yarn/cache/@parcel-packager-js-npm-2.8.3-3441713a0f-92ac88244b.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-packager-raw-npm-2.12.0-b7f15635f8-39ce2fc7ae.zip b/.yarn/cache/@parcel-packager-raw-npm-2.12.0-b7f15635f8-39ce2fc7ae.zip new file mode 100644 index 00000000000..e27b5ed1e3e Binary files /dev/null and b/.yarn/cache/@parcel-packager-raw-npm-2.12.0-b7f15635f8-39ce2fc7ae.zip differ diff --git a/.yarn/cache/@parcel-packager-raw-npm-2.8.3-0a1dab14a2-26236dd646.zip b/.yarn/cache/@parcel-packager-raw-npm-2.8.3-0a1dab14a2-26236dd646.zip deleted file mode 100644 index 57014e28a49..00000000000 Binary files a/.yarn/cache/@parcel-packager-raw-npm-2.8.3-0a1dab14a2-26236dd646.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-packager-svg-npm-2.12.0-fa921ce522-436ac9ea39.zip b/.yarn/cache/@parcel-packager-svg-npm-2.12.0-fa921ce522-436ac9ea39.zip new file mode 100644 index 00000000000..f3d37303b01 Binary files /dev/null and b/.yarn/cache/@parcel-packager-svg-npm-2.12.0-fa921ce522-436ac9ea39.zip differ diff --git a/.yarn/cache/@parcel-packager-svg-npm-2.8.3-c3163591d4-45c966ad8e.zip b/.yarn/cache/@parcel-packager-svg-npm-2.8.3-c3163591d4-45c966ad8e.zip deleted file mode 100644 index a10bf2cf73b..00000000000 Binary files a/.yarn/cache/@parcel-packager-svg-npm-2.8.3-c3163591d4-45c966ad8e.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-packager-wasm-npm-2.12.0-ec551a9e29-a10e1cd988.zip b/.yarn/cache/@parcel-packager-wasm-npm-2.12.0-ec551a9e29-a10e1cd988.zip new file mode 100644 index 00000000000..5b569f20045 Binary files /dev/null and b/.yarn/cache/@parcel-packager-wasm-npm-2.12.0-ec551a9e29-a10e1cd988.zip differ diff --git a/.yarn/cache/@parcel-plugin-npm-2.12.0-947dec85d3-0b52f1dd06.zip b/.yarn/cache/@parcel-plugin-npm-2.12.0-947dec85d3-0b52f1dd06.zip new file mode 100644 index 00000000000..667d7230e6d Binary files /dev/null and b/.yarn/cache/@parcel-plugin-npm-2.12.0-947dec85d3-0b52f1dd06.zip differ diff --git a/.yarn/cache/@parcel-plugin-npm-2.8.3-c228eb7640-a69ac66f5c.zip b/.yarn/cache/@parcel-plugin-npm-2.8.3-c228eb7640-a69ac66f5c.zip deleted file mode 100644 index 84df098c7b4..00000000000 Binary files a/.yarn/cache/@parcel-plugin-npm-2.8.3-c228eb7640-a69ac66f5c.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-profiler-npm-2.12.0-69720a23ab-b683b74e10.zip b/.yarn/cache/@parcel-profiler-npm-2.12.0-69720a23ab-b683b74e10.zip new file mode 100644 index 00000000000..1cacc845711 Binary files /dev/null and b/.yarn/cache/@parcel-profiler-npm-2.12.0-69720a23ab-b683b74e10.zip differ diff --git a/.yarn/cache/@parcel-reporter-cli-npm-2.12.0-b3e4c5fe19-8cc524fa15.zip b/.yarn/cache/@parcel-reporter-cli-npm-2.12.0-b3e4c5fe19-8cc524fa15.zip new file mode 100644 index 00000000000..f6e625d396b Binary files /dev/null and b/.yarn/cache/@parcel-reporter-cli-npm-2.12.0-b3e4c5fe19-8cc524fa15.zip differ diff --git a/.yarn/cache/@parcel-reporter-cli-npm-2.8.3-d340f7fcb8-791dd4706a.zip b/.yarn/cache/@parcel-reporter-cli-npm-2.8.3-d340f7fcb8-791dd4706a.zip deleted file mode 100644 index 791f45b2caa..00000000000 Binary files a/.yarn/cache/@parcel-reporter-cli-npm-2.8.3-d340f7fcb8-791dd4706a.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-reporter-dev-server-npm-2.12.0-aed1d2c68c-43957b4656.zip b/.yarn/cache/@parcel-reporter-dev-server-npm-2.12.0-aed1d2c68c-43957b4656.zip new file mode 100644 index 00000000000..f1fb1818e94 Binary files /dev/null and b/.yarn/cache/@parcel-reporter-dev-server-npm-2.12.0-aed1d2c68c-43957b4656.zip differ diff --git a/.yarn/cache/@parcel-reporter-dev-server-npm-2.8.3-be7051861d-329db9fd0c.zip b/.yarn/cache/@parcel-reporter-dev-server-npm-2.8.3-be7051861d-329db9fd0c.zip deleted file mode 100644 index 23d9ee06132..00000000000 Binary files a/.yarn/cache/@parcel-reporter-dev-server-npm-2.8.3-be7051861d-329db9fd0c.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-reporter-tracer-npm-2.12.0-5cec9ab2d5-24cddacd19.zip b/.yarn/cache/@parcel-reporter-tracer-npm-2.12.0-5cec9ab2d5-24cddacd19.zip new file mode 100644 index 00000000000..2196f5407cc Binary files /dev/null and b/.yarn/cache/@parcel-reporter-tracer-npm-2.12.0-5cec9ab2d5-24cddacd19.zip differ diff --git a/.yarn/cache/@parcel-resolver-default-npm-2.12.0-8da790891c-f3652eea09.zip b/.yarn/cache/@parcel-resolver-default-npm-2.12.0-8da790891c-f3652eea09.zip new file mode 100644 index 00000000000..8022d046517 Binary files /dev/null and b/.yarn/cache/@parcel-resolver-default-npm-2.12.0-8da790891c-f3652eea09.zip differ diff --git a/.yarn/cache/@parcel-resolver-default-npm-2.8.3-de025989bd-40515a62c1.zip b/.yarn/cache/@parcel-resolver-default-npm-2.8.3-de025989bd-40515a62c1.zip deleted file mode 100644 index 69fdc94c795..00000000000 Binary files a/.yarn/cache/@parcel-resolver-default-npm-2.8.3-de025989bd-40515a62c1.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-runtime-browser-hmr-npm-2.12.0-6f0da66673-bbba57ecee.zip b/.yarn/cache/@parcel-runtime-browser-hmr-npm-2.12.0-6f0da66673-bbba57ecee.zip new file mode 100644 index 00000000000..f71de2152bf Binary files /dev/null and b/.yarn/cache/@parcel-runtime-browser-hmr-npm-2.12.0-6f0da66673-bbba57ecee.zip differ diff --git a/.yarn/cache/@parcel-runtime-browser-hmr-npm-2.8.3-63941ffa5c-56c276c7b0.zip b/.yarn/cache/@parcel-runtime-browser-hmr-npm-2.8.3-63941ffa5c-56c276c7b0.zip deleted file mode 100644 index 32c71ce5823..00000000000 Binary files a/.yarn/cache/@parcel-runtime-browser-hmr-npm-2.8.3-63941ffa5c-56c276c7b0.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-runtime-js-npm-2.12.0-e21acc0f42-6afa3e7eb2.zip b/.yarn/cache/@parcel-runtime-js-npm-2.12.0-e21acc0f42-6afa3e7eb2.zip new file mode 100644 index 00000000000..be9c7d7e4b9 Binary files /dev/null and b/.yarn/cache/@parcel-runtime-js-npm-2.12.0-e21acc0f42-6afa3e7eb2.zip differ diff --git a/.yarn/cache/@parcel-runtime-js-npm-2.8.3-a82379279f-ee5e04f84d.zip b/.yarn/cache/@parcel-runtime-js-npm-2.8.3-a82379279f-ee5e04f84d.zip deleted file mode 100644 index 439cd1e5ad2..00000000000 Binary files a/.yarn/cache/@parcel-runtime-js-npm-2.8.3-a82379279f-ee5e04f84d.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-runtime-react-refresh-npm-2.12.0-2b09615691-41aee9a874.zip b/.yarn/cache/@parcel-runtime-react-refresh-npm-2.12.0-2b09615691-41aee9a874.zip new file mode 100644 index 00000000000..8dc8e5281c8 Binary files /dev/null and b/.yarn/cache/@parcel-runtime-react-refresh-npm-2.12.0-2b09615691-41aee9a874.zip differ diff --git a/.yarn/cache/@parcel-runtime-react-refresh-npm-2.8.3-42e337381a-327159be0c.zip b/.yarn/cache/@parcel-runtime-react-refresh-npm-2.8.3-42e337381a-327159be0c.zip deleted file mode 100644 index 6a956933a85..00000000000 Binary files a/.yarn/cache/@parcel-runtime-react-refresh-npm-2.8.3-42e337381a-327159be0c.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-runtime-service-worker-npm-2.12.0-7d227ff0bf-c71246428e.zip b/.yarn/cache/@parcel-runtime-service-worker-npm-2.12.0-7d227ff0bf-c71246428e.zip new file mode 100644 index 00000000000..18682c22ae2 Binary files /dev/null and b/.yarn/cache/@parcel-runtime-service-worker-npm-2.12.0-7d227ff0bf-c71246428e.zip differ diff --git a/.yarn/cache/@parcel-runtime-service-worker-npm-2.8.3-426255f187-0646fee9a9.zip b/.yarn/cache/@parcel-runtime-service-worker-npm-2.8.3-426255f187-0646fee9a9.zip deleted file mode 100644 index b5f661ceffe..00000000000 Binary files a/.yarn/cache/@parcel-runtime-service-worker-npm-2.8.3-426255f187-0646fee9a9.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-rust-npm-2.12.0-0cf943f3e5-51c5b67b9e.zip b/.yarn/cache/@parcel-rust-npm-2.12.0-0cf943f3e5-51c5b67b9e.zip new file mode 100644 index 00000000000..d5fe4206c9a Binary files /dev/null and b/.yarn/cache/@parcel-rust-npm-2.12.0-0cf943f3e5-51c5b67b9e.zip differ diff --git a/.yarn/cache/@parcel-transformer-babel-npm-2.12.0-953de52432-b8c457c0be.zip b/.yarn/cache/@parcel-transformer-babel-npm-2.12.0-953de52432-b8c457c0be.zip new file mode 100644 index 00000000000..9286325c9ed Binary files /dev/null and b/.yarn/cache/@parcel-transformer-babel-npm-2.12.0-953de52432-b8c457c0be.zip differ diff --git a/.yarn/cache/@parcel-transformer-babel-npm-2.8.3-bd1a7cae4d-a27bbe8d89.zip b/.yarn/cache/@parcel-transformer-babel-npm-2.8.3-bd1a7cae4d-a27bbe8d89.zip deleted file mode 100644 index 4b3123e02cc..00000000000 Binary files a/.yarn/cache/@parcel-transformer-babel-npm-2.8.3-bd1a7cae4d-a27bbe8d89.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-css-npm-2.12.0-24ddc31ae3-3a6f16321d.zip b/.yarn/cache/@parcel-transformer-css-npm-2.12.0-24ddc31ae3-3a6f16321d.zip new file mode 100644 index 00000000000..f3e0520c716 Binary files /dev/null and b/.yarn/cache/@parcel-transformer-css-npm-2.12.0-24ddc31ae3-3a6f16321d.zip differ diff --git a/.yarn/cache/@parcel-transformer-css-npm-2.8.3-e5a36983ce-31375a1405.zip b/.yarn/cache/@parcel-transformer-css-npm-2.8.3-e5a36983ce-31375a1405.zip deleted file mode 100644 index 29126c1d316..00000000000 Binary files a/.yarn/cache/@parcel-transformer-css-npm-2.8.3-e5a36983ce-31375a1405.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-html-npm-2.12.0-be2b9ee40c-7fcfac62ca.zip b/.yarn/cache/@parcel-transformer-html-npm-2.12.0-be2b9ee40c-7fcfac62ca.zip new file mode 100644 index 00000000000..3628f3f90d9 Binary files /dev/null and b/.yarn/cache/@parcel-transformer-html-npm-2.12.0-be2b9ee40c-7fcfac62ca.zip differ diff --git a/.yarn/cache/@parcel-transformer-html-npm-2.8.3-ce9c33e277-21600a3e0a.zip b/.yarn/cache/@parcel-transformer-html-npm-2.8.3-ce9c33e277-21600a3e0a.zip deleted file mode 100644 index 495efcafec6..00000000000 Binary files a/.yarn/cache/@parcel-transformer-html-npm-2.8.3-ce9c33e277-21600a3e0a.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-image-npm-2.12.0-53f04e21c0-0a1581eacc.zip b/.yarn/cache/@parcel-transformer-image-npm-2.12.0-53f04e21c0-0a1581eacc.zip new file mode 100644 index 00000000000..3a78e4e0701 Binary files /dev/null and b/.yarn/cache/@parcel-transformer-image-npm-2.12.0-53f04e21c0-0a1581eacc.zip differ diff --git a/.yarn/cache/@parcel-transformer-image-npm-2.8.3-ddf03325c2-f4b3464828.zip b/.yarn/cache/@parcel-transformer-image-npm-2.8.3-ddf03325c2-f4b3464828.zip deleted file mode 100644 index f1db93e7c09..00000000000 Binary files a/.yarn/cache/@parcel-transformer-image-npm-2.8.3-ddf03325c2-f4b3464828.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-inline-string-npm-2.12.0-a33f10bafa-5f63c08695.zip b/.yarn/cache/@parcel-transformer-inline-string-npm-2.12.0-a33f10bafa-5f63c08695.zip new file mode 100644 index 00000000000..0c4f3341c8b Binary files /dev/null and b/.yarn/cache/@parcel-transformer-inline-string-npm-2.12.0-a33f10bafa-5f63c08695.zip differ diff --git a/.yarn/cache/@parcel-transformer-inline-string-npm-2.8.3-6e4701a9cd-23fa279e1f.zip b/.yarn/cache/@parcel-transformer-inline-string-npm-2.8.3-6e4701a9cd-23fa279e1f.zip deleted file mode 100644 index baac58657ea..00000000000 Binary files a/.yarn/cache/@parcel-transformer-inline-string-npm-2.8.3-6e4701a9cd-23fa279e1f.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-js-npm-2.12.0-404d54db18-b9fe4c887b.zip b/.yarn/cache/@parcel-transformer-js-npm-2.12.0-404d54db18-b9fe4c887b.zip new file mode 100644 index 00000000000..1ce667ac8dc Binary files /dev/null and b/.yarn/cache/@parcel-transformer-js-npm-2.12.0-404d54db18-b9fe4c887b.zip differ diff --git a/.yarn/cache/@parcel-transformer-js-npm-2.8.3-2fc28b9273-29fb203502.zip b/.yarn/cache/@parcel-transformer-js-npm-2.8.3-2fc28b9273-29fb203502.zip deleted file mode 100644 index b15a3f69941..00000000000 Binary files a/.yarn/cache/@parcel-transformer-js-npm-2.8.3-2fc28b9273-29fb203502.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-json-npm-2.12.0-652d8d99d2-a711cb65a8.zip b/.yarn/cache/@parcel-transformer-json-npm-2.12.0-652d8d99d2-a711cb65a8.zip new file mode 100644 index 00000000000..926c01eb816 Binary files /dev/null and b/.yarn/cache/@parcel-transformer-json-npm-2.12.0-652d8d99d2-a711cb65a8.zip differ diff --git a/.yarn/cache/@parcel-transformer-json-npm-2.8.3-fe0a156dc9-04da28b0f0.zip b/.yarn/cache/@parcel-transformer-json-npm-2.8.3-fe0a156dc9-04da28b0f0.zip deleted file mode 100644 index 68129bf255e..00000000000 Binary files a/.yarn/cache/@parcel-transformer-json-npm-2.8.3-fe0a156dc9-04da28b0f0.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-postcss-npm-2.12.0-f0cfb95fac-b210044a7f.zip b/.yarn/cache/@parcel-transformer-postcss-npm-2.12.0-f0cfb95fac-b210044a7f.zip new file mode 100644 index 00000000000..3bbacafa818 Binary files /dev/null and b/.yarn/cache/@parcel-transformer-postcss-npm-2.12.0-f0cfb95fac-b210044a7f.zip differ diff --git a/.yarn/cache/@parcel-transformer-postcss-npm-2.8.3-eb5a87320d-2c75cb5cec.zip b/.yarn/cache/@parcel-transformer-postcss-npm-2.8.3-eb5a87320d-2c75cb5cec.zip deleted file mode 100644 index 0719d5cdf80..00000000000 Binary files a/.yarn/cache/@parcel-transformer-postcss-npm-2.8.3-eb5a87320d-2c75cb5cec.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-posthtml-npm-2.12.0-41c570db12-b62582ae7e.zip b/.yarn/cache/@parcel-transformer-posthtml-npm-2.12.0-41c570db12-b62582ae7e.zip new file mode 100644 index 00000000000..e912a09713f Binary files /dev/null and b/.yarn/cache/@parcel-transformer-posthtml-npm-2.12.0-41c570db12-b62582ae7e.zip differ diff --git a/.yarn/cache/@parcel-transformer-posthtml-npm-2.8.3-243f774b7a-130c95782a.zip b/.yarn/cache/@parcel-transformer-posthtml-npm-2.8.3-243f774b7a-130c95782a.zip deleted file mode 100644 index 213e503a9e8..00000000000 Binary files a/.yarn/cache/@parcel-transformer-posthtml-npm-2.8.3-243f774b7a-130c95782a.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-raw-npm-2.12.0-bd2cb66ddf-de6681e2e7.zip b/.yarn/cache/@parcel-transformer-raw-npm-2.12.0-bd2cb66ddf-de6681e2e7.zip new file mode 100644 index 00000000000..40b7e2d3c42 Binary files /dev/null and b/.yarn/cache/@parcel-transformer-raw-npm-2.12.0-bd2cb66ddf-de6681e2e7.zip differ diff --git a/.yarn/cache/@parcel-transformer-raw-npm-2.8.3-766b11ad19-371263bb52.zip b/.yarn/cache/@parcel-transformer-raw-npm-2.8.3-766b11ad19-371263bb52.zip deleted file mode 100644 index 19491751df8..00000000000 Binary files a/.yarn/cache/@parcel-transformer-raw-npm-2.8.3-766b11ad19-371263bb52.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-react-refresh-wrap-npm-2.12.0-59ed68910f-9aba8c1ab0.zip b/.yarn/cache/@parcel-transformer-react-refresh-wrap-npm-2.12.0-59ed68910f-9aba8c1ab0.zip new file mode 100644 index 00000000000..23210becb7e Binary files /dev/null and b/.yarn/cache/@parcel-transformer-react-refresh-wrap-npm-2.12.0-59ed68910f-9aba8c1ab0.zip differ diff --git a/.yarn/cache/@parcel-transformer-react-refresh-wrap-npm-2.8.3-bb497d2643-e9648e04b7.zip b/.yarn/cache/@parcel-transformer-react-refresh-wrap-npm-2.8.3-bb497d2643-e9648e04b7.zip deleted file mode 100644 index d19cf7d0beb..00000000000 Binary files a/.yarn/cache/@parcel-transformer-react-refresh-wrap-npm-2.8.3-bb497d2643-e9648e04b7.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-sass-npm-2.12.0-ef787eef35-ce6b4d329b.zip b/.yarn/cache/@parcel-transformer-sass-npm-2.12.0-ef787eef35-ce6b4d329b.zip new file mode 100644 index 00000000000..d62c3420670 Binary files /dev/null and b/.yarn/cache/@parcel-transformer-sass-npm-2.12.0-ef787eef35-ce6b4d329b.zip differ diff --git a/.yarn/cache/@parcel-transformer-sass-npm-2.8.3-6c449bba66-9cb32b3906.zip b/.yarn/cache/@parcel-transformer-sass-npm-2.8.3-6c449bba66-9cb32b3906.zip deleted file mode 100644 index 371b47c1ba0..00000000000 Binary files a/.yarn/cache/@parcel-transformer-sass-npm-2.8.3-6c449bba66-9cb32b3906.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-transformer-svg-npm-2.12.0-f41b181676-92b7c65894.zip b/.yarn/cache/@parcel-transformer-svg-npm-2.12.0-f41b181676-92b7c65894.zip new file mode 100644 index 00000000000..01af21f6a31 Binary files /dev/null and b/.yarn/cache/@parcel-transformer-svg-npm-2.12.0-f41b181676-92b7c65894.zip differ diff --git a/.yarn/cache/@parcel-transformer-svg-npm-2.8.3-b6f4c84f7a-1f3db309e4.zip b/.yarn/cache/@parcel-transformer-svg-npm-2.8.3-b6f4c84f7a-1f3db309e4.zip deleted file mode 100644 index b3836d49857..00000000000 Binary files a/.yarn/cache/@parcel-transformer-svg-npm-2.8.3-b6f4c84f7a-1f3db309e4.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-types-npm-2.12.0-ffe47febbf-250f95580c.zip b/.yarn/cache/@parcel-types-npm-2.12.0-ffe47febbf-250f95580c.zip new file mode 100644 index 00000000000..ea6decc566b Binary files /dev/null and b/.yarn/cache/@parcel-types-npm-2.12.0-ffe47febbf-250f95580c.zip differ diff --git a/.yarn/cache/@parcel-types-npm-2.8.3-394e8cefff-ece0abdd5c.zip b/.yarn/cache/@parcel-types-npm-2.8.3-394e8cefff-ece0abdd5c.zip deleted file mode 100644 index e92d3882332..00000000000 Binary files a/.yarn/cache/@parcel-types-npm-2.8.3-394e8cefff-ece0abdd5c.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-utils-npm-2.12.0-d8a9a48a66-ba80a60fed.zip b/.yarn/cache/@parcel-utils-npm-2.12.0-d8a9a48a66-ba80a60fed.zip new file mode 100644 index 00000000000..8eda5989418 Binary files /dev/null and b/.yarn/cache/@parcel-utils-npm-2.12.0-d8a9a48a66-ba80a60fed.zip differ diff --git a/.yarn/cache/@parcel-utils-npm-2.8.3-13fd8c7807-69edf3e7c3.zip b/.yarn/cache/@parcel-utils-npm-2.8.3-13fd8c7807-69edf3e7c3.zip deleted file mode 100644 index 71a485806db..00000000000 Binary files a/.yarn/cache/@parcel-utils-npm-2.8.3-13fd8c7807-69edf3e7c3.zip and /dev/null differ diff --git a/.yarn/cache/@parcel-workers-npm-2.12.0-3ddd4664bc-e19c3c0a66.zip b/.yarn/cache/@parcel-workers-npm-2.12.0-3ddd4664bc-e19c3c0a66.zip new file mode 100644 index 00000000000..53f28c9470b Binary files /dev/null and b/.yarn/cache/@parcel-workers-npm-2.12.0-3ddd4664bc-e19c3c0a66.zip differ diff --git a/.yarn/cache/@parcel-workers-npm-2.8.3-39050bfde5-e3168b3e9e.zip b/.yarn/cache/@parcel-workers-npm-2.8.3-39050bfde5-e3168b3e9e.zip deleted file mode 100644 index c1a47cfa1aa..00000000000 Binary files a/.yarn/cache/@parcel-workers-npm-2.8.3-39050bfde5-e3168b3e9e.zip and /dev/null differ diff --git a/.yarn/cache/@popperjs-core-npm-2.11.7-c1bac58243-5b65537478.zip b/.yarn/cache/@popperjs-core-npm-2.11.7-c1bac58243-5b65537478.zip deleted file mode 100644 index 12651e9657d..00000000000 Binary files a/.yarn/cache/@popperjs-core-npm-2.11.7-c1bac58243-5b65537478.zip and /dev/null differ diff --git a/.yarn/cache/@popperjs-core-npm-2.11.8-f1692e11a0-e5c69fdebf.zip b/.yarn/cache/@popperjs-core-npm-2.11.8-f1692e11a0-e5c69fdebf.zip new file mode 100644 index 00000000000..a5eef4b2275 Binary files /dev/null and b/.yarn/cache/@popperjs-core-npm-2.11.8-f1692e11a0-e5c69fdebf.zip differ diff --git a/.yarn/cache/@rollup-pluginutils-npm-5.0.2-6aa9d0ddd4-edea15e543.zip b/.yarn/cache/@rollup-pluginutils-npm-5.0.2-6aa9d0ddd4-edea15e543.zip deleted file mode 100644 index d898c5035c8..00000000000 Binary files a/.yarn/cache/@rollup-pluginutils-npm-5.0.2-6aa9d0ddd4-edea15e543.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-3cc5a6d914.zip b/.yarn/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-3cc5a6d914.zip new file mode 100644 index 00000000000..923a7a91a8e Binary files /dev/null and b/.yarn/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-3cc5a6d914.zip differ diff --git a/.yarn/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip b/.yarn/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip deleted file mode 100644 index 5990cc76044..00000000000 Binary files a/.yarn/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip and /dev/null differ diff --git a/.yarn/cache/@sidvind-better-ajv-errors-npm-2.1.3-e3d1c524a8-949cb805a1.zip b/.yarn/cache/@sidvind-better-ajv-errors-npm-2.1.3-e3d1c524a8-949cb805a1.zip new file mode 100644 index 00000000000..ad36770e19c Binary files /dev/null and b/.yarn/cache/@sidvind-better-ajv-errors-npm-2.1.3-e3d1c524a8-949cb805a1.zip differ diff --git a/.yarn/cache/@swc-core-darwin-arm64-npm-1.3.62-b4af5d9b32-8.zip b/.yarn/cache/@swc-core-darwin-arm64-npm-1.3.62-b4af5d9b32-8.zip new file mode 100644 index 00000000000..ad2ff12c7fc Binary files /dev/null and b/.yarn/cache/@swc-core-darwin-arm64-npm-1.3.62-b4af5d9b32-8.zip differ diff --git a/.yarn/cache/@swc-core-darwin-x64-npm-1.3.62-7d7bc99502-8.zip b/.yarn/cache/@swc-core-darwin-x64-npm-1.3.62-7d7bc99502-8.zip new file mode 100644 index 00000000000..7edd14afd02 Binary files /dev/null and b/.yarn/cache/@swc-core-darwin-x64-npm-1.3.62-7d7bc99502-8.zip differ diff --git a/.yarn/cache/@swc-core-linux-arm64-gnu-npm-1.3.62-7b527a3356-8.zip b/.yarn/cache/@swc-core-linux-arm64-gnu-npm-1.3.62-7b527a3356-8.zip new file mode 100644 index 00000000000..87afaa92853 Binary files /dev/null and b/.yarn/cache/@swc-core-linux-arm64-gnu-npm-1.3.62-7b527a3356-8.zip differ diff --git a/.yarn/cache/@swc-core-linux-x64-gnu-npm-1.3.62-1fc43a8907-8.zip b/.yarn/cache/@swc-core-linux-x64-gnu-npm-1.3.62-1fc43a8907-8.zip new file mode 100644 index 00000000000..a1aa6dbae5f Binary files /dev/null and b/.yarn/cache/@swc-core-linux-x64-gnu-npm-1.3.62-1fc43a8907-8.zip differ diff --git a/.yarn/cache/@swc-core-npm-1.3.62-9a4c32739d-a7a0d9ffdb.zip b/.yarn/cache/@swc-core-npm-1.3.62-9a4c32739d-a7a0d9ffdb.zip new file mode 100644 index 00000000000..dc6b151bf1a Binary files /dev/null and b/.yarn/cache/@swc-core-npm-1.3.62-9a4c32739d-a7a0d9ffdb.zip differ diff --git a/.yarn/cache/@swc-core-win32-arm64-msvc-npm-1.3.62-f4199145ca-8.zip b/.yarn/cache/@swc-core-win32-arm64-msvc-npm-1.3.62-f4199145ca-8.zip new file mode 100644 index 00000000000..bb62885e7f4 Binary files /dev/null and b/.yarn/cache/@swc-core-win32-arm64-msvc-npm-1.3.62-f4199145ca-8.zip differ diff --git a/.yarn/cache/@swc-core-win32-x64-msvc-npm-1.3.62-200450bac0-8.zip b/.yarn/cache/@swc-core-win32-x64-msvc-npm-1.3.62-200450bac0-8.zip new file mode 100644 index 00000000000..f306c1e943d Binary files /dev/null and b/.yarn/cache/@swc-core-win32-x64-msvc-npm-1.3.62-200450bac0-8.zip differ diff --git a/.yarn/cache/@swc-helpers-npm-0.4.14-f806c3fb16-273fd3f3fc.zip b/.yarn/cache/@swc-helpers-npm-0.4.14-f806c3fb16-273fd3f3fc.zip deleted file mode 100644 index 9cf5ea445e3..00000000000 Binary files a/.yarn/cache/@swc-helpers-npm-0.4.14-f806c3fb16-273fd3f3fc.zip and /dev/null differ diff --git a/.yarn/cache/@swc-helpers-npm-0.5.1-424376f311-71e0e27234.zip b/.yarn/cache/@swc-helpers-npm-0.5.1-424376f311-71e0e27234.zip new file mode 100644 index 00000000000..36ed12e7cb0 Binary files /dev/null and b/.yarn/cache/@swc-helpers-npm-0.5.1-424376f311-71e0e27234.zip differ diff --git a/.yarn/cache/@types-jest-npm-27.4.1-31d07cd0d8-5184f3eef4.zip b/.yarn/cache/@types-jest-npm-27.4.1-31d07cd0d8-5184f3eef4.zip deleted file mode 100644 index 28e1c1b1249..00000000000 Binary files a/.yarn/cache/@types-jest-npm-27.4.1-31d07cd0d8-5184f3eef4.zip and /dev/null differ diff --git a/.yarn/cache/@types-katex-npm-0.14.0-acd5bc3e87-330e0d0337.zip b/.yarn/cache/@types-katex-npm-0.14.0-acd5bc3e87-330e0d0337.zip deleted file mode 100644 index 79825772d5d..00000000000 Binary files a/.yarn/cache/@types-katex-npm-0.14.0-acd5bc3e87-330e0d0337.zip and /dev/null differ diff --git a/.yarn/cache/@types-katex-npm-0.16.5-ff9336f176-a1ce22cd87.zip b/.yarn/cache/@types-katex-npm-0.16.5-ff9336f176-a1ce22cd87.zip new file mode 100644 index 00000000000..92aafc4818a Binary files /dev/null and b/.yarn/cache/@types-katex-npm-0.16.5-ff9336f176-a1ce22cd87.zip differ diff --git a/.yarn/cache/@types-lodash-es-npm-4.17.10-a7dae21818-129e9dde83.zip b/.yarn/cache/@types-lodash-es-npm-4.17.10-a7dae21818-129e9dde83.zip new file mode 100644 index 00000000000..d0043c3a60f Binary files /dev/null and b/.yarn/cache/@types-lodash-es-npm-4.17.10-a7dae21818-129e9dde83.zip differ diff --git a/.yarn/cache/@types-lodash-es-npm-4.17.6-fd5abbdc74-9bd239dd52.zip b/.yarn/cache/@types-lodash-es-npm-4.17.6-fd5abbdc74-9bd239dd52.zip deleted file mode 100644 index 3bd29bcbad1..00000000000 Binary files a/.yarn/cache/@types-lodash-es-npm-4.17.6-fd5abbdc74-9bd239dd52.zip and /dev/null differ diff --git a/.yarn/cache/@types-lodash-npm-4.14.200-8559f51fce-6471f8bb5d.zip b/.yarn/cache/@types-lodash-npm-4.14.200-8559f51fce-6471f8bb5d.zip new file mode 100644 index 00000000000..ae8b2ba4c0c Binary files /dev/null and b/.yarn/cache/@types-lodash-npm-4.14.200-8559f51fce-6471f8bb5d.zip differ diff --git a/.yarn/cache/@ungap-structured-clone-npm-1.2.0-648f0b82e0-4f656b7b46.zip b/.yarn/cache/@ungap-structured-clone-npm-1.2.0-648f0b82e0-4f656b7b46.zip new file mode 100644 index 00000000000..598a36e0855 Binary files /dev/null and b/.yarn/cache/@ungap-structured-clone-npm-1.2.0-648f0b82e0-4f656b7b46.zip differ diff --git a/.yarn/cache/@vitejs-plugin-vue-npm-4.2.1-2b331ccfdc-a7266a4537.zip b/.yarn/cache/@vitejs-plugin-vue-npm-4.2.1-2b331ccfdc-a7266a4537.zip deleted file mode 100644 index 6035cbba067..00000000000 Binary files a/.yarn/cache/@vitejs-plugin-vue-npm-4.2.1-2b331ccfdc-a7266a4537.zip and /dev/null differ diff --git a/.yarn/cache/@vitejs-plugin-vue-npm-4.6.2-d7ace53203-01bc4ed643.zip b/.yarn/cache/@vitejs-plugin-vue-npm-4.6.2-d7ace53203-01bc4ed643.zip new file mode 100644 index 00000000000..7cf07fbe2db Binary files /dev/null and b/.yarn/cache/@vitejs-plugin-vue-npm-4.6.2-d7ace53203-01bc4ed643.zip differ diff --git a/.yarn/cache/@volar-language-core-npm-2.1.4-18ee1a037d-7430f65143.zip b/.yarn/cache/@volar-language-core-npm-2.1.4-18ee1a037d-7430f65143.zip new file mode 100644 index 00000000000..25e6d3f94d2 Binary files /dev/null and b/.yarn/cache/@volar-language-core-npm-2.1.4-18ee1a037d-7430f65143.zip differ diff --git a/.yarn/cache/@volar-language-service-npm-2.1.4-2d34cb628f-06cdcfacf0.zip b/.yarn/cache/@volar-language-service-npm-2.1.4-2d34cb628f-06cdcfacf0.zip new file mode 100644 index 00000000000..5f494d902e7 Binary files /dev/null and b/.yarn/cache/@volar-language-service-npm-2.1.4-2d34cb628f-06cdcfacf0.zip differ diff --git a/.yarn/cache/@volar-source-map-npm-2.1.4-5963b1701f-e2f65bcfd6.zip b/.yarn/cache/@volar-source-map-npm-2.1.4-5963b1701f-e2f65bcfd6.zip new file mode 100644 index 00000000000..0ea96c4d975 Binary files /dev/null and b/.yarn/cache/@volar-source-map-npm-2.1.4-5963b1701f-e2f65bcfd6.zip differ diff --git a/.yarn/cache/@vscode-l10n-npm-0.0.18-8a12efe4b5-c33876cebd.zip b/.yarn/cache/@vscode-l10n-npm-0.0.18-8a12efe4b5-c33876cebd.zip new file mode 100644 index 00000000000..2d6533a2047 Binary files /dev/null and b/.yarn/cache/@vscode-l10n-npm-0.0.18-8a12efe4b5-c33876cebd.zip differ diff --git a/.yarn/cache/@vue-compiler-core-npm-3.2.47-bb08feddfe-9ccc2a0b89.zip b/.yarn/cache/@vue-compiler-core-npm-3.2.47-bb08feddfe-9ccc2a0b89.zip deleted file mode 100644 index a9c27c0e86b..00000000000 Binary files a/.yarn/cache/@vue-compiler-core-npm-3.2.47-bb08feddfe-9ccc2a0b89.zip and /dev/null differ diff --git a/.yarn/cache/@vue-compiler-core-npm-3.4.21-ec7f24d7f5-0d6b7732bc.zip b/.yarn/cache/@vue-compiler-core-npm-3.4.21-ec7f24d7f5-0d6b7732bc.zip new file mode 100644 index 00000000000..ba6ec89e542 Binary files /dev/null and b/.yarn/cache/@vue-compiler-core-npm-3.4.21-ec7f24d7f5-0d6b7732bc.zip differ diff --git a/.yarn/cache/@vue-compiler-dom-npm-3.2.47-a1a6348264-1eced735f8.zip b/.yarn/cache/@vue-compiler-dom-npm-3.2.47-a1a6348264-1eced735f8.zip deleted file mode 100644 index 28c544e9c0c..00000000000 Binary files a/.yarn/cache/@vue-compiler-dom-npm-3.2.47-a1a6348264-1eced735f8.zip and /dev/null differ diff --git a/.yarn/cache/@vue-compiler-dom-npm-3.4.21-3d49f99020-f53e4f4e0a.zip b/.yarn/cache/@vue-compiler-dom-npm-3.4.21-3d49f99020-f53e4f4e0a.zip new file mode 100644 index 00000000000..4d0c8cd01ff Binary files /dev/null and b/.yarn/cache/@vue-compiler-dom-npm-3.4.21-3d49f99020-f53e4f4e0a.zip differ diff --git a/.yarn/cache/@vue-compiler-sfc-npm-3.2.47-d9eca6b75b-4588a51331.zip b/.yarn/cache/@vue-compiler-sfc-npm-3.2.47-d9eca6b75b-4588a51331.zip deleted file mode 100644 index 792c794dc40..00000000000 Binary files a/.yarn/cache/@vue-compiler-sfc-npm-3.2.47-d9eca6b75b-4588a51331.zip and /dev/null differ diff --git a/.yarn/cache/@vue-compiler-sfc-npm-3.4.21-c2b76ee1ff-226dc404be.zip b/.yarn/cache/@vue-compiler-sfc-npm-3.4.21-c2b76ee1ff-226dc404be.zip new file mode 100644 index 00000000000..95e0d0d70cc Binary files /dev/null and b/.yarn/cache/@vue-compiler-sfc-npm-3.4.21-c2b76ee1ff-226dc404be.zip differ diff --git a/.yarn/cache/@vue-compiler-ssr-npm-3.2.47-c46fb0bb52-91bc6e4674.zip b/.yarn/cache/@vue-compiler-ssr-npm-3.2.47-c46fb0bb52-91bc6e4674.zip deleted file mode 100644 index 96c0b15a8f4..00000000000 Binary files a/.yarn/cache/@vue-compiler-ssr-npm-3.2.47-c46fb0bb52-91bc6e4674.zip and /dev/null differ diff --git a/.yarn/cache/@vue-compiler-ssr-npm-3.4.21-e6f043341e-c510bee68b.zip b/.yarn/cache/@vue-compiler-ssr-npm-3.4.21-e6f043341e-c510bee68b.zip new file mode 100644 index 00000000000..f03e17b0803 Binary files /dev/null and b/.yarn/cache/@vue-compiler-ssr-npm-3.4.21-e6f043341e-c510bee68b.zip differ diff --git a/.yarn/cache/@vue-devtools-api-npm-6.4.5-bcd56e5fec-40c5adc878.zip b/.yarn/cache/@vue-devtools-api-npm-6.4.5-bcd56e5fec-40c5adc878.zip deleted file mode 100644 index 2b07edd0a9e..00000000000 Binary files a/.yarn/cache/@vue-devtools-api-npm-6.4.5-bcd56e5fec-40c5adc878.zip and /dev/null differ diff --git a/.yarn/cache/@vue-devtools-api-npm-6.6.1-ef3c82703e-cf12b5ebcc.zip b/.yarn/cache/@vue-devtools-api-npm-6.6.1-ef3c82703e-cf12b5ebcc.zip new file mode 100644 index 00000000000..f14e2cdac7d Binary files /dev/null and b/.yarn/cache/@vue-devtools-api-npm-6.6.1-ef3c82703e-cf12b5ebcc.zip differ diff --git a/.yarn/cache/@vue-language-plugin-pug-npm-2.0.7-547300c7e0-11cc96eb5f.zip b/.yarn/cache/@vue-language-plugin-pug-npm-2.0.7-547300c7e0-11cc96eb5f.zip new file mode 100644 index 00000000000..e637e5f5566 Binary files /dev/null and b/.yarn/cache/@vue-language-plugin-pug-npm-2.0.7-547300c7e0-11cc96eb5f.zip differ diff --git a/.yarn/cache/@vue-reactivity-npm-3.2.47-1182f7aa47-bd61134e4b.zip b/.yarn/cache/@vue-reactivity-npm-3.2.47-1182f7aa47-bd61134e4b.zip deleted file mode 100644 index 149946e8248..00000000000 Binary files a/.yarn/cache/@vue-reactivity-npm-3.2.47-1182f7aa47-bd61134e4b.zip and /dev/null differ diff --git a/.yarn/cache/@vue-reactivity-npm-3.4.21-fd3e254d08-79c7ebe3ec.zip b/.yarn/cache/@vue-reactivity-npm-3.4.21-fd3e254d08-79c7ebe3ec.zip new file mode 100644 index 00000000000..adc965a4734 Binary files /dev/null and b/.yarn/cache/@vue-reactivity-npm-3.4.21-fd3e254d08-79c7ebe3ec.zip differ diff --git a/.yarn/cache/@vue-reactivity-transform-npm-3.2.47-89701a53ab-6fe54374aa.zip b/.yarn/cache/@vue-reactivity-transform-npm-3.2.47-89701a53ab-6fe54374aa.zip deleted file mode 100644 index 3d7a85c70ea..00000000000 Binary files a/.yarn/cache/@vue-reactivity-transform-npm-3.2.47-89701a53ab-6fe54374aa.zip and /dev/null differ diff --git a/.yarn/cache/@vue-runtime-core-npm-3.2.47-d5ec5c27c7-56fd41368c.zip b/.yarn/cache/@vue-runtime-core-npm-3.2.47-d5ec5c27c7-56fd41368c.zip deleted file mode 100644 index 780efab2612..00000000000 Binary files a/.yarn/cache/@vue-runtime-core-npm-3.2.47-d5ec5c27c7-56fd41368c.zip and /dev/null differ diff --git a/.yarn/cache/@vue-runtime-core-npm-3.4.21-7bf985040b-4eb9b5d91f.zip b/.yarn/cache/@vue-runtime-core-npm-3.4.21-7bf985040b-4eb9b5d91f.zip new file mode 100644 index 00000000000..ffb48a907a7 Binary files /dev/null and b/.yarn/cache/@vue-runtime-core-npm-3.4.21-7bf985040b-4eb9b5d91f.zip differ diff --git a/.yarn/cache/@vue-runtime-dom-npm-3.2.47-da74228cd1-8987d72761.zip b/.yarn/cache/@vue-runtime-dom-npm-3.2.47-da74228cd1-8987d72761.zip deleted file mode 100644 index 7399438dbc6..00000000000 Binary files a/.yarn/cache/@vue-runtime-dom-npm-3.2.47-da74228cd1-8987d72761.zip and /dev/null differ diff --git a/.yarn/cache/@vue-runtime-dom-npm-3.4.21-40f99cf9a2-ebfdaa081f.zip b/.yarn/cache/@vue-runtime-dom-npm-3.4.21-40f99cf9a2-ebfdaa081f.zip new file mode 100644 index 00000000000..c65601f0a9e Binary files /dev/null and b/.yarn/cache/@vue-runtime-dom-npm-3.4.21-40f99cf9a2-ebfdaa081f.zip differ diff --git a/.yarn/cache/@vue-server-renderer-npm-3.2.47-b845561a5d-482fe3c9bb.zip b/.yarn/cache/@vue-server-renderer-npm-3.2.47-b845561a5d-482fe3c9bb.zip deleted file mode 100644 index a848ae2600b..00000000000 Binary files a/.yarn/cache/@vue-server-renderer-npm-3.2.47-b845561a5d-482fe3c9bb.zip and /dev/null differ diff --git a/.yarn/cache/@vue-server-renderer-npm-3.4.21-bf6b2daebb-faa3dc4876.zip b/.yarn/cache/@vue-server-renderer-npm-3.4.21-bf6b2daebb-faa3dc4876.zip new file mode 100644 index 00000000000..4da755254b4 Binary files /dev/null and b/.yarn/cache/@vue-server-renderer-npm-3.4.21-bf6b2daebb-faa3dc4876.zip differ diff --git a/.yarn/cache/@vue-shared-npm-3.2.47-efa4e85dc8-0aa711dc91.zip b/.yarn/cache/@vue-shared-npm-3.2.47-efa4e85dc8-0aa711dc91.zip deleted file mode 100644 index 975c32d829a..00000000000 Binary files a/.yarn/cache/@vue-shared-npm-3.2.47-efa4e85dc8-0aa711dc91.zip and /dev/null differ diff --git a/.yarn/cache/@vue-shared-npm-3.4.21-2aee4ae0bc-5f30a40891.zip b/.yarn/cache/@vue-shared-npm-3.4.21-2aee4ae0bc-5f30a40891.zip new file mode 100644 index 00000000000..01c52809b3b Binary files /dev/null and b/.yarn/cache/@vue-shared-npm-3.4.21-2aee4ae0bc-5f30a40891.zip differ diff --git a/.yarn/cache/acorn-npm-8.10.0-2230c9e83e-538ba38af0.zip b/.yarn/cache/acorn-npm-8.10.0-2230c9e83e-538ba38af0.zip new file mode 100644 index 00000000000..6820207002d Binary files /dev/null and b/.yarn/cache/acorn-npm-8.10.0-2230c9e83e-538ba38af0.zip differ diff --git a/.yarn/cache/acorn-npm-8.8.0-9ef399ab45-7270ca82b2.zip b/.yarn/cache/acorn-npm-8.8.0-9ef399ab45-7270ca82b2.zip deleted file mode 100644 index b5376b13928..00000000000 Binary files a/.yarn/cache/acorn-npm-8.8.0-9ef399ab45-7270ca82b2.zip and /dev/null differ diff --git a/.yarn/cache/acorn-walk-npm-8.2.0-2f2cac3177-1715e76c01.zip b/.yarn/cache/acorn-walk-npm-8.2.0-2f2cac3177-1715e76c01.zip deleted file mode 100644 index f140c4ab5c2..00000000000 Binary files a/.yarn/cache/acorn-walk-npm-8.2.0-2f2cac3177-1715e76c01.zip and /dev/null differ diff --git a/.yarn/cache/ansi-styles-npm-5.2.0-72fc7003e3-d7f4e97ce0.zip b/.yarn/cache/ansi-styles-npm-5.2.0-72fc7003e3-d7f4e97ce0.zip deleted file mode 100644 index 62c09039bd1..00000000000 Binary files a/.yarn/cache/ansi-styles-npm-5.2.0-72fc7003e3-d7f4e97ce0.zip and /dev/null differ diff --git a/.yarn/cache/array-buffer-byte-length-npm-1.0.0-331671f28a-044e101ce1.zip b/.yarn/cache/array-buffer-byte-length-npm-1.0.0-331671f28a-044e101ce1.zip new file mode 100644 index 00000000000..d2d609a6675 Binary files /dev/null and b/.yarn/cache/array-buffer-byte-length-npm-1.0.0-331671f28a-044e101ce1.zip differ diff --git a/.yarn/cache/array-includes-npm-3.1.6-d0ff9d248b-f22f8cd8ba.zip b/.yarn/cache/array-includes-npm-3.1.6-d0ff9d248b-f22f8cd8ba.zip deleted file mode 100644 index a1083551bf7..00000000000 Binary files a/.yarn/cache/array-includes-npm-3.1.6-d0ff9d248b-f22f8cd8ba.zip and /dev/null differ diff --git a/.yarn/cache/array-includes-npm-3.1.7-d32a5ee179-06f9e4598f.zip b/.yarn/cache/array-includes-npm-3.1.7-d32a5ee179-06f9e4598f.zip new file mode 100644 index 00000000000..1f7fc2c5773 Binary files /dev/null and b/.yarn/cache/array-includes-npm-3.1.7-d32a5ee179-06f9e4598f.zip differ diff --git a/.yarn/cache/array.prototype.findlastindex-npm-1.2.3-2a36f4417b-31f35d7b37.zip b/.yarn/cache/array.prototype.findlastindex-npm-1.2.3-2a36f4417b-31f35d7b37.zip new file mode 100644 index 00000000000..8aaa4a956a2 Binary files /dev/null and b/.yarn/cache/array.prototype.findlastindex-npm-1.2.3-2a36f4417b-31f35d7b37.zip differ diff --git a/.yarn/cache/array.prototype.flat-npm-1.3.1-e9a9e389c0-5a8415949d.zip b/.yarn/cache/array.prototype.flat-npm-1.3.1-e9a9e389c0-5a8415949d.zip deleted file mode 100644 index f3e42570b91..00000000000 Binary files a/.yarn/cache/array.prototype.flat-npm-1.3.1-e9a9e389c0-5a8415949d.zip and /dev/null differ diff --git a/.yarn/cache/array.prototype.flat-npm-1.3.2-350729f7f4-5d6b4bf102.zip b/.yarn/cache/array.prototype.flat-npm-1.3.2-350729f7f4-5d6b4bf102.zip new file mode 100644 index 00000000000..7720137d70f Binary files /dev/null and b/.yarn/cache/array.prototype.flat-npm-1.3.2-350729f7f4-5d6b4bf102.zip differ diff --git a/.yarn/cache/array.prototype.flatmap-npm-1.3.1-c65186ca34-8c1c43a499.zip b/.yarn/cache/array.prototype.flatmap-npm-1.3.1-c65186ca34-8c1c43a499.zip deleted file mode 100644 index a791d28dca9..00000000000 Binary files a/.yarn/cache/array.prototype.flatmap-npm-1.3.1-c65186ca34-8c1c43a499.zip and /dev/null differ diff --git a/.yarn/cache/array.prototype.flatmap-npm-1.3.2-5c6a4af226-ce09fe21dc.zip b/.yarn/cache/array.prototype.flatmap-npm-1.3.2-5c6a4af226-ce09fe21dc.zip new file mode 100644 index 00000000000..2553a317f10 Binary files /dev/null and b/.yarn/cache/array.prototype.flatmap-npm-1.3.2-5c6a4af226-ce09fe21dc.zip differ diff --git a/.yarn/cache/arraybuffer.prototype.slice-npm-1.0.2-4eda52ad8c-c200faf437.zip b/.yarn/cache/arraybuffer.prototype.slice-npm-1.0.2-4eda52ad8c-c200faf437.zip new file mode 100644 index 00000000000..559e55f81ab Binary files /dev/null and b/.yarn/cache/arraybuffer.prototype.slice-npm-1.0.2-4eda52ad8c-c200faf437.zip differ diff --git a/.yarn/cache/async-validator-npm-4.1.1-470b8d5b59-88590ab8ad.zip b/.yarn/cache/async-validator-npm-4.1.1-470b8d5b59-88590ab8ad.zip deleted file mode 100644 index 71730f2e231..00000000000 Binary files a/.yarn/cache/async-validator-npm-4.1.1-470b8d5b59-88590ab8ad.zip and /dev/null differ diff --git a/.yarn/cache/async-validator-npm-4.2.5-4d61110c66-3e3d891a2e.zip b/.yarn/cache/async-validator-npm-4.2.5-4d61110c66-3e3d891a2e.zip new file mode 100644 index 00000000000..36bedd6286e Binary files /dev/null and b/.yarn/cache/async-validator-npm-4.2.5-4d61110c66-3e3d891a2e.zip differ diff --git a/.yarn/cache/bootstrap-icons-npm-1.10.5-36f80ab074-8a0cfbd237.zip b/.yarn/cache/bootstrap-icons-npm-1.10.5-36f80ab074-8a0cfbd237.zip deleted file mode 100644 index 5aef05dd974..00000000000 Binary files a/.yarn/cache/bootstrap-icons-npm-1.10.5-36f80ab074-8a0cfbd237.zip and /dev/null differ diff --git a/.yarn/cache/bootstrap-icons-npm-1.11.3-8d5387bef2-d5cdb90fe3.zip b/.yarn/cache/bootstrap-icons-npm-1.11.3-8d5387bef2-d5cdb90fe3.zip new file mode 100644 index 00000000000..e20ab2ecb3b Binary files /dev/null and b/.yarn/cache/bootstrap-icons-npm-1.11.3-8d5387bef2-d5cdb90fe3.zip differ diff --git a/.yarn/cache/bootstrap-npm-5.2.3-7458283a23-0211805dec.zip b/.yarn/cache/bootstrap-npm-5.2.3-7458283a23-0211805dec.zip deleted file mode 100644 index 24c59290c55..00000000000 Binary files a/.yarn/cache/bootstrap-npm-5.2.3-7458283a23-0211805dec.zip and /dev/null differ diff --git a/.yarn/cache/bootstrap-npm-5.3.3-da08e2f0fe-537b68db30.zip b/.yarn/cache/bootstrap-npm-5.3.3-da08e2f0fe-537b68db30.zip new file mode 100644 index 00000000000..ca3961acc15 Binary files /dev/null and b/.yarn/cache/bootstrap-npm-5.3.3-da08e2f0fe-537b68db30.zip differ diff --git a/.yarn/cache/browser-fs-access-npm-0.33.1-1af7eeff22-2fb595c2d2.zip b/.yarn/cache/browser-fs-access-npm-0.33.1-1af7eeff22-2fb595c2d2.zip deleted file mode 100644 index 0a5ae951415..00000000000 Binary files a/.yarn/cache/browser-fs-access-npm-0.33.1-1af7eeff22-2fb595c2d2.zip and /dev/null differ diff --git a/.yarn/cache/browser-fs-access-npm-0.35.0-1577b5a7ba-5f3bf1ec17.zip b/.yarn/cache/browser-fs-access-npm-0.35.0-1577b5a7ba-5f3bf1ec17.zip new file mode 100644 index 00000000000..2202ffed8e5 Binary files /dev/null and b/.yarn/cache/browser-fs-access-npm-0.35.0-1577b5a7ba-5f3bf1ec17.zip differ diff --git a/.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip b/.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip deleted file mode 100644 index efe1b763807..00000000000 Binary files a/.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip and /dev/null differ diff --git a/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip b/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip new file mode 100644 index 00000000000..c7e20444c61 Binary files /dev/null and b/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip differ diff --git a/.yarn/cache/c8-npm-7.13.0-9ac8f17e2c-491abf4cf3.zip b/.yarn/cache/c8-npm-7.13.0-9ac8f17e2c-491abf4cf3.zip deleted file mode 100644 index a457d8fb705..00000000000 Binary files a/.yarn/cache/c8-npm-7.13.0-9ac8f17e2c-491abf4cf3.zip and /dev/null differ diff --git a/.yarn/cache/c8-npm-9.1.0-92c3d37f46-c5249bf9c3.zip b/.yarn/cache/c8-npm-9.1.0-92c3d37f46-c5249bf9c3.zip new file mode 100644 index 00000000000..1e5812b784f Binary files /dev/null and b/.yarn/cache/c8-npm-9.1.0-92c3d37f46-c5249bf9c3.zip differ diff --git a/.yarn/cache/call-bind-npm-1.0.5-65600fae47-449e83ecbd.zip b/.yarn/cache/call-bind-npm-1.0.5-65600fae47-449e83ecbd.zip new file mode 100644 index 00000000000..29854c129a4 Binary files /dev/null and b/.yarn/cache/call-bind-npm-1.0.5-65600fae47-449e83ecbd.zip differ diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001481-cd8272ecaa-8200a043c1.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001481-cd8272ecaa-8200a043c1.zip deleted file mode 100644 index f08e1fb3554..00000000000 Binary files a/.yarn/cache/caniuse-lite-npm-1.0.30001481-cd8272ecaa-8200a043c1.zip and /dev/null differ diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001603-77af81f60b-e66e0d24b8.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001603-77af81f60b-e66e0d24b8.zip new file mode 100644 index 00000000000..f3bd2d06bca Binary files /dev/null and b/.yarn/cache/caniuse-lite-npm-1.0.30001603-77af81f60b-e66e0d24b8.zip differ diff --git a/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip b/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip deleted file mode 100644 index 24f58564e46..00000000000 Binary files a/.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-ce2e8f578a.zip and /dev/null differ diff --git a/.yarn/cache/cliui-npm-8.0.1-3b029092cf-79648b3b00.zip b/.yarn/cache/cliui-npm-8.0.1-3b029092cf-79648b3b00.zip new file mode 100644 index 00000000000..a90643c5e5a Binary files /dev/null and b/.yarn/cache/cliui-npm-8.0.1-3b029092cf-79648b3b00.zip differ diff --git a/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip b/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip deleted file mode 100644 index 6a14adf507d..00000000000 Binary files a/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip and /dev/null differ diff --git a/.yarn/cache/css-render-npm-0.15.12-ff93ab2bdd-80265c5055.zip b/.yarn/cache/css-render-npm-0.15.12-ff93ab2bdd-80265c5055.zip new file mode 100644 index 00000000000..a23ef5e7b96 Binary files /dev/null and b/.yarn/cache/css-render-npm-0.15.12-ff93ab2bdd-80265c5055.zip differ diff --git a/.yarn/cache/csstype-npm-2.6.20-7c929732a1-cb5d5ded49.zip b/.yarn/cache/csstype-npm-2.6.20-7c929732a1-cb5d5ded49.zip deleted file mode 100644 index 59ddf4f69fc..00000000000 Binary files a/.yarn/cache/csstype-npm-2.6.20-7c929732a1-cb5d5ded49.zip and /dev/null differ diff --git a/.yarn/cache/csstype-npm-3.1.3-e9a1c85013-8db785cc92.zip b/.yarn/cache/csstype-npm-3.1.3-e9a1c85013-8db785cc92.zip new file mode 100644 index 00000000000..9853f0cf0b0 Binary files /dev/null and b/.yarn/cache/csstype-npm-3.1.3-e9a1c85013-8db785cc92.zip differ diff --git a/.yarn/cache/d3-npm-7.8.4-2a6380492b-8dfea4d026.zip b/.yarn/cache/d3-npm-7.8.4-2a6380492b-8dfea4d026.zip deleted file mode 100644 index ca5a565ef8e..00000000000 Binary files a/.yarn/cache/d3-npm-7.8.4-2a6380492b-8dfea4d026.zip and /dev/null differ diff --git a/.yarn/cache/d3-npm-7.9.0-d293821ce6-1c0e9135f1.zip b/.yarn/cache/d3-npm-7.9.0-d293821ce6-1c0e9135f1.zip new file mode 100644 index 00000000000..e78ffffee57 Binary files /dev/null and b/.yarn/cache/d3-npm-7.9.0-d293821ce6-1c0e9135f1.zip differ diff --git a/.yarn/cache/date-fns-npm-2.28.0-c19c5add1b-a0516b2e4f.zip b/.yarn/cache/date-fns-npm-2.28.0-c19c5add1b-a0516b2e4f.zip deleted file mode 100644 index 1e88493b725..00000000000 Binary files a/.yarn/cache/date-fns-npm-2.28.0-c19c5add1b-a0516b2e4f.zip and /dev/null differ diff --git a/.yarn/cache/date-fns-npm-2.30.0-895c790e0f-f7be015232.zip b/.yarn/cache/date-fns-npm-2.30.0-895c790e0f-f7be015232.zip new file mode 100644 index 00000000000..f51ffd3ec9f Binary files /dev/null and b/.yarn/cache/date-fns-npm-2.30.0-895c790e0f-f7be015232.zip differ diff --git a/.yarn/cache/date-fns-tz-npm-1.3.3-4b42de3dcf-52111dffb4.zip b/.yarn/cache/date-fns-tz-npm-1.3.3-4b42de3dcf-52111dffb4.zip deleted file mode 100644 index 856e44240d0..00000000000 Binary files a/.yarn/cache/date-fns-tz-npm-1.3.3-4b42de3dcf-52111dffb4.zip and /dev/null differ diff --git a/.yarn/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip b/.yarn/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip new file mode 100644 index 00000000000..337d3f2fd4c Binary files /dev/null and b/.yarn/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip differ diff --git a/.yarn/cache/deepmerge-npm-4.2.2-112165ced2-a8c43a1ed8.zip b/.yarn/cache/deepmerge-npm-4.2.2-112165ced2-a8c43a1ed8.zip deleted file mode 100644 index 3e07a61c478..00000000000 Binary files a/.yarn/cache/deepmerge-npm-4.2.2-112165ced2-a8c43a1ed8.zip and /dev/null differ diff --git a/.yarn/cache/define-data-property-npm-1.1.1-2b5156d112-a29855ad3f.zip b/.yarn/cache/define-data-property-npm-1.1.1-2b5156d112-a29855ad3f.zip new file mode 100644 index 00000000000..75936e23744 Binary files /dev/null and b/.yarn/cache/define-data-property-npm-1.1.1-2b5156d112-a29855ad3f.zip differ diff --git a/.yarn/cache/define-properties-npm-1.2.0-3547cd0fd2-e60aee6a19.zip b/.yarn/cache/define-properties-npm-1.2.0-3547cd0fd2-e60aee6a19.zip new file mode 100644 index 00000000000..bcbfcf6e68f Binary files /dev/null and b/.yarn/cache/define-properties-npm-1.2.0-3547cd0fd2-e60aee6a19.zip differ diff --git a/.yarn/cache/detect-libc-npm-2.0.2-03afa59137-2b2cd3649b.zip b/.yarn/cache/detect-libc-npm-2.0.2-03afa59137-2b2cd3649b.zip new file mode 100644 index 00000000000..1db92146bac Binary files /dev/null and b/.yarn/cache/detect-libc-npm-2.0.2-03afa59137-2b2cd3649b.zip differ diff --git a/.yarn/cache/diff-sequences-npm-27.5.1-29338362fa-a00db5554c.zip b/.yarn/cache/diff-sequences-npm-27.5.1-29338362fa-a00db5554c.zip deleted file mode 100644 index ddfadea4583..00000000000 Binary files a/.yarn/cache/diff-sequences-npm-27.5.1-29338362fa-a00db5554c.zip and /dev/null differ diff --git a/.yarn/cache/entities-npm-4.5.0-7cdb83b832-853f8ebd5b.zip b/.yarn/cache/entities-npm-4.5.0-7cdb83b832-853f8ebd5b.zip new file mode 100644 index 00000000000..3772a4510ca Binary files /dev/null and b/.yarn/cache/entities-npm-4.5.0-7cdb83b832-853f8ebd5b.zip differ diff --git a/.yarn/cache/es-abstract-npm-1.21.1-28d9a4a469-23ff60d42d.zip b/.yarn/cache/es-abstract-npm-1.21.1-28d9a4a469-23ff60d42d.zip deleted file mode 100644 index 46e5d7d326f..00000000000 Binary files a/.yarn/cache/es-abstract-npm-1.21.1-28d9a4a469-23ff60d42d.zip and /dev/null differ diff --git a/.yarn/cache/es-abstract-npm-1.22.3-15a58832e5-b1bdc96285.zip b/.yarn/cache/es-abstract-npm-1.22.3-15a58832e5-b1bdc96285.zip new file mode 100644 index 00000000000..f72f30d6f55 Binary files /dev/null and b/.yarn/cache/es-abstract-npm-1.22.3-15a58832e5-b1bdc96285.zip differ diff --git a/.yarn/cache/esbuild-npm-0.17.13-538abc913d-c3be8d41a3.zip b/.yarn/cache/esbuild-npm-0.17.13-538abc913d-c3be8d41a3.zip deleted file mode 100644 index 994bb8b78f5..00000000000 Binary files a/.yarn/cache/esbuild-npm-0.17.13-538abc913d-c3be8d41a3.zip and /dev/null differ diff --git a/.yarn/cache/esbuild-npm-0.18.20-004a76d281-5d253614e5.zip b/.yarn/cache/esbuild-npm-0.18.20-004a76d281-5d253614e5.zip new file mode 100644 index 00000000000..74931c9be30 Binary files /dev/null and b/.yarn/cache/esbuild-npm-0.18.20-004a76d281-5d253614e5.zip differ diff --git a/.yarn/cache/eslint-compat-utils-npm-0.1.2-361c6992b1-2315d9db81.zip b/.yarn/cache/eslint-compat-utils-npm-0.1.2-361c6992b1-2315d9db81.zip new file mode 100644 index 00000000000..505e336b087 Binary files /dev/null and b/.yarn/cache/eslint-compat-utils-npm-0.1.2-361c6992b1-2315d9db81.zip differ diff --git a/.yarn/cache/eslint-config-standard-npm-17.0.0-2803f6a79a-dc0ed51e18.zip b/.yarn/cache/eslint-config-standard-npm-17.0.0-2803f6a79a-dc0ed51e18.zip deleted file mode 100644 index 0cb3ae760a3..00000000000 Binary files a/.yarn/cache/eslint-config-standard-npm-17.0.0-2803f6a79a-dc0ed51e18.zip and /dev/null differ diff --git a/.yarn/cache/eslint-config-standard-npm-17.1.0-e72fd623cc-8ed14ffe42.zip b/.yarn/cache/eslint-config-standard-npm-17.1.0-e72fd623cc-8ed14ffe42.zip new file mode 100644 index 00000000000..1cc26fbd860 Binary files /dev/null and b/.yarn/cache/eslint-config-standard-npm-17.1.0-e72fd623cc-8ed14ffe42.zip differ diff --git a/.yarn/cache/eslint-import-resolver-node-npm-0.3.7-65bed19543-3379aacf1d.zip b/.yarn/cache/eslint-import-resolver-node-npm-0.3.7-65bed19543-3379aacf1d.zip deleted file mode 100644 index f9111a337b5..00000000000 Binary files a/.yarn/cache/eslint-import-resolver-node-npm-0.3.7-65bed19543-3379aacf1d.zip and /dev/null differ diff --git a/.yarn/cache/eslint-import-resolver-node-npm-0.3.9-2a426afc4b-439b912712.zip b/.yarn/cache/eslint-import-resolver-node-npm-0.3.9-2a426afc4b-439b912712.zip new file mode 100644 index 00000000000..f2e17574bdb Binary files /dev/null and b/.yarn/cache/eslint-import-resolver-node-npm-0.3.9-2a426afc4b-439b912712.zip differ diff --git a/.yarn/cache/eslint-module-utils-npm-2.7.4-a1640084cb-5da13645da.zip b/.yarn/cache/eslint-module-utils-npm-2.7.4-a1640084cb-5da13645da.zip deleted file mode 100644 index 005d442b0f9..00000000000 Binary files a/.yarn/cache/eslint-module-utils-npm-2.7.4-a1640084cb-5da13645da.zip and /dev/null differ diff --git a/.yarn/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-74c6dfea76.zip b/.yarn/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-74c6dfea76.zip new file mode 100644 index 00000000000..964bee4e4de Binary files /dev/null and b/.yarn/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-74c6dfea76.zip differ diff --git a/.yarn/cache/eslint-npm-8.39.0-d92bace04d-d7a074ff32.zip b/.yarn/cache/eslint-npm-8.39.0-d92bace04d-d7a074ff32.zip deleted file mode 100644 index 8c0e13f66fe..00000000000 Binary files a/.yarn/cache/eslint-npm-8.39.0-d92bace04d-d7a074ff32.zip and /dev/null differ diff --git a/.yarn/cache/eslint-npm-8.57.0-4286e12a3a-3a48d7ff85.zip b/.yarn/cache/eslint-npm-8.57.0-4286e12a3a-3a48d7ff85.zip new file mode 100644 index 00000000000..73f8f9dff6f Binary files /dev/null and b/.yarn/cache/eslint-npm-8.57.0-4286e12a3a-3a48d7ff85.zip differ diff --git a/.yarn/cache/eslint-plugin-cypress-npm-2.13.3-0ad3bff9c9-9affbcee29.zip b/.yarn/cache/eslint-plugin-cypress-npm-2.13.3-0ad3bff9c9-9affbcee29.zip deleted file mode 100644 index 8ba449dd877..00000000000 Binary files a/.yarn/cache/eslint-plugin-cypress-npm-2.13.3-0ad3bff9c9-9affbcee29.zip and /dev/null differ diff --git a/.yarn/cache/eslint-plugin-cypress-npm-2.15.1-90f777d9bd-3e66fa9a94.zip b/.yarn/cache/eslint-plugin-cypress-npm-2.15.1-90f777d9bd-3e66fa9a94.zip new file mode 100644 index 00000000000..13724ec234a Binary files /dev/null and b/.yarn/cache/eslint-plugin-cypress-npm-2.15.1-90f777d9bd-3e66fa9a94.zip differ diff --git a/.yarn/cache/eslint-plugin-es-x-npm-7.5.0-77e84d6e5d-e770e57df7.zip b/.yarn/cache/eslint-plugin-es-x-npm-7.5.0-77e84d6e5d-e770e57df7.zip new file mode 100644 index 00000000000..1d334e0a107 Binary files /dev/null and b/.yarn/cache/eslint-plugin-es-x-npm-7.5.0-77e84d6e5d-e770e57df7.zip differ diff --git a/.yarn/cache/eslint-plugin-import-npm-2.27.5-35b044b26f-f500571a38.zip b/.yarn/cache/eslint-plugin-import-npm-2.27.5-35b044b26f-f500571a38.zip deleted file mode 100644 index 6b2c4b1f33d..00000000000 Binary files a/.yarn/cache/eslint-plugin-import-npm-2.27.5-35b044b26f-f500571a38.zip and /dev/null differ diff --git a/.yarn/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-e65159aef8.zip b/.yarn/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-e65159aef8.zip new file mode 100644 index 00000000000..bc424a6a644 Binary files /dev/null and b/.yarn/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-e65159aef8.zip differ diff --git a/.yarn/cache/eslint-plugin-n-npm-15.7.0-8ea46b0c89-cfbcc67e62.zip b/.yarn/cache/eslint-plugin-n-npm-15.7.0-8ea46b0c89-cfbcc67e62.zip deleted file mode 100644 index 0bcae16736b..00000000000 Binary files a/.yarn/cache/eslint-plugin-n-npm-15.7.0-8ea46b0c89-cfbcc67e62.zip and /dev/null differ diff --git a/.yarn/cache/eslint-plugin-n-npm-16.6.2-77775852d0-3b468da003.zip b/.yarn/cache/eslint-plugin-n-npm-16.6.2-77775852d0-3b468da003.zip new file mode 100644 index 00000000000..9c7224993f0 Binary files /dev/null and b/.yarn/cache/eslint-plugin-n-npm-16.6.2-77775852d0-3b468da003.zip differ diff --git a/.yarn/cache/eslint-plugin-vue-npm-9.11.0-b3c0e8ae5d-1bcb6cf768.zip b/.yarn/cache/eslint-plugin-vue-npm-9.11.0-b3c0e8ae5d-1bcb6cf768.zip deleted file mode 100644 index 2e16ba40d50..00000000000 Binary files a/.yarn/cache/eslint-plugin-vue-npm-9.11.0-b3c0e8ae5d-1bcb6cf768.zip and /dev/null differ diff --git a/.yarn/cache/eslint-plugin-vue-npm-9.24.0-4c6dba51bf-2309b919d8.zip b/.yarn/cache/eslint-plugin-vue-npm-9.24.0-4c6dba51bf-2309b919d8.zip new file mode 100644 index 00000000000..285d11da2d8 Binary files /dev/null and b/.yarn/cache/eslint-plugin-vue-npm-9.24.0-4c6dba51bf-2309b919d8.zip differ diff --git a/.yarn/cache/eslint-scope-npm-7.2.0-88784f5a38-64591a2d8b.zip b/.yarn/cache/eslint-scope-npm-7.2.0-88784f5a38-64591a2d8b.zip deleted file mode 100644 index 466323f2bc9..00000000000 Binary files a/.yarn/cache/eslint-scope-npm-7.2.0-88784f5a38-64591a2d8b.zip and /dev/null differ diff --git a/.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip b/.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip new file mode 100644 index 00000000000..29b002eb988 Binary files /dev/null and b/.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip differ diff --git a/.yarn/cache/eslint-visitor-keys-npm-3.4.0-dc8683d774-3315916946.zip b/.yarn/cache/eslint-visitor-keys-npm-3.4.0-dc8683d774-3315916946.zip deleted file mode 100644 index 0f229634aed..00000000000 Binary files a/.yarn/cache/eslint-visitor-keys-npm-3.4.0-dc8683d774-3315916946.zip and /dev/null differ diff --git a/.yarn/cache/eslint-visitor-keys-npm-3.4.1-a5d0a58208-f05121d868.zip b/.yarn/cache/eslint-visitor-keys-npm-3.4.1-a5d0a58208-f05121d868.zip new file mode 100644 index 00000000000..e442ca3b416 Binary files /dev/null and b/.yarn/cache/eslint-visitor-keys-npm-3.4.1-a5d0a58208-f05121d868.zip differ diff --git a/.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-36e9ef87fc.zip b/.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-36e9ef87fc.zip new file mode 100644 index 00000000000..7c61b814bff Binary files /dev/null and b/.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-36e9ef87fc.zip differ diff --git a/.yarn/cache/espree-npm-9.5.1-057dc7b3c1-cdf6e43540.zip b/.yarn/cache/espree-npm-9.5.1-057dc7b3c1-cdf6e43540.zip deleted file mode 100644 index 5c2543e3f27..00000000000 Binary files a/.yarn/cache/espree-npm-9.5.1-057dc7b3c1-cdf6e43540.zip and /dev/null differ diff --git a/.yarn/cache/espree-npm-9.6.1-a50722a5a9-eb8c149c7a.zip b/.yarn/cache/espree-npm-9.6.1-a50722a5a9-eb8c149c7a.zip new file mode 100644 index 00000000000..0014c0574a5 Binary files /dev/null and b/.yarn/cache/espree-npm-9.6.1-a50722a5a9-eb8c149c7a.zip differ diff --git a/.yarn/cache/foreground-child-npm-2.0.0-80c976b61e-f77ec9aff6.zip b/.yarn/cache/foreground-child-npm-2.0.0-80c976b61e-f77ec9aff6.zip deleted file mode 100644 index d947311d1e9..00000000000 Binary files a/.yarn/cache/foreground-child-npm-2.0.0-80c976b61e-f77ec9aff6.zip and /dev/null differ diff --git a/.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip b/.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip new file mode 100644 index 00000000000..55fbdad3a3b Binary files /dev/null and b/.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip differ diff --git a/.yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-acd21d733a.zip b/.yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-acd21d733a.zip deleted file mode 100644 index ac0af539ea9..00000000000 Binary files a/.yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-acd21d733a.zip and /dev/null differ diff --git a/.yarn/cache/function.prototype.name-npm-1.1.6-fd3a6a5cdd-7a3f9bd98a.zip b/.yarn/cache/function.prototype.name-npm-1.1.6-fd3a6a5cdd-7a3f9bd98a.zip new file mode 100644 index 00000000000..9c6ff345f9b Binary files /dev/null and b/.yarn/cache/function.prototype.name-npm-1.1.6-fd3a6a5cdd-7a3f9bd98a.zip differ diff --git a/.yarn/cache/get-intrinsic-npm-1.2.1-ae857fd610-5b61d88552.zip b/.yarn/cache/get-intrinsic-npm-1.2.1-ae857fd610-5b61d88552.zip new file mode 100644 index 00000000000..687f611165a Binary files /dev/null and b/.yarn/cache/get-intrinsic-npm-1.2.1-ae857fd610-5b61d88552.zip differ diff --git a/.yarn/cache/get-intrinsic-npm-1.2.2-3f446d8847-447ff0724d.zip b/.yarn/cache/get-intrinsic-npm-1.2.2-3f446d8847-447ff0724d.zip new file mode 100644 index 00000000000..510eb5f0ed9 Binary files /dev/null and b/.yarn/cache/get-intrinsic-npm-1.2.2-3f446d8847-447ff0724d.zip differ diff --git a/.yarn/cache/get-tsconfig-npm-4.7.2-8fbccd9fcf-1723589032.zip b/.yarn/cache/get-tsconfig-npm-4.7.2-8fbccd9fcf-1723589032.zip new file mode 100644 index 00000000000..6580ce43519 Binary files /dev/null and b/.yarn/cache/get-tsconfig-npm-4.7.2-8fbccd9fcf-1723589032.zip differ diff --git a/.yarn/cache/globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip b/.yarn/cache/globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip deleted file mode 100644 index 306b5aacad3..00000000000 Binary files a/.yarn/cache/globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip and /dev/null differ diff --git a/.yarn/cache/globals-npm-13.21.0-c0829ce1cb-86c92ca8a0.zip b/.yarn/cache/globals-npm-13.21.0-c0829ce1cb-86c92ca8a0.zip new file mode 100644 index 00000000000..597f67a92ed Binary files /dev/null and b/.yarn/cache/globals-npm-13.21.0-c0829ce1cb-86c92ca8a0.zip differ diff --git a/.yarn/cache/globals-npm-13.24.0-cc7713139c-56066ef058.zip b/.yarn/cache/globals-npm-13.24.0-cc7713139c-56066ef058.zip new file mode 100644 index 00000000000..c8cb0244afd Binary files /dev/null and b/.yarn/cache/globals-npm-13.24.0-cc7713139c-56066ef058.zip differ diff --git a/.yarn/cache/grapheme-splitter-npm-1.0.4-648f2bf509-0c22ec54de.zip b/.yarn/cache/grapheme-splitter-npm-1.0.4-648f2bf509-0c22ec54de.zip deleted file mode 100644 index 1eb26cc6a98..00000000000 Binary files a/.yarn/cache/grapheme-splitter-npm-1.0.4-648f2bf509-0c22ec54de.zip and /dev/null differ diff --git a/.yarn/cache/graphemer-npm-1.4.0-0627732d35-bab8f0be9b.zip b/.yarn/cache/graphemer-npm-1.4.0-0627732d35-bab8f0be9b.zip new file mode 100644 index 00000000000..e04f8d37244 Binary files /dev/null and b/.yarn/cache/graphemer-npm-1.4.0-0627732d35-bab8f0be9b.zip differ diff --git a/.yarn/cache/hasown-npm-2.0.0-78b794ceef-6151c75ca1.zip b/.yarn/cache/hasown-npm-2.0.0-78b794ceef-6151c75ca1.zip new file mode 100644 index 00000000000..5454406288a Binary files /dev/null and b/.yarn/cache/hasown-npm-2.0.0-78b794ceef-6151c75ca1.zip differ diff --git a/.yarn/cache/highcharts-npm-11.0.1-05a14e3887-773a7b8765.zip b/.yarn/cache/highcharts-npm-11.0.1-05a14e3887-773a7b8765.zip deleted file mode 100644 index c953a64563b..00000000000 Binary files a/.yarn/cache/highcharts-npm-11.0.1-05a14e3887-773a7b8765.zip and /dev/null differ diff --git a/.yarn/cache/highcharts-npm-11.4.0-8a1f46b545-873e661914.zip b/.yarn/cache/highcharts-npm-11.4.0-8a1f46b545-873e661914.zip new file mode 100644 index 00000000000..9c2f2df1544 Binary files /dev/null and b/.yarn/cache/highcharts-npm-11.4.0-8a1f46b545-873e661914.zip differ diff --git a/.yarn/cache/highlight.js-npm-11.5.1-0fb1167640-bff556101d.zip b/.yarn/cache/highlight.js-npm-11.5.1-0fb1167640-bff556101d.zip deleted file mode 100644 index efbd98ed5de..00000000000 Binary files a/.yarn/cache/highlight.js-npm-11.5.1-0fb1167640-bff556101d.zip and /dev/null differ diff --git a/.yarn/cache/highlight.js-npm-11.9.0-ec99f7b12f-4043d31c5d.zip b/.yarn/cache/highlight.js-npm-11.9.0-ec99f7b12f-4043d31c5d.zip new file mode 100644 index 00000000000..7a740063fa6 Binary files /dev/null and b/.yarn/cache/highlight.js-npm-11.9.0-ec99f7b12f-4043d31c5d.zip differ diff --git a/.yarn/cache/html-validate-npm-7.16.0-ceaf62fb08-cce9a9e8f7.zip b/.yarn/cache/html-validate-npm-7.16.0-ceaf62fb08-cce9a9e8f7.zip deleted file mode 100644 index 21317c53e85..00000000000 Binary files a/.yarn/cache/html-validate-npm-7.16.0-ceaf62fb08-cce9a9e8f7.zip and /dev/null differ diff --git a/.yarn/cache/html-validate-npm-8.18.1-c5271a0fb9-53479bf75b.zip b/.yarn/cache/html-validate-npm-8.18.1-c5271a0fb9-53479bf75b.zip new file mode 100644 index 00000000000..b2f855af033 Binary files /dev/null and b/.yarn/cache/html-validate-npm-8.18.1-c5271a0fb9-53479bf75b.zip differ diff --git a/.yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip b/.yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip new file mode 100644 index 00000000000..50627d8e106 Binary files /dev/null and b/.yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip differ diff --git a/.yarn/cache/ignore-npm-5.3.1-f6947c5df7-71d7bb4c1d.zip b/.yarn/cache/ignore-npm-5.3.1-f6947c5df7-71d7bb4c1d.zip new file mode 100644 index 00000000000..75ba53a2709 Binary files /dev/null and b/.yarn/cache/ignore-npm-5.3.1-f6947c5df7-71d7bb4c1d.zip differ diff --git a/.yarn/cache/internal-slot-npm-1.0.4-9183007374-8974588d06.zip b/.yarn/cache/internal-slot-npm-1.0.4-9183007374-8974588d06.zip deleted file mode 100644 index cba2d7ba669..00000000000 Binary files a/.yarn/cache/internal-slot-npm-1.0.4-9183007374-8974588d06.zip and /dev/null differ diff --git a/.yarn/cache/internal-slot-npm-1.0.5-a2241f3e66-97e84046bf.zip b/.yarn/cache/internal-slot-npm-1.0.5-a2241f3e66-97e84046bf.zip new file mode 100644 index 00000000000..18fccd3ac20 Binary files /dev/null and b/.yarn/cache/internal-slot-npm-1.0.5-a2241f3e66-97e84046bf.zip differ diff --git a/.yarn/cache/is-array-buffer-npm-3.0.2-0dec897785-dcac9dda66.zip b/.yarn/cache/is-array-buffer-npm-3.0.2-0dec897785-dcac9dda66.zip new file mode 100644 index 00000000000..7556381d456 Binary files /dev/null and b/.yarn/cache/is-array-buffer-npm-3.0.2-0dec897785-dcac9dda66.zip differ diff --git a/.yarn/cache/is-builtin-module-npm-3.2.1-2f92a5d353-e8f0ffc19a.zip b/.yarn/cache/is-builtin-module-npm-3.2.1-2f92a5d353-e8f0ffc19a.zip new file mode 100644 index 00000000000..be908976b53 Binary files /dev/null and b/.yarn/cache/is-builtin-module-npm-3.2.1-2f92a5d353-e8f0ffc19a.zip differ diff --git a/.yarn/cache/is-core-module-npm-2.10.0-6dff9310aa-0f3f77811f.zip b/.yarn/cache/is-core-module-npm-2.10.0-6dff9310aa-0f3f77811f.zip deleted file mode 100644 index 42dc0c31ebf..00000000000 Binary files a/.yarn/cache/is-core-module-npm-2.10.0-6dff9310aa-0f3f77811f.zip and /dev/null differ diff --git a/.yarn/cache/is-core-module-npm-2.11.0-70061e141a-f96fd490c6.zip b/.yarn/cache/is-core-module-npm-2.11.0-70061e141a-f96fd490c6.zip deleted file mode 100644 index 4b89bc40ec2..00000000000 Binary files a/.yarn/cache/is-core-module-npm-2.11.0-70061e141a-f96fd490c6.zip and /dev/null differ diff --git a/.yarn/cache/is-core-module-npm-2.12.1-ce74e89160-f04ea30533.zip b/.yarn/cache/is-core-module-npm-2.12.1-ce74e89160-f04ea30533.zip new file mode 100644 index 00000000000..9512b2ef2b1 Binary files /dev/null and b/.yarn/cache/is-core-module-npm-2.12.1-ce74e89160-f04ea30533.zip differ diff --git a/.yarn/cache/is-core-module-npm-2.13.0-e444c50225-053ab101fb.zip b/.yarn/cache/is-core-module-npm-2.13.0-e444c50225-053ab101fb.zip new file mode 100644 index 00000000000..636775cb5ed Binary files /dev/null and b/.yarn/cache/is-core-module-npm-2.13.0-e444c50225-053ab101fb.zip differ diff --git a/.yarn/cache/is-core-module-npm-2.13.1-36e17434f9-256559ee8a.zip b/.yarn/cache/is-core-module-npm-2.13.1-36e17434f9-256559ee8a.zip new file mode 100644 index 00000000000..897f5056855 Binary files /dev/null and b/.yarn/cache/is-core-module-npm-2.13.1-36e17434f9-256559ee8a.zip differ diff --git a/.yarn/cache/is-typed-array-npm-1.1.12-6135c91b1a-4c89c4a3be.zip b/.yarn/cache/is-typed-array-npm-1.1.12-6135c91b1a-4c89c4a3be.zip new file mode 100644 index 00000000000..4a35c2e95fb Binary files /dev/null and b/.yarn/cache/is-typed-array-npm-1.1.12-6135c91b1a-4c89c4a3be.zip differ diff --git a/.yarn/cache/isarray-npm-2.0.5-4ba522212d-bd5bbe4104.zip b/.yarn/cache/isarray-npm-2.0.5-4ba522212d-bd5bbe4104.zip new file mode 100644 index 00000000000..f46224f1cc3 Binary files /dev/null and b/.yarn/cache/isarray-npm-2.0.5-4ba522212d-bd5bbe4104.zip differ diff --git a/.yarn/cache/istanbul-lib-report-npm-3.0.1-b17446ab24-fd17a1b879.zip b/.yarn/cache/istanbul-lib-report-npm-3.0.1-b17446ab24-fd17a1b879.zip new file mode 100644 index 00000000000..b946848afd9 Binary files /dev/null and b/.yarn/cache/istanbul-lib-report-npm-3.0.1-b17446ab24-fd17a1b879.zip differ diff --git a/.yarn/cache/istanbul-reports-npm-3.1.4-5faaa9636c-2132983355.zip b/.yarn/cache/istanbul-reports-npm-3.1.4-5faaa9636c-2132983355.zip deleted file mode 100644 index c9a9a9c9496..00000000000 Binary files a/.yarn/cache/istanbul-reports-npm-3.1.4-5faaa9636c-2132983355.zip and /dev/null differ diff --git a/.yarn/cache/istanbul-reports-npm-3.1.6-66918eb97f-44c4c0582f.zip b/.yarn/cache/istanbul-reports-npm-3.1.6-66918eb97f-44c4c0582f.zip new file mode 100644 index 00000000000..4a337c3397a Binary files /dev/null and b/.yarn/cache/istanbul-reports-npm-3.1.6-66918eb97f-44c4c0582f.zip differ diff --git a/.yarn/cache/jest-diff-npm-27.5.1-818e549196-8be27c1e1e.zip b/.yarn/cache/jest-diff-npm-27.5.1-818e549196-8be27c1e1e.zip deleted file mode 100644 index de55e34a9cf..00000000000 Binary files a/.yarn/cache/jest-diff-npm-27.5.1-818e549196-8be27c1e1e.zip and /dev/null differ diff --git a/.yarn/cache/jest-get-type-npm-27.5.1-980fbf7a43-63064ab701.zip b/.yarn/cache/jest-get-type-npm-27.5.1-980fbf7a43-63064ab701.zip deleted file mode 100644 index 50167f4d8d1..00000000000 Binary files a/.yarn/cache/jest-get-type-npm-27.5.1-980fbf7a43-63064ab701.zip and /dev/null differ diff --git a/.yarn/cache/jest-matcher-utils-npm-27.5.1-0c47b071fb-bb2135fc48.zip b/.yarn/cache/jest-matcher-utils-npm-27.5.1-0c47b071fb-bb2135fc48.zip deleted file mode 100644 index f4bc56be0ff..00000000000 Binary files a/.yarn/cache/jest-matcher-utils-npm-27.5.1-0c47b071fb-bb2135fc48.zip and /dev/null differ diff --git a/.yarn/cache/jquery-npm-3.6.4-c665e9b5ea-8354f7bd0a.zip b/.yarn/cache/jquery-npm-3.6.4-c665e9b5ea-8354f7bd0a.zip deleted file mode 100644 index 898d7a11943..00000000000 Binary files a/.yarn/cache/jquery-npm-3.6.4-c665e9b5ea-8354f7bd0a.zip and /dev/null differ diff --git a/.yarn/cache/jquery-npm-3.7.1-eeeac0f21e-4370b8139d.zip b/.yarn/cache/jquery-npm-3.7.1-eeeac0f21e-4370b8139d.zip new file mode 100644 index 00000000000..dda19f270f1 Binary files /dev/null and b/.yarn/cache/jquery-npm-3.7.1-eeeac0f21e-4370b8139d.zip differ diff --git a/.yarn/cache/js-sdsl-npm-4.1.5-66fcf4f580-695f657ddc.zip b/.yarn/cache/js-sdsl-npm-4.1.5-66fcf4f580-695f657ddc.zip deleted file mode 100644 index c581e91e647..00000000000 Binary files a/.yarn/cache/js-sdsl-npm-4.1.5-66fcf4f580-695f657ddc.zip and /dev/null differ diff --git a/.yarn/cache/lmdb-npm-2.8.5-e5fdd937dd-b1ec76650d.zip b/.yarn/cache/lmdb-npm-2.8.5-e5fdd937dd-b1ec76650d.zip new file mode 100644 index 00000000000..1fe6a6f48d0 Binary files /dev/null and b/.yarn/cache/lmdb-npm-2.8.5-e5fdd937dd-b1ec76650d.zip differ diff --git a/.yarn/cache/luxon-npm-3.3.0-bdbae9bfd5-50cf17a0dc.zip b/.yarn/cache/luxon-npm-3.3.0-bdbae9bfd5-50cf17a0dc.zip deleted file mode 100644 index e70d3dc06d7..00000000000 Binary files a/.yarn/cache/luxon-npm-3.3.0-bdbae9bfd5-50cf17a0dc.zip and /dev/null differ diff --git a/.yarn/cache/luxon-npm-3.4.4-c93f95dde8-36c1f99c47.zip b/.yarn/cache/luxon-npm-3.4.4-c93f95dde8-36c1f99c47.zip new file mode 100644 index 00000000000..ed7709ee9ee Binary files /dev/null and b/.yarn/cache/luxon-npm-3.4.4-c93f95dde8-36c1f99c47.zip differ diff --git a/.yarn/cache/magic-string-npm-0.25.9-0b51c0ea50-9a0e55a15c.zip b/.yarn/cache/magic-string-npm-0.25.9-0b51c0ea50-9a0e55a15c.zip deleted file mode 100644 index caa6d6b49e8..00000000000 Binary files a/.yarn/cache/magic-string-npm-0.25.9-0b51c0ea50-9a0e55a15c.zip and /dev/null differ diff --git a/.yarn/cache/magic-string-npm-0.30.7-0bb5819095-bdf102e36a.zip b/.yarn/cache/magic-string-npm-0.30.7-0bb5819095-bdf102e36a.zip new file mode 100644 index 00000000000..7d9e6ff1d39 Binary files /dev/null and b/.yarn/cache/magic-string-npm-0.30.7-0bb5819095-bdf102e36a.zip differ diff --git a/.yarn/cache/make-dir-npm-4.0.0-ec3cd921cc-bf0731a2dd.zip b/.yarn/cache/make-dir-npm-4.0.0-ec3cd921cc-bf0731a2dd.zip new file mode 100644 index 00000000000..2a141eff65f Binary files /dev/null and b/.yarn/cache/make-dir-npm-4.0.0-ec3cd921cc-bf0731a2dd.zip differ diff --git a/.yarn/cache/moment-npm-2.30.1-1c51a5c631-859236bab1.zip b/.yarn/cache/moment-npm-2.30.1-1c51a5c631-859236bab1.zip new file mode 100644 index 00000000000..7454cc21afd Binary files /dev/null and b/.yarn/cache/moment-npm-2.30.1-1c51a5c631-859236bab1.zip differ diff --git a/.yarn/cache/moment-timezone-npm-0.5.43-1304d8602a-8075c897ed.zip b/.yarn/cache/moment-timezone-npm-0.5.43-1304d8602a-8075c897ed.zip deleted file mode 100644 index 6200ccaec8e..00000000000 Binary files a/.yarn/cache/moment-timezone-npm-0.5.43-1304d8602a-8075c897ed.zip and /dev/null differ diff --git a/.yarn/cache/moment-timezone-npm-0.5.45-2df3ad72a4-a22e9f983f.zip b/.yarn/cache/moment-timezone-npm-0.5.45-2df3ad72a4-a22e9f983f.zip new file mode 100644 index 00000000000..4cd7864ca50 Binary files /dev/null and b/.yarn/cache/moment-timezone-npm-0.5.45-2df3ad72a4-a22e9f983f.zip differ diff --git a/.yarn/cache/msgpackr-extract-npm-3.0.2-93e8773fad-5adb809b96.zip b/.yarn/cache/msgpackr-extract-npm-3.0.2-93e8773fad-5adb809b96.zip new file mode 100644 index 00000000000..b9af6cd2413 Binary files /dev/null and b/.yarn/cache/msgpackr-extract-npm-3.0.2-93e8773fad-5adb809b96.zip differ diff --git a/.yarn/cache/msgpackr-npm-1.10.1-5c5ff5c553-e422d18b01.zip b/.yarn/cache/msgpackr-npm-1.10.1-5c5ff5c553-e422d18b01.zip new file mode 100644 index 00000000000..12aaa36344f Binary files /dev/null and b/.yarn/cache/msgpackr-npm-1.10.1-5c5ff5c553-e422d18b01.zip differ diff --git a/.yarn/cache/msgpackr-npm-1.9.9-75b366d55f-b63182d99f.zip b/.yarn/cache/msgpackr-npm-1.9.9-75b366d55f-b63182d99f.zip new file mode 100644 index 00000000000..ce927778aa8 Binary files /dev/null and b/.yarn/cache/msgpackr-npm-1.9.9-75b366d55f-b63182d99f.zip differ diff --git a/.yarn/cache/muggle-string-npm-0.4.1-fe3c825cc2-85fe1766d1.zip b/.yarn/cache/muggle-string-npm-0.4.1-fe3c825cc2-85fe1766d1.zip new file mode 100644 index 00000000000..4cec1b177d1 Binary files /dev/null and b/.yarn/cache/muggle-string-npm-0.4.1-fe3c825cc2-85fe1766d1.zip differ diff --git a/.yarn/cache/naive-ui-npm-2.34.3-ba2dfb08d8-792d9e6c51.zip b/.yarn/cache/naive-ui-npm-2.34.3-ba2dfb08d8-792d9e6c51.zip deleted file mode 100755 index d025f4e6746..00000000000 Binary files a/.yarn/cache/naive-ui-npm-2.34.3-ba2dfb08d8-792d9e6c51.zip and /dev/null differ diff --git a/.yarn/cache/naive-ui-npm-2.38.1-0edd2e5816-88a8f981de.zip b/.yarn/cache/naive-ui-npm-2.38.1-0edd2e5816-88a8f981de.zip new file mode 100644 index 00000000000..fb6dc789a1e Binary files /dev/null and b/.yarn/cache/naive-ui-npm-2.38.1-0edd2e5816-88a8f981de.zip differ diff --git a/.yarn/cache/nanoid-npm-3.3.3-25d865be84-ada019402a.zip b/.yarn/cache/nanoid-npm-3.3.3-25d865be84-ada019402a.zip deleted file mode 100644 index d28e91f1ff3..00000000000 Binary files a/.yarn/cache/nanoid-npm-3.3.3-25d865be84-ada019402a.zip and /dev/null differ diff --git a/.yarn/cache/nanoid-npm-3.3.6-e6d6ae7e71-7d0eda6570.zip b/.yarn/cache/nanoid-npm-3.3.6-e6d6ae7e71-7d0eda6570.zip deleted file mode 100644 index 8526acad726..00000000000 Binary files a/.yarn/cache/nanoid-npm-3.3.6-e6d6ae7e71-7d0eda6570.zip and /dev/null differ diff --git a/.yarn/cache/nanoid-npm-3.3.7-98824ba130-d36c427e53.zip b/.yarn/cache/nanoid-npm-3.3.7-98824ba130-d36c427e53.zip new file mode 100644 index 00000000000..7b2fd6e1b55 Binary files /dev/null and b/.yarn/cache/nanoid-npm-3.3.7-98824ba130-d36c427e53.zip differ diff --git a/.yarn/cache/node-addon-api-npm-6.1.0-634c545b39-3a539510e6.zip b/.yarn/cache/node-addon-api-npm-6.1.0-634c545b39-3a539510e6.zip new file mode 100644 index 00000000000..012df449c0f Binary files /dev/null and b/.yarn/cache/node-addon-api-npm-6.1.0-634c545b39-3a539510e6.zip differ diff --git a/.yarn/cache/node-gyp-build-optional-packages-npm-5.0.7-40f21a5d68-bcb4537af1.zip b/.yarn/cache/node-gyp-build-optional-packages-npm-5.0.7-40f21a5d68-bcb4537af1.zip new file mode 100644 index 00000000000..d023f1a69dd Binary files /dev/null and b/.yarn/cache/node-gyp-build-optional-packages-npm-5.0.7-40f21a5d68-bcb4537af1.zip differ diff --git a/.yarn/cache/node-gyp-build-optional-packages-npm-5.1.1-ff11e179dd-f3cb197862.zip b/.yarn/cache/node-gyp-build-optional-packages-npm-5.1.1-ff11e179dd-f3cb197862.zip new file mode 100644 index 00000000000..840821996db Binary files /dev/null and b/.yarn/cache/node-gyp-build-optional-packages-npm-5.1.1-ff11e179dd-f3cb197862.zip differ diff --git a/.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-dabfd824d9.zip b/.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-dabfd824d9.zip deleted file mode 100644 index ec58095dc8f..00000000000 Binary files a/.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-dabfd824d9.zip and /dev/null differ diff --git a/.yarn/cache/object-inspect-npm-1.13.1-fd038a2f0a-7d9fa9221d.zip b/.yarn/cache/object-inspect-npm-1.13.1-fd038a2f0a-7d9fa9221d.zip new file mode 100644 index 00000000000..1e1bbfbcfa7 Binary files /dev/null and b/.yarn/cache/object-inspect-npm-1.13.1-fd038a2f0a-7d9fa9221d.zip differ diff --git a/.yarn/cache/object.fromentries-npm-2.0.7-2e38392540-7341ce246e.zip b/.yarn/cache/object.fromentries-npm-2.0.7-2e38392540-7341ce246e.zip new file mode 100644 index 00000000000..a976cc8e0e1 Binary files /dev/null and b/.yarn/cache/object.fromentries-npm-2.0.7-2e38392540-7341ce246e.zip differ diff --git a/.yarn/cache/object.groupby-npm-1.0.1-fc268391fe-d7959d6eaa.zip b/.yarn/cache/object.groupby-npm-1.0.1-fc268391fe-d7959d6eaa.zip new file mode 100644 index 00000000000..c67f462cfbe Binary files /dev/null and b/.yarn/cache/object.groupby-npm-1.0.1-fc268391fe-d7959d6eaa.zip differ diff --git a/.yarn/cache/object.values-npm-1.1.6-ab9b67ccd3-f6fff9fd81.zip b/.yarn/cache/object.values-npm-1.1.6-ab9b67ccd3-f6fff9fd81.zip deleted file mode 100644 index 679cbd793fe..00000000000 Binary files a/.yarn/cache/object.values-npm-1.1.6-ab9b67ccd3-f6fff9fd81.zip and /dev/null differ diff --git a/.yarn/cache/object.values-npm-1.1.7-deae619f88-f3e4ae4f21.zip b/.yarn/cache/object.values-npm-1.1.7-deae619f88-f3e4ae4f21.zip new file mode 100644 index 00000000000..4c12832e028 Binary files /dev/null and b/.yarn/cache/object.values-npm-1.1.7-deae619f88-f3e4ae4f21.zip differ diff --git a/.yarn/cache/optionator-npm-0.9.1-577e397aae-dbc6fa0656.zip b/.yarn/cache/optionator-npm-0.9.1-577e397aae-dbc6fa0656.zip deleted file mode 100644 index 6e6efe345ba..00000000000 Binary files a/.yarn/cache/optionator-npm-0.9.1-577e397aae-dbc6fa0656.zip and /dev/null differ diff --git a/.yarn/cache/optionator-npm-0.9.3-56c3a4bf80-0928199944.zip b/.yarn/cache/optionator-npm-0.9.3-56c3a4bf80-0928199944.zip new file mode 100644 index 00000000000..06266323c5e Binary files /dev/null and b/.yarn/cache/optionator-npm-0.9.3-56c3a4bf80-0928199944.zip differ diff --git a/.yarn/cache/ordered-binary-npm-1.4.1-9ad6b7c6b5-274940b4ef.zip b/.yarn/cache/ordered-binary-npm-1.4.1-9ad6b7c6b5-274940b4ef.zip new file mode 100644 index 00000000000..35ea485c2b3 Binary files /dev/null and b/.yarn/cache/ordered-binary-npm-1.4.1-9ad6b7c6b5-274940b4ef.zip differ diff --git a/.yarn/cache/parcel-npm-2.12.0-96a4bb6cc3-d8e6cb690a.zip b/.yarn/cache/parcel-npm-2.12.0-96a4bb6cc3-d8e6cb690a.zip new file mode 100644 index 00000000000..965ad65ddc1 Binary files /dev/null and b/.yarn/cache/parcel-npm-2.12.0-96a4bb6cc3-d8e6cb690a.zip differ diff --git a/.yarn/cache/parcel-npm-2.8.3-5d8a8e1092-09cd2dc23c.zip b/.yarn/cache/parcel-npm-2.8.3-5d8a8e1092-09cd2dc23c.zip deleted file mode 100644 index c703c90cc34..00000000000 Binary files a/.yarn/cache/parcel-npm-2.8.3-5d8a8e1092-09cd2dc23c.zip and /dev/null differ diff --git a/.yarn/cache/pinia-npm-2.0.35-60f8addaf8-cecb1e1e97.zip b/.yarn/cache/pinia-npm-2.0.35-60f8addaf8-cecb1e1e97.zip deleted file mode 100644 index 38181abf9a1..00000000000 Binary files a/.yarn/cache/pinia-npm-2.0.35-60f8addaf8-cecb1e1e97.zip and /dev/null differ diff --git a/.yarn/cache/pinia-npm-2.1.7-195409c154-1b7882aab2.zip b/.yarn/cache/pinia-npm-2.1.7-195409c154-1b7882aab2.zip new file mode 100644 index 00000000000..352e0a2f9ff Binary files /dev/null and b/.yarn/cache/pinia-npm-2.1.7-195409c154-1b7882aab2.zip differ diff --git a/.yarn/cache/postcss-npm-8.4.12-e941d78a98-248e3d0f9b.zip b/.yarn/cache/postcss-npm-8.4.12-e941d78a98-248e3d0f9b.zip deleted file mode 100644 index 4f940728b96..00000000000 Binary files a/.yarn/cache/postcss-npm-8.4.12-e941d78a98-248e3d0f9b.zip and /dev/null differ diff --git a/.yarn/cache/postcss-npm-8.4.23-d4a02a832d-8bb9d1b2ea.zip b/.yarn/cache/postcss-npm-8.4.23-d4a02a832d-8bb9d1b2ea.zip deleted file mode 100644 index 561478eb099..00000000000 Binary files a/.yarn/cache/postcss-npm-8.4.23-d4a02a832d-8bb9d1b2ea.zip and /dev/null differ diff --git a/.yarn/cache/postcss-npm-8.4.33-6ba8157009-6f98b2af4b.zip b/.yarn/cache/postcss-npm-8.4.33-6ba8157009-6f98b2af4b.zip new file mode 100644 index 00000000000..57638cbd81a Binary files /dev/null and b/.yarn/cache/postcss-npm-8.4.33-6ba8157009-6f98b2af4b.zip differ diff --git a/.yarn/cache/postcss-npm-8.4.35-6bc1848fff-cf3c3124d3.zip b/.yarn/cache/postcss-npm-8.4.35-6bc1848fff-cf3c3124d3.zip new file mode 100644 index 00000000000..888dccea0cd Binary files /dev/null and b/.yarn/cache/postcss-npm-8.4.35-6bc1848fff-cf3c3124d3.zip differ diff --git a/.yarn/cache/postcss-selector-parser-npm-6.0.10-a4d7aaa270-46afaa60e3.zip b/.yarn/cache/postcss-selector-parser-npm-6.0.10-a4d7aaa270-46afaa60e3.zip deleted file mode 100644 index 496c72f70c2..00000000000 Binary files a/.yarn/cache/postcss-selector-parser-npm-6.0.10-a4d7aaa270-46afaa60e3.zip and /dev/null differ diff --git a/.yarn/cache/postcss-selector-parser-npm-6.0.15-0ec4819b4e-57decb9415.zip b/.yarn/cache/postcss-selector-parser-npm-6.0.15-0ec4819b4e-57decb9415.zip new file mode 100644 index 00000000000..c6d454663eb Binary files /dev/null and b/.yarn/cache/postcss-selector-parser-npm-6.0.15-0ec4819b4e-57decb9415.zip differ diff --git a/.yarn/cache/pretty-format-npm-27.5.1-cd7d49696f-cf610cffcb.zip b/.yarn/cache/pretty-format-npm-27.5.1-cd7d49696f-cf610cffcb.zip deleted file mode 100644 index 8d28efe3e1f..00000000000 Binary files a/.yarn/cache/pretty-format-npm-27.5.1-cd7d49696f-cf610cffcb.zip and /dev/null differ diff --git a/.yarn/cache/react-is-npm-17.0.2-091bbb8db6-9d6d111d89.zip b/.yarn/cache/react-is-npm-17.0.2-091bbb8db6-9d6d111d89.zip deleted file mode 100644 index 8b0c3e54609..00000000000 Binary files a/.yarn/cache/react-is-npm-17.0.2-091bbb8db6-9d6d111d89.zip and /dev/null differ diff --git a/.yarn/cache/regenerator-runtime-npm-0.14.0-e060897cf7-1c977ad82a.zip b/.yarn/cache/regenerator-runtime-npm-0.14.0-e060897cf7-1c977ad82a.zip new file mode 100644 index 00000000000..743dca6a4ef Binary files /dev/null and b/.yarn/cache/regenerator-runtime-npm-0.14.0-e060897cf7-1c977ad82a.zip differ diff --git a/.yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-51228bae73.zip b/.yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-51228bae73.zip deleted file mode 100644 index 9e56b1a48bb..00000000000 Binary files a/.yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-51228bae73.zip and /dev/null differ diff --git a/.yarn/cache/regexp.prototype.flags-npm-1.5.1-b8faeee306-869edff002.zip b/.yarn/cache/regexp.prototype.flags-npm-1.5.1-b8faeee306-869edff002.zip new file mode 100644 index 00000000000..d73fb5c3dfb Binary files /dev/null and b/.yarn/cache/regexp.prototype.flags-npm-1.5.1-b8faeee306-869edff002.zip differ diff --git a/.yarn/cache/resolve-npm-1.22.1-3980488690-07af5fc1e8.zip b/.yarn/cache/resolve-npm-1.22.1-3980488690-07af5fc1e8.zip deleted file mode 100644 index d41402c877c..00000000000 Binary files a/.yarn/cache/resolve-npm-1.22.1-3980488690-07af5fc1e8.zip and /dev/null differ diff --git a/.yarn/cache/resolve-npm-1.22.3-f7dee15274-fb834b8134.zip b/.yarn/cache/resolve-npm-1.22.3-f7dee15274-fb834b8134.zip new file mode 100644 index 00000000000..f3daae8bc83 Binary files /dev/null and b/.yarn/cache/resolve-npm-1.22.3-f7dee15274-fb834b8134.zip differ diff --git a/.yarn/cache/resolve-npm-1.22.8-098f379dfe-f8a26958aa.zip b/.yarn/cache/resolve-npm-1.22.8-098f379dfe-f8a26958aa.zip new file mode 100644 index 00000000000..87b2b21978e Binary files /dev/null and b/.yarn/cache/resolve-npm-1.22.8-098f379dfe-f8a26958aa.zip differ diff --git a/.yarn/cache/resolve-patch-46f9469d0d-5656f4d0be.zip b/.yarn/cache/resolve-patch-46f9469d0d-5656f4d0be.zip deleted file mode 100644 index c3066c3608a..00000000000 Binary files a/.yarn/cache/resolve-patch-46f9469d0d-5656f4d0be.zip and /dev/null differ diff --git a/.yarn/cache/resolve-patch-8df1eb26d0-ad59734723.zip b/.yarn/cache/resolve-patch-8df1eb26d0-ad59734723.zip new file mode 100644 index 00000000000..7d4960beb50 Binary files /dev/null and b/.yarn/cache/resolve-patch-8df1eb26d0-ad59734723.zip differ diff --git a/.yarn/cache/resolve-patch-f6b5304cab-5479b7d431.zip b/.yarn/cache/resolve-patch-f6b5304cab-5479b7d431.zip new file mode 100644 index 00000000000..84c63abe59c Binary files /dev/null and b/.yarn/cache/resolve-patch-f6b5304cab-5479b7d431.zip differ diff --git a/.yarn/cache/resolve-pkg-maps-npm-1.0.0-135b70c854-1012afc566.zip b/.yarn/cache/resolve-pkg-maps-npm-1.0.0-135b70c854-1012afc566.zip new file mode 100644 index 00000000000..53ff3fc69e2 Binary files /dev/null and b/.yarn/cache/resolve-pkg-maps-npm-1.0.0-135b70c854-1012afc566.zip differ diff --git a/.yarn/cache/rollup-npm-3.21.6-ae95b73a21-bb6786ee0d.zip b/.yarn/cache/rollup-npm-3.21.6-ae95b73a21-bb6786ee0d.zip deleted file mode 100644 index dcc06fb8786..00000000000 Binary files a/.yarn/cache/rollup-npm-3.21.6-ae95b73a21-bb6786ee0d.zip and /dev/null differ diff --git a/.yarn/cache/rollup-npm-3.29.4-5e5e5f2087-8bb20a39c8.zip b/.yarn/cache/rollup-npm-3.29.4-5e5e5f2087-8bb20a39c8.zip new file mode 100644 index 00000000000..9f6628aa426 Binary files /dev/null and b/.yarn/cache/rollup-npm-3.29.4-5e5e5f2087-8bb20a39c8.zip differ diff --git a/.yarn/cache/safe-array-concat-npm-1.0.1-8a42907bbf-001ecf1d8a.zip b/.yarn/cache/safe-array-concat-npm-1.0.1-8a42907bbf-001ecf1d8a.zip new file mode 100644 index 00000000000..6789308b813 Binary files /dev/null and b/.yarn/cache/safe-array-concat-npm-1.0.1-8a42907bbf-001ecf1d8a.zip differ diff --git a/.yarn/cache/sass-npm-1.62.1-c16d65fd28-1b1b3584b3.zip b/.yarn/cache/sass-npm-1.62.1-c16d65fd28-1b1b3584b3.zip deleted file mode 100644 index 745da7a176c..00000000000 Binary files a/.yarn/cache/sass-npm-1.62.1-c16d65fd28-1b1b3584b3.zip and /dev/null differ diff --git a/.yarn/cache/sass-npm-1.72.0-fb38bb530c-f420079c7d.zip b/.yarn/cache/sass-npm-1.72.0-fb38bb530c-f420079c7d.zip new file mode 100644 index 00000000000..a3aea4e6687 Binary files /dev/null and b/.yarn/cache/sass-npm-1.72.0-fb38bb530c-f420079c7d.zip differ diff --git a/.yarn/cache/seemly-npm-0.3.3-1df3254399-b6445553f8.zip b/.yarn/cache/seemly-npm-0.3.3-1df3254399-b6445553f8.zip deleted file mode 100644 index 5265b570838..00000000000 Binary files a/.yarn/cache/seemly-npm-0.3.3-1df3254399-b6445553f8.zip and /dev/null differ diff --git a/.yarn/cache/seemly-npm-0.3.8-4940336497-98171fd4d9.zip b/.yarn/cache/seemly-npm-0.3.8-4940336497-98171fd4d9.zip new file mode 100644 index 00000000000..03ae0a8f508 Binary files /dev/null and b/.yarn/cache/seemly-npm-0.3.8-4940336497-98171fd4d9.zip differ diff --git a/.yarn/cache/semver-npm-6.3.1-bcba31fdbe-ae47d06de2.zip b/.yarn/cache/semver-npm-6.3.1-bcba31fdbe-ae47d06de2.zip new file mode 100644 index 00000000000..91f42cf845e Binary files /dev/null and b/.yarn/cache/semver-npm-6.3.1-bcba31fdbe-ae47d06de2.zip differ diff --git a/.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip b/.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip deleted file mode 100644 index c6d8940e6f3..00000000000 Binary files a/.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip and /dev/null differ diff --git a/.yarn/cache/semver-npm-7.5.3-275095dbf3-9d58db1652.zip b/.yarn/cache/semver-npm-7.5.3-275095dbf3-9d58db1652.zip new file mode 100644 index 00000000000..79b7d4718ca Binary files /dev/null and b/.yarn/cache/semver-npm-7.5.3-275095dbf3-9d58db1652.zip differ diff --git a/.yarn/cache/semver-npm-7.5.4-c4ad957fcd-12d8ad952f.zip b/.yarn/cache/semver-npm-7.5.4-c4ad957fcd-12d8ad952f.zip new file mode 100644 index 00000000000..f8689471f58 Binary files /dev/null and b/.yarn/cache/semver-npm-7.5.4-c4ad957fcd-12d8ad952f.zip differ diff --git a/.yarn/cache/semver-npm-7.6.0-f4630729f6-7427f05b70.zip b/.yarn/cache/semver-npm-7.6.0-f4630729f6-7427f05b70.zip new file mode 100644 index 00000000000..a5494e10ac9 Binary files /dev/null and b/.yarn/cache/semver-npm-7.6.0-f4630729f6-7427f05b70.zip differ diff --git a/.yarn/cache/set-function-length-npm-1.1.1-d362bf8221-c131d7569c.zip b/.yarn/cache/set-function-length-npm-1.1.1-d362bf8221-c131d7569c.zip new file mode 100644 index 00000000000..024add469c9 Binary files /dev/null and b/.yarn/cache/set-function-length-npm-1.1.1-d362bf8221-c131d7569c.zip differ diff --git a/.yarn/cache/set-function-name-npm-2.0.1-a9f970eea0-4975d17d90.zip b/.yarn/cache/set-function-name-npm-2.0.1-a9f970eea0-4975d17d90.zip new file mode 100644 index 00000000000..f18d53b5996 Binary files /dev/null and b/.yarn/cache/set-function-name-npm-2.0.1-a9f970eea0-4975d17d90.zip differ diff --git a/.yarn/cache/shepherd.js-npm-11.1.1-c87ab2ed73-1d2a0563b6.zip b/.yarn/cache/shepherd.js-npm-11.1.1-c87ab2ed73-1d2a0563b6.zip deleted file mode 100644 index 58028462dc1..00000000000 Binary files a/.yarn/cache/shepherd.js-npm-11.1.1-c87ab2ed73-1d2a0563b6.zip and /dev/null differ diff --git a/.yarn/cache/shepherd.js-npm-11.2.0-94b9af1487-0e71e63e51.zip b/.yarn/cache/shepherd.js-npm-11.2.0-94b9af1487-0e71e63e51.zip new file mode 100644 index 00000000000..6bd0d1e294c Binary files /dev/null and b/.yarn/cache/shepherd.js-npm-11.2.0-94b9af1487-0e71e63e51.zip differ diff --git a/.yarn/cache/sortablejs-npm-1.15.0-f3a393abcc-bb82223a66.zip b/.yarn/cache/sortablejs-npm-1.15.0-f3a393abcc-bb82223a66.zip deleted file mode 100644 index 9028b71d1c6..00000000000 Binary files a/.yarn/cache/sortablejs-npm-1.15.0-f3a393abcc-bb82223a66.zip and /dev/null differ diff --git a/.yarn/cache/sortablejs-npm-1.15.2-73347ae85a-36b20b144f.zip b/.yarn/cache/sortablejs-npm-1.15.2-73347ae85a-36b20b144f.zip new file mode 100644 index 00000000000..b3031257615 Binary files /dev/null and b/.yarn/cache/sortablejs-npm-1.15.2-73347ae85a-36b20b144f.zip differ diff --git a/.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip b/.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip deleted file mode 100644 index 5fc27c8438d..00000000000 Binary files a/.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip and /dev/null differ diff --git a/.yarn/cache/sourcemap-codec-npm-1.4.8-3a1a9e60b1-b57981c056.zip b/.yarn/cache/sourcemap-codec-npm-1.4.8-3a1a9e60b1-b57981c056.zip deleted file mode 100644 index de84f79779c..00000000000 Binary files a/.yarn/cache/sourcemap-codec-npm-1.4.8-3a1a9e60b1-b57981c056.zip and /dev/null differ diff --git a/.yarn/cache/string.prototype.trim-npm-1.2.8-7ed4517ce8-49eb1a862a.zip b/.yarn/cache/string.prototype.trim-npm-1.2.8-7ed4517ce8-49eb1a862a.zip new file mode 100644 index 00000000000..543f676ced7 Binary files /dev/null and b/.yarn/cache/string.prototype.trim-npm-1.2.8-7ed4517ce8-49eb1a862a.zip differ diff --git a/.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-0fdc34645a.zip b/.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-0fdc34645a.zip deleted file mode 100644 index c28cc815b20..00000000000 Binary files a/.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-0fdc34645a.zip and /dev/null differ diff --git a/.yarn/cache/string.prototype.trimend-npm-1.0.7-159b9dcfbc-2375516272.zip b/.yarn/cache/string.prototype.trimend-npm-1.0.7-159b9dcfbc-2375516272.zip new file mode 100644 index 00000000000..93f30c147e5 Binary files /dev/null and b/.yarn/cache/string.prototype.trimend-npm-1.0.7-159b9dcfbc-2375516272.zip differ diff --git a/.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-89080feef4.zip b/.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-89080feef4.zip deleted file mode 100644 index 6203bec399b..00000000000 Binary files a/.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-89080feef4.zip and /dev/null differ diff --git a/.yarn/cache/string.prototype.trimstart-npm-1.0.7-ae2f803b78-13d0c2cb0d.zip b/.yarn/cache/string.prototype.trimstart-npm-1.0.7-ae2f803b78-13d0c2cb0d.zip new file mode 100644 index 00000000000..187509d0528 Binary files /dev/null and b/.yarn/cache/string.prototype.trimstart-npm-1.0.7-ae2f803b78-13d0c2cb0d.zip differ diff --git a/.yarn/cache/terser-npm-5.16.5-b3f4101afe-f2c1a087fa.zip b/.yarn/cache/terser-npm-5.16.5-b3f4101afe-f2c1a087fa.zip deleted file mode 100644 index e7b665654a8..00000000000 Binary files a/.yarn/cache/terser-npm-5.16.5-b3f4101afe-f2c1a087fa.zip and /dev/null differ diff --git a/.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip b/.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip deleted file mode 100644 index 98a7ab1f879..00000000000 Binary files a/.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip and /dev/null differ diff --git a/.yarn/cache/tsconfig-paths-npm-3.15.0-ff68930e0e-59f35407a3.zip b/.yarn/cache/tsconfig-paths-npm-3.15.0-ff68930e0e-59f35407a3.zip new file mode 100644 index 00000000000..abfe8dd47e9 Binary files /dev/null and b/.yarn/cache/tsconfig-paths-npm-3.15.0-ff68930e0e-59f35407a3.zip differ diff --git a/.yarn/cache/typed-array-buffer-npm-1.0.0-95cb610310-3e0281c79b.zip b/.yarn/cache/typed-array-buffer-npm-1.0.0-95cb610310-3e0281c79b.zip new file mode 100644 index 00000000000..7e8dc8f1eda Binary files /dev/null and b/.yarn/cache/typed-array-buffer-npm-1.0.0-95cb610310-3e0281c79b.zip differ diff --git a/.yarn/cache/typed-array-byte-length-npm-1.0.0-94d79975ca-b03db16458.zip b/.yarn/cache/typed-array-byte-length-npm-1.0.0-94d79975ca-b03db16458.zip new file mode 100644 index 00000000000..9cd6f34788c Binary files /dev/null and b/.yarn/cache/typed-array-byte-length-npm-1.0.0-94d79975ca-b03db16458.zip differ diff --git a/.yarn/cache/typed-array-byte-offset-npm-1.0.0-8cbb911cf5-04f6f02d0e.zip b/.yarn/cache/typed-array-byte-offset-npm-1.0.0-8cbb911cf5-04f6f02d0e.zip new file mode 100644 index 00000000000..2318610bbc8 Binary files /dev/null and b/.yarn/cache/typed-array-byte-offset-npm-1.0.0-8cbb911cf5-04f6f02d0e.zip differ diff --git a/.yarn/cache/v8-compile-cache-npm-2.3.0-961375f150-adb0a271ea.zip b/.yarn/cache/v8-compile-cache-npm-2.3.0-961375f150-adb0a271ea.zip deleted file mode 100644 index 0e04423cd8d..00000000000 Binary files a/.yarn/cache/v8-compile-cache-npm-2.3.0-961375f150-adb0a271ea.zip and /dev/null differ diff --git a/.yarn/cache/vanillajs-datepicker-npm-1.3.1-75a9d66ea4-c01ea7ec70.zip b/.yarn/cache/vanillajs-datepicker-npm-1.3.1-75a9d66ea4-c01ea7ec70.zip deleted file mode 100644 index 3926d112dd2..00000000000 Binary files a/.yarn/cache/vanillajs-datepicker-npm-1.3.1-75a9d66ea4-c01ea7ec70.zip and /dev/null differ diff --git a/.yarn/cache/vanillajs-datepicker-npm-1.3.4-bc86e15a9c-830958f8af.zip b/.yarn/cache/vanillajs-datepicker-npm-1.3.4-bc86e15a9c-830958f8af.zip new file mode 100644 index 00000000000..151d4c9230a Binary files /dev/null and b/.yarn/cache/vanillajs-datepicker-npm-1.3.4-bc86e15a9c-830958f8af.zip differ diff --git a/.yarn/cache/vite-npm-4.3.4-4744edd48c-90ce3923ef.zip b/.yarn/cache/vite-npm-4.3.4-4744edd48c-90ce3923ef.zip deleted file mode 100644 index 896a446356a..00000000000 Binary files a/.yarn/cache/vite-npm-4.3.4-4744edd48c-90ce3923ef.zip and /dev/null differ diff --git a/.yarn/cache/vite-npm-4.5.3-5cedc7cb8f-fd3f512ce4.zip b/.yarn/cache/vite-npm-4.5.3-5cedc7cb8f-fd3f512ce4.zip new file mode 100644 index 00000000000..c6bb0e4ef76 Binary files /dev/null and b/.yarn/cache/vite-npm-4.5.3-5cedc7cb8f-fd3f512ce4.zip differ diff --git a/.yarn/cache/volar-service-html-npm-0.0.34-32b6d24136-83b50cd805.zip b/.yarn/cache/volar-service-html-npm-0.0.34-32b6d24136-83b50cd805.zip new file mode 100644 index 00000000000..0f1e9805f75 Binary files /dev/null and b/.yarn/cache/volar-service-html-npm-0.0.34-32b6d24136-83b50cd805.zip differ diff --git a/.yarn/cache/volar-service-pug-npm-0.0.34-6f5429e17c-4691aa1c8e.zip b/.yarn/cache/volar-service-pug-npm-0.0.34-6f5429e17c-4691aa1c8e.zip new file mode 100644 index 00000000000..d53f3521eed Binary files /dev/null and b/.yarn/cache/volar-service-pug-npm-0.0.34-6f5429e17c-4691aa1c8e.zip differ diff --git a/.yarn/cache/vscode-html-languageservice-npm-5.1.2-2ea2618bdd-3a2a5ee5ad.zip b/.yarn/cache/vscode-html-languageservice-npm-5.1.2-2ea2618bdd-3a2a5ee5ad.zip new file mode 100644 index 00000000000..d83607888be Binary files /dev/null and b/.yarn/cache/vscode-html-languageservice-npm-5.1.2-2ea2618bdd-3a2a5ee5ad.zip differ diff --git a/.yarn/cache/vscode-jsonrpc-npm-8.2.0-b7d2e5b553-f302a01e59.zip b/.yarn/cache/vscode-jsonrpc-npm-8.2.0-b7d2e5b553-f302a01e59.zip new file mode 100644 index 00000000000..75e2c086b64 Binary files /dev/null and b/.yarn/cache/vscode-jsonrpc-npm-8.2.0-b7d2e5b553-f302a01e59.zip differ diff --git a/.yarn/cache/vscode-languageserver-protocol-npm-3.17.5-2b07e16989-dfb42d276d.zip b/.yarn/cache/vscode-languageserver-protocol-npm-3.17.5-2b07e16989-dfb42d276d.zip new file mode 100644 index 00000000000..bcb5ae5b4e2 Binary files /dev/null and b/.yarn/cache/vscode-languageserver-protocol-npm-3.17.5-2b07e16989-dfb42d276d.zip differ diff --git a/.yarn/cache/vscode-languageserver-textdocument-npm-1.0.11-6fc94d2b7b-ea7cdc9d4f.zip b/.yarn/cache/vscode-languageserver-textdocument-npm-1.0.11-6fc94d2b7b-ea7cdc9d4f.zip new file mode 100644 index 00000000000..b1edfda12d2 Binary files /dev/null and b/.yarn/cache/vscode-languageserver-textdocument-npm-1.0.11-6fc94d2b7b-ea7cdc9d4f.zip differ diff --git a/.yarn/cache/vscode-languageserver-types-npm-3.17.5-aca3b71a5a-79b420e757.zip b/.yarn/cache/vscode-languageserver-types-npm-3.17.5-aca3b71a5a-79b420e757.zip new file mode 100644 index 00000000000..ec214b2903f Binary files /dev/null and b/.yarn/cache/vscode-languageserver-types-npm-3.17.5-aca3b71a5a-79b420e757.zip differ diff --git a/.yarn/cache/vscode-uri-npm-3.0.8-56f46b9d24-5142491268.zip b/.yarn/cache/vscode-uri-npm-3.0.8-56f46b9d24-5142491268.zip new file mode 100644 index 00000000000..6dadd110c90 Binary files /dev/null and b/.yarn/cache/vscode-uri-npm-3.0.8-56f46b9d24-5142491268.zip differ diff --git a/.yarn/cache/vue-demi-npm-0.13.1-a467bc3a9a-d26b060258.zip b/.yarn/cache/vue-demi-npm-0.13.1-a467bc3a9a-d26b060258.zip deleted file mode 100644 index 570ed5bd38c..00000000000 Binary files a/.yarn/cache/vue-demi-npm-0.13.1-a467bc3a9a-d26b060258.zip and /dev/null differ diff --git a/.yarn/cache/vue-demi-npm-0.14.5-6e9e31189b-ff44b9372b.zip b/.yarn/cache/vue-demi-npm-0.14.5-6e9e31189b-ff44b9372b.zip new file mode 100644 index 00000000000..413aac531f1 Binary files /dev/null and b/.yarn/cache/vue-demi-npm-0.14.5-6e9e31189b-ff44b9372b.zip differ diff --git a/.yarn/cache/vue-eslint-parser-npm-9.0.3-1d52721799-61248eb504.zip b/.yarn/cache/vue-eslint-parser-npm-9.0.3-1d52721799-61248eb504.zip deleted file mode 100644 index 175f3e88467..00000000000 Binary files a/.yarn/cache/vue-eslint-parser-npm-9.0.3-1d52721799-61248eb504.zip and /dev/null differ diff --git a/.yarn/cache/vue-eslint-parser-npm-9.4.2-3e4e696025-67f14c8ea1.zip b/.yarn/cache/vue-eslint-parser-npm-9.4.2-3e4e696025-67f14c8ea1.zip new file mode 100644 index 00000000000..9ec85e189ea Binary files /dev/null and b/.yarn/cache/vue-eslint-parser-npm-9.4.2-3e4e696025-67f14c8ea1.zip differ diff --git a/.yarn/cache/vue-npm-3.2.47-487db916e1-3b586f61fd.zip b/.yarn/cache/vue-npm-3.2.47-487db916e1-3b586f61fd.zip deleted file mode 100644 index 10ecd8d0713..00000000000 Binary files a/.yarn/cache/vue-npm-3.2.47-487db916e1-3b586f61fd.zip and /dev/null differ diff --git a/.yarn/cache/vue-npm-3.4.21-02110aa6d9-3c477982a0.zip b/.yarn/cache/vue-npm-3.4.21-02110aa6d9-3c477982a0.zip new file mode 100644 index 00000000000..c48b4e5dfe6 Binary files /dev/null and b/.yarn/cache/vue-npm-3.4.21-02110aa6d9-3c477982a0.zip differ diff --git a/.yarn/cache/vue-router-npm-4.1.6-ccab7109e1-c7f0156ac0.zip b/.yarn/cache/vue-router-npm-4.1.6-ccab7109e1-c7f0156ac0.zip deleted file mode 100644 index 2c00e0a7cef..00000000000 Binary files a/.yarn/cache/vue-router-npm-4.1.6-ccab7109e1-c7f0156ac0.zip and /dev/null differ diff --git a/.yarn/cache/vue-router-npm-4.3.0-b765d40138-0059261d39.zip b/.yarn/cache/vue-router-npm-4.3.0-b765d40138-0059261d39.zip new file mode 100644 index 00000000000..6b939536248 Binary files /dev/null and b/.yarn/cache/vue-router-npm-4.3.0-b765d40138-0059261d39.zip differ diff --git a/.yarn/cache/vueuc-npm-0.4.47-ad081ddd15-b82b77a882.zip b/.yarn/cache/vueuc-npm-0.4.47-ad081ddd15-b82b77a882.zip deleted file mode 100644 index 0a267b628a7..00000000000 Binary files a/.yarn/cache/vueuc-npm-0.4.47-ad081ddd15-b82b77a882.zip and /dev/null differ diff --git a/.yarn/cache/vueuc-npm-0.4.58-be5584770c-fb0b9a69be.zip b/.yarn/cache/vueuc-npm-0.4.58-be5584770c-fb0b9a69be.zip new file mode 100644 index 00000000000..f62e5e32e82 Binary files /dev/null and b/.yarn/cache/vueuc-npm-0.4.58-be5584770c-fb0b9a69be.zip differ diff --git a/.yarn/cache/which-typed-array-npm-1.1.13-92c18b4878-3828a0d5d7.zip b/.yarn/cache/which-typed-array-npm-1.1.13-92c18b4878-3828a0d5d7.zip new file mode 100644 index 00000000000..0d9d2479da7 Binary files /dev/null and b/.yarn/cache/which-typed-array-npm-1.1.13-92c18b4878-3828a0d5d7.zip differ diff --git a/.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-fe0178ca44.zip b/.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-fe0178ca44.zip deleted file mode 100644 index e7e7d548deb..00000000000 Binary files a/.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-fe0178ca44.zip and /dev/null differ diff --git a/.yarn/cache/word-wrap-npm-1.2.3-7fb15ab002-30b48f91fc.zip b/.yarn/cache/word-wrap-npm-1.2.3-7fb15ab002-30b48f91fc.zip deleted file mode 100644 index 518977eb886..00000000000 Binary files a/.yarn/cache/word-wrap-npm-1.2.3-7fb15ab002-30b48f91fc.zip and /dev/null differ diff --git a/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip b/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip deleted file mode 100644 index d11c27d5104..00000000000 Binary files a/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip and /dev/null differ diff --git a/.yarn/cache/yargs-npm-17.7.2-80b62638e1-73b572e863.zip b/.yarn/cache/yargs-npm-17.7.2-80b62638e1-73b572e863.zip new file mode 100644 index 00000000000..54c49dc9c62 Binary files /dev/null and b/.yarn/cache/yargs-npm-17.7.2-80b62638e1-73b572e863.zip differ diff --git a/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip b/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip deleted file mode 100644 index f230038cfc2..00000000000 Binary files a/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip and /dev/null differ diff --git a/.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-ed2d96a616.zip b/.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-ed2d96a616.zip new file mode 100644 index 00000000000..d68ba748e74 Binary files /dev/null and b/.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-ed2d96a616.zip differ diff --git a/LICENSE b/LICENSE index aaed0ef57dc..dc6e0c56635 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2008-2022, The IETF Trust +Copyright (c) 2008-2024, The IETF Trust All rights reserved. Redistribution and use in source and binary forms, with or without @@ -26,4 +26,4 @@ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 51d9271160f..baffc311e7e 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ [![Release](https://img.shields.io/github/release/ietf-tools/datatracker.svg?style=flat&maxAge=300)](https://github.com/ietf-tools/datatracker/releases) [![License](https://img.shields.io/github/license/ietf-tools/datatracker)](https://github.com/ietf-tools/datatracker/blob/main/LICENSE) [![Code Coverage](https://codecov.io/gh/ietf-tools/datatracker/branch/feat/bs5/graph/badge.svg?token=V4DXB0Q28C)](https://codecov.io/gh/ietf-tools/datatracker) -[![Python Version](https://img.shields.io/badge/python-3.9-blue?logo=python&logoColor=white)](#prerequisites) -[![Django Version](https://img.shields.io/badge/django-2.x-51be95?logo=django&logoColor=white)](#prerequisites) +[![Python Version](https://img.shields.io/badge/python-3.12-blue?logo=python&logoColor=white)](#prerequisites) +[![Django Version](https://img.shields.io/badge/django-4.x-51be95?logo=django&logoColor=white)](#prerequisites) [![Node Version](https://img.shields.io/badge/node.js-16.x-green?logo=node.js&logoColor=white)](#prerequisites) -[![MariaDB Version](https://img.shields.io/badge/postgres-14-blue?logo=postgresql&logoColor=white)](#prerequisites) +[![MariaDB Version](https://img.shields.io/badge/postgres-17-blue?logo=postgresql&logoColor=white)](#prerequisites) ##### The day-to-day front-end to the IETF database for people who work on IETF standards. @@ -18,6 +18,7 @@ - [Changelog](https://github.com/ietf-tools/datatracker/releases) - [Contributing](https://github.com/ietf-tools/.github/blob/main/CONTRIBUTING.md) - [Getting Started](#getting-started) - *[ tl;dr ](#the-tldr-to-get-going)* + - [Creating a Fork](#creating-a-fork) - [Git Cloning Tips](#git-cloning-tips) - [Docker Dev Environment](docker/README.md) - [Database & Assets](#database--assets) @@ -43,14 +44,24 @@ This project is following the standard **Git Feature Workflow** development model. Learn about all the various steps of the development workflow, from creating a fork to submitting a pull request, in the [Contributing](https://github.com/ietf-tools/.github/blob/main/CONTRIBUTING.md) guide. +> [!TIP] > Make sure to read the [Styleguides](https://github.com/ietf-tools/.github/blob/main/CONTRIBUTING.md#styleguides) section to ensure a cohesive code format across the project. You can submit bug reports, enhancement and new feature requests in the [discussions](https://github.com/ietf-tools/datatracker/discussions) area. Accepted tickets will be converted to issues. +#### Creating a Fork + +Click the Fork button in the top-right corner of the repository to create a personal copy that you can work on. + +> [!NOTE] +> Some GitHub Actions might be enabled by default in your fork. You should disable them by going to **Settings** > **Actions** > **General** and selecting **Disable actions** (then Save). + #### Git Cloning Tips As outlined in the [Contributing](https://github.com/ietf-tools/.github/blob/main/CONTRIBUTING.md) guide, you will first want to create a fork of the datatracker project in your personal GitHub account before cloning it. +Windows developers: [Start with WSL2 from the beginning](https://github.com/ietf-tools/.github/blob/main/docs/windows-dev.md). + Because of the extensive history of this project, cloning the datatracker project locally can take a long time / disk space. You can speed up the cloning process by limiting the history depth, for example *(replace `USERNAME` with your GitHub username)*: - To fetch only up to the 10 latest commits: @@ -72,9 +83,9 @@ Many developers are using [VS Code](https://code.visualstudio.com/) and taking a If VS Code is not available to you, in your clone, type `cd docker; ./run` -Once the containers are started, run the tests to make sure your checkout is a good place to start from (all tests should pass - if any fail, ask for help at tools-develop@). Inside the app container's shell type: +Once the containers are started, run the tests to make sure your checkout is a good place to start from (all tests should pass - if any fail, ask for help at tools-help@). Inside the app container's shell type: ```sh -ietf/manage.py test --settings=settings_postgrestest +ietf/manage.py test --settings=settings_test ``` Note that we recently moved the datatracker onto PostgreSQL - you may still find older documentation that suggests testing with settings_sqlitetest. That will no longer work. @@ -95,7 +106,25 @@ Read the [Docker Dev Environment](docker/README.md) guide to get started. Nightly database dumps of the datatracker are available as Docker images: `ghcr.io/ietf-tools/datatracker-db:latest` -> Note that to update the database in your dev environment to the latest version, you should run the `docker/cleandb` script. +> [!TIP] +> In order to update the database in your dev environment to the latest version, you should run the `docker/cleandb` script. + +### Blob storage for dev/test + +The dev and test environments use [minio](https://github.com/minio/minio) to provide local blob storage. See the settings files for how the app container communicates with the blobstore container. If you need to work with minio directly from outside the containers (to interact with its api or console), use `docker compose` from the top level directory of your clone to expose it at an ephemeral port. + +``` +$ docker compose port blobstore 9001 +0.0.0.0: + +$ curl -I http://localhost: +HTTP/1.1 200 OK +... +``` + + +The minio container exposes the minio api at port 9000 and the minio console at port 9001 + ### Frontend Development @@ -113,7 +142,7 @@ Pages will gradually be updated to Vue 3 components. These components are locate Each Vue 3 app has its own sub-directory. For example, the agenda app is located under `/client/agenda`. -The datatracker makes use of the Django-Vite plugin to point to either the Vite.js server or the precompiled production files. The `DJANGO_VITE_DEV_MODE` flag, found in the `ietf/settings_local.py` file determines whether the Vite.js server is used or not. +The datatracker makes use of the Django-Vite plugin to point to either the Vite.js server or the precompiled production files. The `DJANGO_VITE["default"]["dev_mode"]` flag, found in the `ietf/settings_local.py` file determines whether the Vite.js server is used or not. In development mode, you must start the Vite.js development server, in addition to the usual Datatracker server: @@ -133,10 +162,10 @@ This will create packages under `ietf/static/dist-neue`, which are then served b #### Parcel *(Legacy/jQuery)* -The Datatracker includes these packages from the various Javascript and CSS files in `ietf/static/js` and `ietf/static/css`, respectively. +The Datatracker includes these packages from the various Javascript and CSS files in `ietf/static/js` and `ietf/static/css` respectively, bundled using Parcel. Static images are likewise in `ietf/static/images`. -Whenever changes are made to the files under `ietf/static`, you must re-run `parcel` to package them: +Whenever changes are made to the files under `ietf/static`, you must re-run the build command to package them: ``` shell yarn legacy:build @@ -219,9 +248,10 @@ before activating a new release. From a datatracker container, run the command: ```sh -./ietf/manage.py test --settings=settings_postgrestest +./ietf/manage.py test --settings=settings_test ``` +> [!TIP] > You can limit the run to specific tests using the `--pattern` argument. ### Frontend Tests @@ -231,11 +261,13 @@ Frontend tests are done via Playwright. There're 2 different type of tests: - Tests that test Vue pages / components and run natively without any external dependency. - Tests that require a running datatracker instance to test against (usually legacy views). +> [!IMPORTANT] > Make sure you have Node.js 16.x or later installed on your machine. #### Run Vue Tests -> :warning: All commands below **MUST** be run from the `./playwright` directory, unless noted otherwise. +> [!WARNING] +> All commands below **MUST** be run from the `./playwright` directory, unless noted otherwise. 1. Run **once** to install dependencies on your system: ```sh @@ -268,7 +300,8 @@ Frontend tests are done via Playwright. There're 2 different type of tests: First, you need to start a datatracker instance (dev or prod), ideally from a docker container, exposing the 8000 port. -> :warning: All commands below **MUST** be run from the `./playwright` directory. +> [!WARNING] +> All commands below **MUST** be run from the `./playwright` directory. 1. Run **once** to install dependencies on your system: ```sh @@ -281,6 +314,7 @@ npm run install-deps npm run test:legacy ``` + ### Diff Tool To compare 2 different datatracker instances and look for diff, read the [diff tool instructions](dev/diff). diff --git a/bin/add-old-drafts-from-archive.py b/bin/add-old-drafts-from-archive.py deleted file mode 100755 index 239ba7837cc..00000000000 --- a/bin/add-old-drafts-from-archive.py +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env python -# Copyright The IETF Trust 2017-2019, All Rights Reserved - -import datetime -import os -import sys -from pathlib import Path -from contextlib import closing - -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -import django -django.setup() - -from django.conf import settings -from django.core.validators import validate_email, ValidationError -from ietf.utils.draft import PlaintextDraft -from ietf.submit.utils import update_authors -from ietf.utils.timezone import date_today - -import debug # pyflakes:ignore - -from ietf.doc.models import Document, NewRevisionDocEvent, DocEvent, State -from ietf.person.models import Person - -system = Person.objects.get(name="(System)") -expired = State.objects.get(type='draft',slug='expired') - -names = set() -print 'collecting draft names ...' -versions = 0 -for p in Path(settings.INTERNET_DRAFT_PATH).glob('draft*.txt'): - n = str(p).split('/')[-1].split('-') - if n[-1][:2].isdigit(): - name = '-'.join(n[:-1]) - if '--' in name or '.txt' in name or '[' in name or '=' in name or '&' in name: - continue - if name.startswith('draft-draft-'): - continue - if name == 'draft-ietf-trade-iotp-v1_0-dsig': - continue - if len(n[-1]) != 6: - continue - if name.startswith('draft-mlee-'): - continue - names.add('-'.join(n[:-1])) - -count=0 -print 'iterating through names ...' -for name in sorted(names): - if not Document.objects.filter(name=name).exists(): - paths = list(Path(settings.INTERNET_DRAFT_PATH).glob('%s-??.txt'%name)) - paths.sort() - doc = None - for p in paths: - n = str(p).split('/')[-1].split('-') - rev = n[-1][:2] - with open(str(p)) as txt_file: - raw = txt_file.read() - try: - text = raw.decode('utf8') - except UnicodeDecodeError: - text = raw.decode('latin1') - try: - draft = PlaintextDraft(text, txt_file.name, name_from_source=True) - except Exception as e: - print name, rev, "Can't parse", p,":",e - continue - if draft.errors and draft.errors.keys()!=['draftname',]: - print "Errors - could not process", name, rev, datetime.datetime.fromtimestamp(p.stat().st_mtime, datetime.timezone.utc), draft.errors, draft.get_title().encode('utf8') - else: - time = datetime.datetime.fromtimestamp(p.stat().st_mtime, datetime.timezone.utc) - if not doc: - doc = Document.objects.create(name=name, - time=time, - type_id='draft', - title=draft.get_title(), - abstract=draft.get_abstract(), - rev = rev, - pages=draft.get_pagecount(), - words=draft.get_wordcount(), - expires=time+datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), - ) - DocAlias.objects.create(name=doc.name).docs.add(doc) - doc.states.add(expired) - # update authors - authors = [] - for author in draft.get_author_list(): - full_name, first_name, middle_initial, last_name, name_suffix, email, country, company = author - - author_name = full_name.replace("\n", "").replace("\r", "").replace("<", "").replace(">", "").strip() - - if email: - try: - validate_email(email) - except ValidationError: - email = "" - - def turn_into_unicode(s): - if s is None: - return u"" - - if isinstance(s, unicode): - return s - else: - try: - return s.decode("utf-8") - except UnicodeDecodeError: - try: - return s.decode("latin-1") - except UnicodeDecodeError: - return "" - - author_name = turn_into_unicode(author_name) - email = turn_into_unicode(email) - company = turn_into_unicode(company) - - authors.append({ - "name": author_name, - "email": email, - "affiliation": company, - "country": country - }) - dummysubmission=type('', (), {})() #https://stackoverflow.com/questions/19476816/creating-an-empty-object-in-python - dummysubmission.authors = authors - update_authors(doc,dummysubmission) - - # add a docevent with words explaining where this came from - events = [] - e = NewRevisionDocEvent.objects.create( - type="new_revision", - doc=doc, - rev=rev, - by=system, - desc="New version available: %s-%s.txt" % (doc.name, doc.rev), - time=time, - ) - events.append(e) - e = DocEvent.objects.create( - type="comment", - doc = doc, - rev = rev, - by = system, - desc = "Revision added from id-archive on %s by %s"%(date_today(),sys.argv[0]), - time=time, - ) - events.append(e) - doc.time = time - doc.rev = rev - doc.save_with_history(events) - print "Added",name, rev diff --git a/bin/check-copyright b/bin/check-copyright deleted file mode 100755 index 13cbcd85828..00000000000 --- a/bin/check-copyright +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/env python3.7 -# -*- mode: python; coding: utf-8 -*- -# Copyright The IETF Trust 2019, All Rights Reserved -""" -NAME - $program - Check for current copyright notice in given files - -SYNOPSIS - $program [OPTIONS] ARGS - -DESCRIPTION - Given a list of files or filename wildcard patterns, check all for - an IETF Trust copyright notice with the current year. Optionally - generate a diff on standard out which can be used by 'patch'. - - An invocation similar to the following can be particularly useful with - a set of changed version-controlled files, as it will fix up the - Copyright statements of any python files with pending changes: - - $ check-copyright -p $(svn st | cut -c 9- | grep '\.py$' ) | patch -p0 - - -%(options)s - -AUTHOR - Written by Henrik Levkowetz, - -COPYRIGHT - Copyright 2019 the IETF Trust - - This program is free software; you can redistribute it and/or modify - it under the terms of the Simplified BSD license as published by the - Open Source Initiative at http://opensource.org/licenses/BSD-2-Clause. - -""" - - -import datetime -import os -import sys -import time - -path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -if not path in sys.path: - sys.path.insert(0, path) - -import getopt -import re -import pytz -import tzparse -import debug - -version = "1.0.0" -program = os.path.basename(sys.argv[0]) -progdir = os.path.dirname(sys.argv[0]) - -debug.debug = True - -# ---------------------------------------------------------------------- -# Parse options - -options = "" -for line in re.findall("\n +(if|elif) +opt in \[(.+)\]:\s+#(.+)\n", open(sys.argv[0]).read()): - if not options: - options += "OPTIONS\n" - options += " %-16s %s\n" % (line[1].replace('"', ''), line[2]) -options = options.strip() - -# with ' < 1:' on the next line, this is a no-op: -if len(sys.argv) < 1: - print(__doc__ % locals()) - sys.exit(1) - -try: - opts, files = getopt.gnu_getopt(sys.argv[1:], "hC:pvV", ["help", "copyright=", "patch", "version", "verbose",]) -except Exception as e: - print( "%s: %s" % (program, e)) - sys.exit(1) - -# ---------------------------------------------------------------------- -# Handle options - -# set default values, if any -opt_verbose = 0 -opt_patch = False -opt_copyright = "Copyright The IETF Trust {years}, All Rights Reserved" - -# handle individual options -for opt, value in opts: - if opt in ["-h", "--help"]: # Output this help, then exit - print( __doc__ % locals() ) - sys.exit(1) - elif opt in ["-p", "--patch"]: # Generate patch output rather than error messages - opt_patch = True - elif opt in ["-C", "--copyright"]: # Copyright line pattern using {years} for years - opt_copyright = value - elif opt in ["-V", "--version"]: # Output version information, then exit - print( program, version ) - sys.exit(0) - elif opt in ["-v", "--verbose"]: # Be more verbose - opt_verbose += 1 - -# ---------------------------------------------------------------------- -def say(s): - sys.stderr.write("%s\n" % (s)) - -# ---------------------------------------------------------------------- -def note(s): - if opt_verbose: - sys.stderr.write("%s\n" % (s)) - -# ---------------------------------------------------------------------- -def die(s, error=1): - sys.stderr.write("\n%s: Error: %s\n\n" % (program, s)) - sys.exit(error) - -# ---------------------------------------------------------------------- - -def pipe(cmd, inp=None): - import shlex - from subprocess import Popen, PIPE - args = shlex.split(cmd) - bufsize = 4096 - stdin = PIPE if inp else None - pipe = Popen(args, stdin=stdin, stdout=PIPE, stderr=PIPE, bufsize=bufsize, encoding='utf-8', universal_newlines=True) - out, err = pipe.communicate(inp) - code = pipe.returncode - if code != 0: - raise OSError(err) - return out - -# ---------------------------------------------------------------------- -def split_loginfo(line): - try: - parts = line.split() - rev = parts[0][1:] - who = parts[2] - date = parts[4] - time = parts[5] - tz = parts[6] - when = tzparse.tzparse(" ".join(parts[4:7]), "%Y-%m-%d %H:%M:%S %Z") - when = when.astimezone(pytz.utc) - except ValueError as e: - sys.stderr.write("Bad log line format: %s\n %s\n" % (line, e)) - - return rev, who, when - -# ---------------------------------------------------------------------- -def get_first_commit(path): - note("Getting first commit for '%s'" % path) - cmd = 'svn log %s' % path - if opt_verbose > 1: - note("Running '%s' ..." % cmd) - try: - commit_log = pipe(cmd) - commit_log = commit_log.splitlines() - commit_log.reverse() - for line in commit_log: - if re.search(loginfo_format, line): - rev, who, when = split_loginfo(line) - break - else: - pass - except OSError: - rev, who, when = None, None, datetime.datetime.now(datetime.timezone.utc) - return { path: { 'rev': rev, 'who': who, 'date': when.strftime('%Y-%m-%d %H:%M:%S'), }, } - - -# ---------------------------------------------------------------------- -# The program itself - -import os -import json - -cwd = os.getcwd() - -# Get current initinfo from cache and svn -cachefn = os.path.join(os.environ.get('HOME', '.'), '.initinfo') - -if os.path.exists(cachefn): - note("Reading initinfo cache file %s" % cachefn) - with open(cachefn, "r") as file: - cache = json.load(file) -else: - sys.stderr.write("No initinfo cache file found -- will have to extract all information from SVN.\n"+ - "This may take some time.\n\n") - cache = {} -initinfo = cache - -merged_revs = {} -write_cache = False -loginfo_format = r'^r[0-9]+ \| [^@]+@[^@]+ \| \d\d\d\d-\d\d-\d\d ' - -year = time.strftime('%Y') -copyright_re = "(?i)"+opt_copyright.format(years=r"(\d+-)?\d+") -for path in files: - try: - if not os.path.exists(path): - note("File does not exist: %s" % path) - continue - note("Checking path %s" % path) - if not path in initinfo: - initinfo.update(get_first_commit(path)) - write_cache = True - date = initinfo[path]['date'] - init = date[:4] - - copyright_year_re = "(?i)"+opt_copyright.format(years=r"({init}-)?{year}".format(init=init, year=year)) - with open(path) as file: - try: - chunk = file.read(4000) - except UnicodeDecodeError as e: - sys.stderr.write(f'Error when reading {file.name}: {e}\n') - raise - if os.path.basename(path) == '__init__.py' and len(chunk)==0: - continue - if not re.search(copyright_year_re, chunk): - if year == init: - copyright = opt_copyright.format(years=year) - else: - copyright = opt_copyright.format(years=f"{init}-{year}") - if opt_patch: - print(f"--- {file.name}\t(original)") - print(f"+++ {file.name}\t(modified)") - if not re.search(copyright_re, chunk): - # Simple case, just insert copyright at the top - print( "@@ -1,3 +1,4 @@") - print(f"+# {copyright}") - for i, line in list(enumerate(chunk.splitlines()))[:3]: - print(f" {line}") - else: - # Find old copyright, then emit preceding lines, - # change, and following lines. - pos = None - for i, line in enumerate(chunk.splitlines(), start=1): - if re.search(copyright_re, line): - pos = i - break - if not pos: - raise RuntimeError("Unexpected state: Expected a copyright line, but found none") - print(f"@@ -1,{pos+3} +1,{pos+3} @@") - for i, line in list(enumerate(chunk.splitlines(), start=1))[:pos+3]: - if i == pos: - print(f"-{line}") - print(f"+# {copyright}") - else: - print(f" {line}") - else: - sys.stderr.write(f"{path}(1): Error: Missing or bad copyright. Expected: {copyright}") - except Exception: - if write_cache: - cache = initinfo - with open(cachefn, "w") as file: - json.dump(cache, file, indent=2, sort_keys=True) - raise - -if write_cache: - cache = initinfo - with open(cachefn, "w") as file: - json.dump(cache, file, indent=2, sort_keys=True) - diff --git a/bin/count.c b/bin/count.c deleted file mode 100644 index 786f15eb978..00000000000 --- a/bin/count.c +++ /dev/null @@ -1,26 +0,0 @@ -#include - -int main( void ) -{ - int c; - int count = 0; - - //turn off buffering - setvbuf(stdin, NULL, _IONBF, 0); - setvbuf(stdout, NULL, _IONBF, 0); - setvbuf(stderr, NULL, _IONBF, 0); - - c = fgetc(stdin); - while(c != EOF) - { - if (c=='.' || c=='E' || c=='F' || c=='s') count++; else count=0; - fputc(c, stdout); - fflush(stdout); - if (count && count % 76 == 0) { - fprintf(stderr, "%4d\n", count); - fflush(stderr); - } - c = fgetc(stdin); - } - return 0; -} diff --git a/bin/daily b/bin/daily deleted file mode 100755 index 2835a93cc15..00000000000 --- a/bin/daily +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -# Nightly datatracker jobs. -# -# This script is expected to be triggered by cron from -# /etc/cron.d/datatracker -export LANG=en_US.UTF-8 -export PYTHONIOENCODING=utf-8 - -# Make sure we stop if something goes wrong: -program=${0##*/} -trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; exit 1' ERR - -# Datatracker directory -DTDIR=/a/www/ietf-datatracker/web -cd $DTDIR/ - -logger -p user.info -t cron "Running $DTDIR/bin/daily" - -# Run the hourly jobs first -$DTDIR/bin/hourly - -# Set up the virtual environment -source $DTDIR/env/bin/activate - - -# Update our information about the current version of some commands we use -$DTDIR/ietf/manage.py update_external_command_info - -# Get IANA-registered yang models -#YANG_IANA_DIR=$(python -c 'import ietf.settings; print ietf.settings.SUBMIT_YANG_IANA_MODEL_DIR') -# Hardcode the rsync target to avoid any unwanted deletes: -# rsync -avzq --delete rsync.ietf.org::iana/yang-parameters/ /a/www/ietf-ftp/yang/ianamod/ -rsync -avzq --delete /a/www/ietf-ftp/iana/yang-parameters/ /a/www/ietf-ftp/yang/ianamod/ - -# Get Yang models from Yangcatalog. -rsync -avzq rsync://yangcatalog.org:10873/yangdeps /a/www/ietf-ftp/yang/catalogmod/ - -# Populate the yang repositories -$DTDIR/ietf/manage.py populate_yang_model_dirs -v0 - -# Re-run yang checks on active documents -$DTDIR/ietf/manage.py run_yang_model_checks -v0 - -# Expire Internet-Drafts -# Enable when removed from /a/www/ietf-datatracker/scripts/Cron-runner: -$DTDIR/ietf/bin/expire-ids - -# Send nomcom reminders about nomination acceptance and questionnaires -$DTDIR/ietf/manage.py send_reminders - -# Expire last calls -# Enable when removed from /a/www/ietf-datatracker/scripts/Cron-runner: -$DTDIR/ietf/bin/expire-last-calls - -# Run an extended version of the rfc editor update, to catch changes -# with backdated timestamps -# Enable when removed from /a/www/ietf-datatracker/scripts/Cron-runner: -$DTDIR/ietf/bin/rfc-editor-index-updates -d 1969-01-01 - -# Fetch meeting attendance data from ietf.org/registration/attendees -$DTDIR/ietf/manage.py fetch_meeting_attendance --latest 2 - -# Send reminders originating from the review app -$DTDIR/ietf/bin/send-review-reminders - -# Purge older PersonApiKeyEvents -$DTDIR/ietf/manage.py purge_old_personal_api_key_events 14 diff --git a/bin/drop-new-tables b/bin/drop-new-tables deleted file mode 100755 index ec1594ae261..00000000000 --- a/bin/drop-new-tables +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# Drop tables which don't exist in the database dump. - -[ -n "$1" ] || { echo -e "\nUsage: $0 DUMPFILE\n\nError: No database dump file given"; exit 1; } - -zcat $1 | head | grep "Database: ietf_utf8" || { echo "Is this a database dump? Expected to see 'Database: ietf_utf8' "; exit 1; } - -echo -e "\nSQL commands:\n" - -diff <(zcat $1 | grep '^DROP TABLE IF EXISTS' | tr -d '`;' | field 5) <(ietf/manage.py dbshell <<< 'show tables;' | tail -n +2) | grep '^>' | awk '{print "drop table if exists", $2, ";";}' | tee /dev/stderr | ietf/manage.py dbshell - -echo -e "\nDone" diff --git a/bin/dump-to-names-json b/bin/dump-to-names-json deleted file mode 100644 index 9c7dfac07dd..00000000000 --- a/bin/dump-to-names-json +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# This script provides a limited selected dump of database content with the -# purpose of generating a test fixture that provides the test data needed -# by the test suite. -# -# The generated data fixture is sorted and normalized in order to produce -# minimal commit diffs which reflect only actual changes in the fixture data, -# without apparent changes resulting only from ordering changes. - -set -x -ietf/manage.py dumpdata --indent 1 doc.State doc.BallotType doc.StateType \ - mailtrigger.MailTrigger mailtrigger.Recipient name utils.VersionInfo \ - group.GroupFeatures stats.CountryAlias dbtemplate.DBTemplate \ - | jq --sort-keys "sort_by(.model, .pk)" \ - | jq '[.[] | select(.model!="dbtemplate.dbtemplate" or .pk==354)]' > ietf/name/fixtures/names.json diff --git a/bin/every15m b/bin/every15m deleted file mode 100755 index c0b0752f6a2..00000000000 --- a/bin/every15m +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# datatracker jobs to run every 15 minutes -# -# This script is expected to be triggered by cron from -# /etc/cron.d/datatracker - -export LANG=en_US.UTF-8 -export PYTHONIOENCODING=utf-8 - -DTDIR=/a/www/ietf-datatracker/web -cd $DTDIR/ - -# Set up the virtual environment -source $DTDIR/env/bin/activate - -logger -p user.info -t cron "Running $DTDIR/bin/every15m" - -# Send mail scheduled to go out at certain times -$DTDIR/ietf/bin/send-scheduled-mail all - -# Reparse the last _year_ of RFC index entries -# (which is the default if -d is not provided) -# until https://github.com/ietf-tools/datatracker/issues/3734 -# is addressed. -# This takes about 20s on production as of 2022-08-11 -$DTDIR/ietf/bin/rfc-editor-index-updates - diff --git a/bin/hourly b/bin/hourly deleted file mode 100755 index 77310302ce8..00000000000 --- a/bin/hourly +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash - -# Hourly datatracker jobs -# -# This script is expected to be triggered by cron from -# /etc/cron.d/datatracker -export LANG=en_US.UTF-8 -export PYTHONIOENCODING=utf-8 - -# Make sure we stop if something goes wrong: -program=${0##*/} -trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; exit 1' ERR - -DTDIR=/a/www/ietf-datatracker/web -cd $DTDIR/ - -# Set up the virtual environment -source $DTDIR/env/bin/activate - -logger -p user.info -t cron "Running $DTDIR/bin/hourly" - -# *** Enable when removed from /a/www/ietf-datatracker/scripts/Cron-runner: *** - -# # Update community lists. Remove once the community rewrite (will be around 6.20.0 ) -# $DTDIR/ietf/manage.py update_community_lists -# -# # Polling backup for iana and rfc-editory post APIs -$DTDIR/ietf/bin/iana-changes-updates -$DTDIR/ietf/bin/iana-protocols-updates -# $DTDIR/ietf/bin/rfc-editor-index-updates -# $DTDIR/ietf/bin/rfc-editor-queue-updates -# -# # Generate alias and virtual files for draft email aliases -# $DTDIR/ietf/bin/generate-draft-aliases && \ -# ( cd /a/postfix; /usr/sbin/postalias -o draft-aliases; ) && \ -# ( cd /a/postfix; /usr/sbin/postmap -o draft-virtual; ) -# -# # Generate alias and virtual files for group email aliases -# $DTDIR/ietf/bin/generate-wg-aliases && \ -# ( cd /a/postfix; /usr/sbin/postalias -o group-aliases; ) && \ -# ( cd /a/postfix; /usr/sbin/postmap -o group-virtual; ) -# -# Generate some static files -ID=/a/ietfdata/doc/draft/repository -DERIVED=/a/ietfdata/derived -DOWNLOAD=/a/www/www6s/download - -export TMPDIR=/a/tmp - -TMPFILE1=`mktemp` || exit 1 -TMPFILE2=`mktemp` || exit 1 -TMPFILE3=`mktemp` || exit 1 -TMPFILE4=`mktemp` || exit 1 -TMPFILE5=`mktemp` || exit 1 -TMPFILE6=`mktemp` || exit 1 -TMPFILE7=`mktemp` || exit 1 -TMPFILE8=`mktemp` || exit 1 -TMPFILE9=`mktemp` || exit 1 -TMPFILEA=`mktemp` || exit 1 -TMPFILEB=`mktemp` || exit 1 - -chmod a+r $TMPFILE1 $TMPFILE2 $TMPFILE3 $TMPFILE4 $TMPFILE5 $TMPFILE6 $TMPFILE7 $TMPFILE8 $TMPFILE9 $TMPFILEA $TMPFILEB - -python -m ietf.idindex.generate_all_id_txt >> $TMPFILE1 -python -m ietf.idindex.generate_id_index_txt >> $TMPFILE2 -python -m ietf.idindex.generate_id_abstracts_txt >> $TMPFILE3 -cp $TMPFILE1 $TMPFILE4 -cp $TMPFILE2 $TMPFILE5 -cp $TMPFILE3 $TMPFILE6 -cp $TMPFILE1 $TMPFILE8 -cp $TMPFILE2 $TMPFILE9 -cp $TMPFILE3 $TMPFILEA -python -m ietf.idindex.generate_all_id2_txt >> $TMPFILE7 -cp $TMPFILE7 $TMPFILEB - -mv $TMPFILE1 $ID/all_id.txt -mv $TMPFILE2 $ID/1id-index.txt -mv $TMPFILE3 $ID/1id-abstracts.txt -mv $TMPFILE4 $DOWNLOAD/id-all.txt -mv $TMPFILE5 $DOWNLOAD/id-index.txt -mv $TMPFILE6 $DOWNLOAD/id-abstract.txt -mv $TMPFILE7 $ID/all_id2.txt -mv $TMPFILE8 $DERIVED/all_id.txt -mv $TMPFILE9 $DERIVED/1id-index.txt -mv $TMPFILEA $DERIVED/1id-abstracts.txt -mv $TMPFILEB $DERIVED/all_id2.txt - -$DTDIR/ietf/manage.py generate_idnits2_rfc_status -$DTDIR/ietf/manage.py generate_idnits2_rfcs_obsoleted - -CHARTER=/a/www/ietf-ftp/charter -wget -q https://datatracker.ietf.org/wg/1wg-charters-by-acronym.txt -O $CHARTER/1wg-charters-by-acronym.txt -wget -q https://datatracker.ietf.org/wg/1wg-charters.txt -O $CHARTER/1wg-charters.txt - -# Regenerate the last week of bibxml-ids -$DTDIR/ietf/manage.py generate_draft_bibxml_files - -# Create and update group wikis -#$DTDIR/ietf/manage.py create_group_wikis - -# exit 0 diff --git a/bin/mkdiagram b/bin/mkdiagram deleted file mode 100755 index 4f015c0abea..00000000000 --- a/bin/mkdiagram +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -# assume we're in bin/, sibling to ietf/ - -cd ${0%/*}/../ietf || { echo "CD to ietf directory failed, bailing out"; exit; } - -trap 'echo "$program($LINENO): Command failed with error code $? ($0 $*)"; exit 1' ERR - -if [ "$*" ]; then apps="$@"; graph="${1%.*}"; else apps=$(ls */models.py | sed 's!/models.py!!'); graph="models"; fi - -newapps="doc group meeting message person name" -legacyapps="announcements idindex idrfc idtracker iesg ietfauth ipr liaisons mailinglists proceedings redirects submit wgcharter wginfo" - -proxy="$(grep ^class */proxy.py | tr '()' ' ' | awk '{printf $2 ","}')" -names="$(grep ^class name/models.py | tr '()' ' ' | awk '{printf $2 ","}')" -legacy="$(for app in $legacyapps; do grep ^class $app/models.py | tr '()' ' '; done | grep -v ' Meeting\\(' | awk '{printf $2 ","}')" -events="$(egrep '^class .+DocEvent' doc/models.py | tr '()' ' ' | awk '{printf $2 ","}')" - -echo -e "proxy: $proxy\n" -echo -e "names: $names\n" -echo -e "legacy:$legacy\n" -echo -e "events:$events\n" - -exclude="--exclude=$proxy,$names,$legacy" - -export PYTHONPATH="$PWD/.." - -echo "Validating..." -./manage.py validate - -export PYTHONPATH=`dirname $PWD` -module=${PWD##*/} -export DJANGO_SETTINGS_MODULE=$module.settings -export graph -export title - -echo "Generate model graph" -graph="models-with-names-and-events" -title="New IETF Database schema" -${0%/*}/../ietf/manage.py graph_models --exclude="$proxy,$legacy" --title "$title" $apps > $graph.dot && dot -Tpng $graph.dot > $graph.png - -echo "Generate new model without names" -graph="models-with-names" -title="New IETF Database schema, without name tables" -modelviz.py --exclude="$proxy,$legacy,$names" --title "$title" $apps > $graph.dot && dot -Tpng $graph.dot > $graph.png - -echo "Generate new model without names and subevents" -graph="models" -title="New IETF Database schema, without name tables and subevents" -modelviz.py --exclude="$proxy,$legacy,$names,$events" --title "$title" $apps > $graph.dot && dot -Tpng $graph.dot > $graph.png diff --git a/bin/mm_hourly b/bin/mm_hourly deleted file mode 100755 index 0d1da2e572c..00000000000 --- a/bin/mm_hourly +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Hourly datatracker jobs, ***run as mailman*** -# -# This script is expected to be triggered by cron from -# $DTDIR/etc/cron.d/datatracker which should be symlinked from -# /etc/cron.d/ - -export LANG=en_US.UTF-8 -export PYTHONIOENCODING=utf-8 - -# Make sure we stop if something goes wrong: -program=${0##*/} -trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; exit 1' ERR - -DTDIR=/a/www/ietf-datatracker/web -cd $DTDIR/ - -# Set up the virtual environment -source $DTDIR/env/bin/activate - -logger -p user.info -t cron "Running $DTDIR/bin/mm_hourly" - -$DTDIR/ietf/manage.py import_mailman_listinfo diff --git a/bin/monthly b/bin/monthly deleted file mode 100755 index 1d36abc2102..00000000000 --- a/bin/monthly +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# Weekly datatracker jobs. -# -# This script is expected to be triggered by cron from -# /etc/cron.d/datatracker -export LANG=en_US.UTF-8 -export PYTHONIOENCODING=utf-8 - -DTDIR=/a/www/ietf-datatracker/web -cd $DTDIR/ - -# Set up the virtual environment -source $DTDIR/env/bin/activate - -logger -p user.info -t cron "Running $DTDIR/bin/monthly" - diff --git a/bin/release-coverage b/bin/release-coverage deleted file mode 100755 index 22177c17a6c..00000000000 --- a/bin/release-coverage +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -zcat release-coverage.json.gz | jq 'to_entries[] | [.value.time, .key, .value.code.coverage, .value.template.coverage, .value.url.coverage] ' 2>/dev/null | tr "\n][" " \n" | tr -d ' "Z' | tr ",T" " " | sort -n | cut -c 2- | sed -n '/2015-03-10/,$p' diff --git a/bin/update b/bin/update deleted file mode 100755 index bcb6e8b1297..00000000000 --- a/bin/update +++ /dev/null @@ -1,229 +0,0 @@ -#!/bin/bash - -version="0.34" -program=$(basename $0) - -NEW="" # If there are more than $NEW % new lines, skip update -OLD="" # If there are more than $OLD % deleted lines, skip update -FILE="" -verbose="" -silent="" - -# ---------------------------------------------------------------------- -function usage() { -cat < -EOF -exit -} - - -# ---------------------------------------------------------------------- -function note() { - if [ -n "$verbose" ]; then - echo -e "$program: $*" - fi -} - -# ---------------------------------------------------------------------- -function warn() { - [ "$QUIET" ] || echo -e "$program: $*" -} - -# ---------------------------------------------------------------------- -function err() { - echo -e "$program: $*" > /dev/stderr -} - -# ----------------------------------------------------------------------------- -function leave() { - errcode=$1; shift - if [ "$errcode" -ge "2" ]; then warn "$*"; else note "$*"; fi - if [ -f "$tempfile" ]; then rm $tempfile; fi - if [ -f "$difffile" ]; then rm $difffile; fi - if [ "$errcode" = "1" -a "$RESULT" = "0" ]; then exit 0; else exit $errcode; fi -} - -# ---------------------------------------------------------------------- -# Set up error trap -trap 'leave 127 "$program($LINENO): Command failed with error code $? while processing '$origfile'."' ERR - -# exit with a message if a command fails -set -e - -# ---------------------------------------------------------------------- -# Get any options -# - -# Default values -PAT="\$path\$base.%Y-%m-%d_%H%M" -RESULT="0" -QUIET="" - -# Based on the sample code in /usr/share/doc/util-linux/examples/parse.bash.gz -if [ "$(uname)" = "Linux" ]; then - GETOPT_RESULT=$(getopt -o bc:ef:hn:o:p:qrvV --long backup,maxchg:,empty,file:,help,maxnew:,maxold:,prefix:,report,quiet,verbose,version -n "$program" -- "$@") -else - GETOPT_RESULT=$(getopt bc:ef:hn:o:p:qrvV "$@") -fi - -if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi - -note "GETOPT_RESULT: $GETOPT_RESULT" -eval set -- "$GETOPT_RESULT" - -while true ; do - case "$1" in - -b|--backup) backup=1; shift ;; # Back up earlier versions by creating a backup file - -c|--maxchg) CHG="$2"; shift 2 ;; # Limit on percentage of changed lines - -e|--empty) empty=1; shift ;; # Permit the update to be empty (default: discard) - -f|--file) FILE="$2"; shift 2 ;; # Read input from FILE instead of standard input - -h|--help) usage; shift ;; # Show this text and exit - -n|--maxnew) NEW="$2"; shift 2 ;; # Limit on percentage of new (added) lines - -o|--maxold) OLD="$2"; shift 2 ;; # Limit on percentage of old (deleted) lines - -p|--pat*) PAT="$2"; shift 2 ;; # Backup name base ('$path$base.%Y%m%d_%H%M') - -q|--quiet) QUIET=1; shift;; # Be less verbose - -r|--result) RESULT=1; shift ;; # Return 1 if update not done - -v|--verbose) verbose=1; shift ;; # Be more verbose about what's happening - -V|--version) echo -e "$program\t$version"; exit;; # Show version and exit - --) shift ; break ;; - *) echo "$program: Internal error, inconsistent option specification." ; exit 1 ;; - esac -done - -if [ $CHG ]; then OLD=$CHG; NEW=$CHG; fi - -if [ $# -lt 1 ]; then echo -e "$program: Missing output filename\n"; usage; fi - -origfile=$1 -tempfile=$(mktemp) -difffile=$(mktemp) - -if [ -e "$origfile" ]; then - cp -p $origfile $tempfile # For ownership and permissions - cat $FILE > $tempfile - [ "$FILE" ] && touch -r $FILE $tempfile - # This won't work if we don't have sufficient privileges: - #chown --reference=$origfile $tempfile - #chmod --reference=$origfile $tempfile -else - cat $FILE > $origfile - [ "$FILE" ] && touch -r $FILE $tempfile - leave 0 "Created file '$origfile'" -fi - -origlen=$(wc -c < $origfile) -newlen=$(wc -c < $tempfile) - -if [ $origlen = 0 -a $newlen = 0 ]; then - rm $tempfile - leave 1 "New content is identical (and void) - not updating '$origfile'." -fi -if [ $newlen = 0 -a -z "$empty" ]; then - leave 1 "New content is void - not updating '$origfile'." -fi - -diff $origfile $tempfile > $difffile || [ $? -le 1 ] && true # suppress the '1' error code on differences -difflen=$(wc -l < $difffile) -if [ $difflen = 0 ]; then - leave 1 "New content is identical - not updating '$origfile'." -fi - -if [ "$OLD" -o "$NEW" ]; then - - if [ "$NEW" ]; then maxnew=$(( $origlen * $NEW / 100 )); fi - if [ "$OLD" ]; then maxdel=$(( $origlen * $OLD / 100 )); fi - - newcount=$(grep "^> " $difffile | wc -c) - outcount=$(grep "^< " $difffile | wc -c) - delcount=$(grep "^! " $difffile | wc -c) - delcount=$(( $outcount + $delcount )) - rm $difffile - - if [ "$OLD" ]; then - if [ "$delcount" -ge "$maxdel" ]; then - cp $tempfile $origfile.update - leave 2 "New content has too many removed lines ($delcount/$origlen)\n - not updating '$origfile'.\nNew content placed in '$origfile.update' instead" - fi - fi - if [ "$NEW" ]; then - if [ "$newcount" -ge "$maxnew" ]; then - cp $tempfile $origfile.update - leave 2 "New content has too many added lines ($newcount/$origlen)\n - not updating '$origfile'.\nNew content placed in '$origfile.update' instead" - fi - fi -fi - -if [ "$backup" ]; then - - path=${origfile%/*} - name=${origfile##*/} - base=${name%.*} - ext=${origfile##*.} - - if [ "$ext" = "$origfile" ]; then - ext="" - elif [ ! "${ext%/*}" = "$ext" ]; then - ext="" - else - ext=".$ext" - fi - - if [ "$path" = "$origfile" ]; then - path="" - else - path="$path/" - fi - - ver=1 - backfile=$(eval date +"$PAT") - backpath="${backfile%/*}" - if [ "$backpath" = "$backfile" ]; then - backpath="." - fi - if [ ! -d $backpath ]; then - if [ -e $backpath ]; then - leave 3 "The backup path '$backpath' exists but isn't a directory" - else - mkdir -p $backpath - fi - fi - while [ -e "$backfile,$ver$ext" ]; do - ver=$(( $ver+1 )) - done - note "Saving backup: $backfile,$ver$ext" - cp -p "$origfile" "$backfile,$ver$ext" - chmod -w "$backfile,$ver$ext" || true -fi - -if ! mv $tempfile $origfile; then cp -p $tempfile $origfile; fi -leave 0 "Updated file '$origfile'" diff --git a/bin/weekly b/bin/weekly deleted file mode 100755 index cca8403fd4a..00000000000 --- a/bin/weekly +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Weekly datatracker jobs. -# -# This script is expected to be triggered by cron from -# /etc/cron.d/datatracker -export LANG=en_US.UTF-8 -export PYTHONIOENCODING=utf-8 - -DTDIR=/a/www/ietf-datatracker/web -cd $DTDIR/ - -# Set up the virtual environment -source $DTDIR/env/bin/activate - -logger -p user.info -t cron "Running $DTDIR/bin/weekly" - - -# Send out weekly summaries of apikey usage - -$DTDIR/ietf/manage.py send_apikey_usage_emails - -# Send notifications about coming expirations -$DTDIR/ietf/bin/notify-expirations - diff --git a/client/App.vue b/client/App.vue index 0664525ca45..7750674296d 100644 --- a/client/App.vue +++ b/client/App.vue @@ -26,6 +26,28 @@ const siteStore = useSiteStore() const appContainer = ref(null) +// -------------------------------------------------------------------- +// Set user theme +// -------------------------------------------------------------------- + +function updateTheme() { + const desiredTheme = window.localStorage?.getItem('theme') + if (desiredTheme === 'dark') { + siteStore.theme = 'dark' + } else if (desiredTheme === 'light') { + siteStore.theme = 'light' + } else if (window.matchMedia("(prefers-color-scheme: dark)").matches) { + siteStore.theme = 'dark' + } else { + siteStore.theme = 'light' + } +} + +updateTheme() + +// this change event fires for either light or dark changes +window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', updateTheme) + // -------------------------------------------------------------------- // Handle browser resize // -------------------------------------------------------------------- diff --git a/client/Embedded.vue b/client/Embedded.vue index a0f0d2831ec..80b105dc152 100644 --- a/client/Embedded.vue +++ b/client/Embedded.vue @@ -1,12 +1,13 @@ diff --git a/client/components/Polls.vue b/client/components/Polls.vue index 72c8e1c6331..0846d4ed160 100644 --- a/client/components/Polls.vue +++ b/client/components/Polls.vue @@ -3,19 +3,20 @@ n-data-table( v-if='state.items.length > 0' :data='state.items' - :columns='columns' + :columns='state.columns' striped ) - span.text-muted(v-else) + span.text-danger(v-else-if='state.errMessage') + em {{ state.errMessage }} + span.text-body-secondary(v-else) em No polls available. + diff --git a/client/components/Status.vue b/client/components/Status.vue new file mode 100644 index 00000000000..4fded5bbe40 --- /dev/null +++ b/client/components/Status.vue @@ -0,0 +1,80 @@ + diff --git a/client/components/n-theme.vue b/client/components/n-theme.vue index 9fff81671e9..b55c9772b97 100644 --- a/client/components/n-theme.vue +++ b/client/components/n-theme.vue @@ -1,24 +1,45 @@ - diff --git a/client/embedded.js b/client/embedded.js index f3b01f68f5e..0509c0aecf8 100644 --- a/client/embedded.js +++ b/client/embedded.js @@ -1,5 +1,12 @@ import { createApp } from 'vue' +import piniaPersist from 'pinia-plugin-persist' import Embedded from './Embedded.vue' +import { createPiniaSingleton } from './shared/create-pinia-singleton' + +// Initialize store (Pinia) + +const pinia = createPiniaSingleton() +pinia.use(piniaPersist) // Mount App @@ -9,5 +16,6 @@ for (const mnt of mountEls) { componentName: mnt.dataset.component, componentId: mnt.dataset.componentId }) + app.use(pinia) app.mount(mnt) } diff --git a/client/index.html b/client/index.html index 740c9943291..75d6f777276 100644 --- a/client/index.html +++ b/client/index.html @@ -12,6 +12,7 @@ +
@@ -20,5 +21,6 @@
+ diff --git a/client/main.js b/client/main.js index 0dc5cf32e07..3fbad907b1d 100644 --- a/client/main.js +++ b/client/main.js @@ -1,14 +1,14 @@ import { createApp } from 'vue' -import { createPinia } from 'pinia' import piniaPersist from 'pinia-plugin-persist' import App from './App.vue' import router from './router' +import { createPiniaSingleton } from './shared/create-pinia-singleton' const app = createApp(App, {}) // Initialize store (Pinia) -const pinia = createPinia() +const pinia = createPiniaSingleton() pinia.use(piniaPersist) app.use(pinia) diff --git a/client/shared/create-pinia-singleton.js b/client/shared/create-pinia-singleton.js new file mode 100644 index 00000000000..f0013245a1e --- /dev/null +++ b/client/shared/create-pinia-singleton.js @@ -0,0 +1,6 @@ +import { createPinia } from 'pinia' + +export function createPiniaSingleton(){ + window.pinia = window.pinia ?? createPinia() + return window.pinia +} diff --git a/client/shared/json-wrapper.js b/client/shared/json-wrapper.js new file mode 100644 index 00000000000..e080b5a4791 --- /dev/null +++ b/client/shared/json-wrapper.js @@ -0,0 +1,20 @@ +export const JSONWrapper = { + parse(jsonString, defaultValue) { + if(typeof jsonString !== "string") { + return defaultValue + } + try { + return JSON.parse(jsonString); + } catch (e) { + console.error(e); + } + return defaultValue + }, + stringify(data) { + try { + return JSON.stringify(data); + } catch (e) { + console.error(e) + } + }, +} diff --git a/client/shared/local-storage-wrapper.js b/client/shared/local-storage-wrapper.js new file mode 100644 index 00000000000..88cd3dc589e --- /dev/null +++ b/client/shared/local-storage-wrapper.js @@ -0,0 +1,42 @@ + +/* + * DEVELOPER NOTE + * + * Some browsers can block storage (localStorage, sessionStorage) + * access for privacy reasons, and all browsers can have storage + * that's full, and then they throw exceptions. + * + * See https://michalzalecki.com/why-using-localStorage-directly-is-a-bad-idea/ + * + * Exceptions can even be thrown when testing if localStorage + * even exists. This can throw: + * + * if (window.localStorage) + * + * Also localStorage/sessionStorage can be enabled after DOMContentLoaded + * so we handle it gracefully. + * + * 1) we need to wrap all usage in try/catch + * 2) we need to defer actual usage of these until + * necessary, + * + */ + +export const localStorageWrapper = { + getItem: (key) => { + try { + return localStorage.getItem(key) + } catch (e) { + console.error(e); + } + return null; + }, + setItem: (key, value) => { + try { + return localStorage.setItem(key, value) + } catch (e) { + console.error(e); + } + return; + }, +} diff --git a/client/shared/status-common.js b/client/shared/status-common.js new file mode 100644 index 00000000000..6503bfbf634 --- /dev/null +++ b/client/shared/status-common.js @@ -0,0 +1,5 @@ +// Used in Playwright Status and components + +export const STATUS_STORAGE_KEY = "status-dismissed" + +export const generateStatusTestId = (id) => `status-${id}` diff --git a/client/shared/store.js b/client/shared/store.js index 389d5e5a82c..5dd57f2c814 100644 --- a/client/shared/store.js +++ b/client/shared/store.js @@ -6,6 +6,7 @@ export const useSiteStore = defineStore('site', { criticalErrorLink: null, criticalErrorLinkText: null, isMobile: /Mobi/i.test(navigator.userAgent), - viewport: Math.round(window.innerWidth) + viewport: Math.round(window.innerWidth), + theme: null }) }) diff --git a/client/shared/timezones.js b/client/shared/timezones.js index c3bc4730005..8239c1f98ee 100644 --- a/client/shared/timezones.js +++ b/client/shared/timezones.js @@ -1,252 +1,252 @@ export default [ - { label: '(GMT-11:00) Niue', value: 'Pacific/Niue' }, - { label: '(GMT-11:00) Pago Pago', value: 'Pacific/Pago_Pago' }, - { label: '(GMT-10:00) Hawaii Time', value: 'Pacific/Honolulu' }, - { label: '(GMT-10:00) Rarotonga', value: 'Pacific/Rarotonga' }, - { label: '(GMT-10:00) Tahiti', value: 'Pacific/Tahiti' }, - { label: '(GMT-09:30) Marquesas', value: 'Pacific/Marquesas' }, - { label: '(GMT-09:00) Alaska Time', value: 'America/Anchorage' }, - { label: '(GMT-09:00) Gambier', value: 'Pacific/Gambier' }, - { label: '(GMT-08:00) Pacific Time - Los Angeles', value: 'America/Los_Angeles' }, - { label: '(GMT-08:00) Pacific Time - Tijuana', value: 'America/Tijuana' }, - { label: '(GMT-08:00) Pacific Time - Vancouver', value: 'America/Vancouver' }, - { label: '(GMT-08:00) Pacific Time - Whitehorse', value: 'America/Whitehorse' }, - { label: '(GMT-08:00) Pitcairn', value: 'Pacific/Pitcairn' }, - { label: '(GMT-07:00) Mountain Time - Arizona', value: 'America/Phoenix' }, - { label: '(GMT-07:00) Mountain Time - Chihuahua, Mazatlan', value: 'America/Mazatlan' }, - { label: '(GMT-07:00) Mountain Time - Dawson Creek', value: 'America/Dawson_Creek' }, - { label: '(GMT-07:00) Mountain Time - Denver', value: 'America/Denver' }, - { label: '(GMT-07:00) Mountain Time - Edmonton', value: 'America/Edmonton' }, - { label: '(GMT-07:00) Mountain Time - Hermosillo', value: 'America/Hermosillo' }, - { label: '(GMT-07:00) Mountain Time - Yellowknife', value: 'America/Yellowknife' }, - { label: '(GMT-06:00) Belize', value: 'America/Belize' }, - { label: '(GMT-06:00) Central Time - Chicago', value: 'America/Chicago' }, - { label: '(GMT-06:00) Central Time - Mexico City', value: 'America/Mexico_City' }, - { label: '(GMT-06:00) Central Time - Regina', value: 'America/Regina' }, - { label: '(GMT-06:00) Central Time - Tegucigalpa', value: 'America/Tegucigalpa' }, - { label: '(GMT-06:00) Central Time - Winnipeg', value: 'America/Winnipeg' }, - { label: '(GMT-06:00) Costa Rica', value: 'America/Costa_Rica' }, - { label: '(GMT-06:00) El Salvador', value: 'America/El_Salvador' }, - { label: '(GMT-06:00) Galapagos', value: 'Pacific/Galapagos' }, - { label: '(GMT-06:00) Guatemala', value: 'America/Guatemala' }, - { label: '(GMT-06:00) Managua', value: 'America/Managua' }, - { label: '(GMT-05:00) America Cancun', value: 'America/Cancun' }, - { label: '(GMT-05:00) Bogota', value: 'America/Bogota' }, - { label: '(GMT-05:00) Easter Island', value: 'Pacific/Easter' }, - { label: '(GMT-05:00) Eastern Time - New York', value: 'America/New_York' }, - { label: '(GMT-05:00) Eastern Time - Iqaluit', value: 'America/Iqaluit' }, - { label: '(GMT-05:00) Eastern Time - Toronto', value: 'America/Toronto' }, - { label: '(GMT-05:00) Guayaquil', value: 'America/Guayaquil' }, - { label: '(GMT-05:00) Havana', value: 'America/Havana' }, - { label: '(GMT-05:00) Jamaica', value: 'America/Jamaica' }, - { label: '(GMT-05:00) Lima', value: 'America/Lima' }, - { label: '(GMT-05:00) Nassau', value: 'America/Nassau' }, - { label: '(GMT-05:00) Panama', value: 'America/Panama' }, - { label: '(GMT-05:00) Port-au-Prince', value: 'America/Port-au-Prince' }, - { label: '(GMT-05:00) Rio Branco', value: 'America/Rio_Branco' }, - { label: '(GMT-04:00) Atlantic Time - Halifax', value: 'America/Halifax' }, - { label: '(GMT-04:00) Barbados', value: 'America/Barbados' }, - { label: '(GMT-04:00) Bermuda', value: 'Atlantic/Bermuda' }, - { label: '(GMT-04:00) Boa Vista', value: 'America/Boa_Vista' }, - { label: '(GMT-04:00) Caracas', value: 'America/Caracas' }, - { label: '(GMT-04:00) Curacao', value: 'America/Curacao' }, - { label: '(GMT-04:00) Grand Turk', value: 'America/Grand_Turk' }, - { label: '(GMT-04:00) Guyana', value: 'America/Guyana' }, - { label: '(GMT-04:00) La Paz', value: 'America/La_Paz' }, - { label: '(GMT-04:00) Manaus', value: 'America/Manaus' }, - { label: '(GMT-04:00) Martinique', value: 'America/Martinique' }, - { label: '(GMT-04:00) Port of Spain', value: 'America/Port_of_Spain' }, - { label: '(GMT-04:00) Porto Velho', value: 'America/Porto_Velho' }, - { label: '(GMT-04:00) Puerto Rico', value: 'America/Puerto_Rico' }, - { label: '(GMT-04:00) Santo Domingo', value: 'America/Santo_Domingo' }, - { label: '(GMT-04:00) Thule', value: 'America/Thule' }, - { label: '(GMT-03:30) Newfoundland Time - St. Johns', value: 'America/St_Johns' }, - { label: '(GMT-03:00) Araguaina', value: 'America/Araguaina' }, - { label: '(GMT-03:00) Asuncion', value: 'America/Asuncion' }, - { label: '(GMT-03:00) Belem', value: 'America/Belem' }, - { label: '(GMT-03:00) Buenos Aires', value: 'America/Argentina/Buenos_Aires' }, - { label: '(GMT-03:00) Campo Grande', value: 'America/Campo_Grande' }, - { label: '(GMT-03:00) Cayenne', value: 'America/Cayenne' }, - { label: '(GMT-03:00) Cuiaba', value: 'America/Cuiaba' }, - { label: '(GMT-03:00) Fortaleza', value: 'America/Fortaleza' }, - { label: '(GMT-03:00) Godthab', value: 'America/Godthab' }, - { label: '(GMT-03:00) Maceio', value: 'America/Maceio' }, - { label: '(GMT-03:00) Miquelon', value: 'America/Miquelon' }, - { label: '(GMT-03:00) Montevideo', value: 'America/Montevideo' }, - { label: '(GMT-03:00) Palmer', value: 'Antarctica/Palmer' }, - { label: '(GMT-03:00) Paramaribo', value: 'America/Paramaribo' }, - { label: '(GMT-03:00) Punta Arenas', value: 'America/Punta_Arenas' }, - { label: '(GMT-03:00) Recife', value: 'America/Recife' }, - { label: '(GMT-03:00) Rothera', value: 'Antarctica/Rothera' }, - { label: '(GMT-03:00) Salvador', value: 'America/Bahia' }, - { label: '(GMT-03:00) Santiago', value: 'America/Santiago' }, - { label: '(GMT-03:00) Stanley', value: 'Atlantic/Stanley' }, - { label: '(GMT-02:00) Noronha', value: 'America/Noronha' }, - { label: '(GMT-02:00) Sao Paulo', value: 'America/Sao_Paulo' }, - { label: '(GMT-02:00) South Georgia', value: 'Atlantic/South_Georgia' }, - { label: '(GMT-01:00) Azores', value: 'Atlantic/Azores' }, - { label: '(GMT-01:00) Cape Verde', value: 'Atlantic/Cape_Verde' }, - { label: '(GMT-01:00) Scoresbysund', value: 'America/Scoresbysund' }, - { label: '(GMT+00:00) Abidjan', value: 'Africa/Abidjan' }, - { label: '(GMT+00:00) Accra', value: 'Africa/Accra' }, - { label: '(GMT+00:00) Bissau', value: 'Africa/Bissau' }, - { label: '(GMT+00:00) Canary Islands', value: 'Atlantic/Canary' }, - { label: '(GMT+00:00) Casablanca', value: 'Africa/Casablanca' }, - { label: '(GMT+00:00) Danmarkshavn', value: 'America/Danmarkshavn' }, - { label: '(GMT+00:00) Dublin', value: 'Europe/Dublin' }, - { label: '(GMT+00:00) El Aaiun', value: 'Africa/El_Aaiun' }, - { label: '(GMT+00:00) Faeroe', value: 'Atlantic/Faroe' }, - { label: '(GMT+00:00) UTC / GMT', value: 'UTC' }, - { label: '(GMT+00:00) Lisbon', value: 'Europe/Lisbon' }, - { label: '(GMT+00:00) London', value: 'Europe/London' }, - { label: '(GMT+00:00) Monrovia', value: 'Africa/Monrovia' }, - { label: '(GMT+00:00) Reykjavik', value: 'Atlantic/Reykjavik' }, - { label: '(GMT+01:00) Algiers', value: 'Africa/Algiers' }, - { label: '(GMT+01:00) Amsterdam', value: 'Europe/Amsterdam' }, - { label: '(GMT+01:00) Andorra', value: 'Europe/Andorra' }, - { label: '(GMT+01:00) Berlin', value: 'Europe/Berlin' }, - { label: '(GMT+01:00) Brussels', value: 'Europe/Brussels' }, - { label: '(GMT+01:00) Budapest', value: 'Europe/Budapest' }, - { label: '(GMT+01:00) Central European Time - Belgrade', value: 'Europe/Belgrade' }, - { label: '(GMT+01:00) Central European Time - Prague', value: 'Europe/Prague' }, - { label: '(GMT+01:00) Ceuta', value: 'Africa/Ceuta' }, - { label: '(GMT+01:00) Copenhagen', value: 'Europe/Copenhagen' }, - { label: '(GMT+01:00) Gibraltar', value: 'Europe/Gibraltar' }, - { label: '(GMT+01:00) Lagos', value: 'Africa/Lagos' }, - { label: '(GMT+01:00) Luxembourg', value: 'Europe/Luxembourg' }, - { label: '(GMT+01:00) Madrid', value: 'Europe/Madrid' }, - { label: '(GMT+01:00) Malta', value: 'Europe/Malta' }, - { label: '(GMT+01:00) Monaco', value: 'Europe/Monaco' }, - { label: '(GMT+01:00) Ndjamena', value: 'Africa/Ndjamena' }, - { label: '(GMT+01:00) Oslo', value: 'Europe/Oslo' }, - { label: '(GMT+01:00) Paris', value: 'Europe/Paris' }, - { label: '(GMT+01:00) Rome', value: 'Europe/Rome' }, - { label: '(GMT+01:00) Stockholm', value: 'Europe/Stockholm' }, - { label: '(GMT+01:00) Tirane', value: 'Europe/Tirane' }, - { label: '(GMT+01:00) Tunis', value: 'Africa/Tunis' }, - { label: '(GMT+01:00) Vienna', value: 'Europe/Vienna' }, - { label: '(GMT+01:00) Warsaw', value: 'Europe/Warsaw' }, - { label: '(GMT+01:00) Zurich', value: 'Europe/Zurich' }, - { label: '(GMT+02:00) Amman', value: 'Asia/Amman' }, - { label: '(GMT+02:00) Athens', value: 'Europe/Athens' }, - { label: '(GMT+02:00) Beirut', value: 'Asia/Beirut' }, - { label: '(GMT+02:00) Bucharest', value: 'Europe/Bucharest' }, - { label: '(GMT+02:00) Cairo', value: 'Africa/Cairo' }, - { label: '(GMT+02:00) Chisinau', value: 'Europe/Chisinau' }, - { label: '(GMT+02:00) Damascus', value: 'Asia/Damascus' }, - { label: '(GMT+02:00) Gaza', value: 'Asia/Gaza' }, - { label: '(GMT+02:00) Helsinki', value: 'Europe/Helsinki' }, - { label: '(GMT+02:00) Jerusalem', value: 'Asia/Jerusalem' }, - { label: '(GMT+02:00) Johannesburg', value: 'Africa/Johannesburg' }, - { label: '(GMT+02:00) Khartoum', value: 'Africa/Khartoum' }, - { label: '(GMT+02:00) Kiev', value: 'Europe/Kiev' }, - { label: '(GMT+02:00) Maputo', value: 'Africa/Maputo' }, - { label: '(GMT+02:00) Moscow-01 - Kaliningrad', value: 'Europe/Kaliningrad' }, - { label: '(GMT+02:00) Nicosia', value: 'Asia/Nicosia' }, - { label: '(GMT+02:00) Riga', value: 'Europe/Riga' }, - { label: '(GMT+02:00) Sofia', value: 'Europe/Sofia' }, - { label: '(GMT+02:00) Tallinn', value: 'Europe/Tallinn' }, - { label: '(GMT+02:00) Tripoli', value: 'Africa/Tripoli' }, - { label: '(GMT+02:00) Vilnius', value: 'Europe/Vilnius' }, - { label: '(GMT+02:00) Windhoek', value: 'Africa/Windhoek' }, - { label: '(GMT+03:00) Baghdad', value: 'Asia/Baghdad' }, - { label: '(GMT+03:00) Istanbul', value: 'Europe/Istanbul' }, - { label: '(GMT+03:00) Minsk', value: 'Europe/Minsk' }, - { label: '(GMT+03:00) Moscow+00 - Moscow', value: 'Europe/Moscow' }, - { label: '(GMT+03:00) Nairobi', value: 'Africa/Nairobi' }, - { label: '(GMT+03:00) Qatar', value: 'Asia/Qatar' }, - { label: '(GMT+03:00) Riyadh', value: 'Asia/Riyadh' }, - { label: '(GMT+03:00) Syowa', value: 'Antarctica/Syowa' }, - { label: '(GMT+03:30) Tehran', value: 'Asia/Tehran' }, - { label: '(GMT+04:00) Baku', value: 'Asia/Baku' }, - { label: '(GMT+04:00) Dubai', value: 'Asia/Dubai' }, - { label: '(GMT+04:00) Mahe', value: 'Indian/Mahe' }, - { label: '(GMT+04:00) Mauritius', value: 'Indian/Mauritius' }, - { label: '(GMT+04:00) Moscow+01 - Samara', value: 'Europe/Samara' }, - { label: '(GMT+04:00) Reunion', value: 'Indian/Reunion' }, - { label: '(GMT+04:00) Tbilisi', value: 'Asia/Tbilisi' }, - { label: '(GMT+04:00) Yerevan', value: 'Asia/Yerevan' }, - { label: '(GMT+04:30) Kabul', value: 'Asia/Kabul' }, - { label: '(GMT+05:00) Aqtau', value: 'Asia/Aqtau' }, - { label: '(GMT+05:00) Aqtobe', value: 'Asia/Aqtobe' }, - { label: '(GMT+05:00) Ashgabat', value: 'Asia/Ashgabat' }, - { label: '(GMT+05:00) Dushanbe', value: 'Asia/Dushanbe' }, - { label: '(GMT+05:00) Karachi', value: 'Asia/Karachi' }, - { label: '(GMT+05:00) Kerguelen', value: 'Indian/Kerguelen' }, - { label: '(GMT+05:00) Maldives', value: 'Indian/Maldives' }, - { label: '(GMT+05:00) Mawson', value: 'Antarctica/Mawson' }, - { label: '(GMT+05:00) Moscow+02 - Yekaterinburg', value: 'Asia/Yekaterinburg' }, - { label: '(GMT+05:00) Tashkent', value: 'Asia/Tashkent' }, - { label: '(GMT+05:30) Colombo', value: 'Asia/Colombo' }, - { label: '(GMT+05:30) India Standard Time', value: 'Asia/Kolkata' }, - { label: '(GMT+05:45) Kathmandu', value: 'Asia/Kathmandu' }, - { label: '(GMT+06:00) Almaty', value: 'Asia/Almaty' }, - { label: '(GMT+06:00) Bishkek', value: 'Asia/Bishkek' }, - { label: '(GMT+06:00) Chagos', value: 'Indian/Chagos' }, - { label: '(GMT+06:00) Dhaka', value: 'Asia/Dhaka' }, - { label: '(GMT+06:00) Moscow+03 - Omsk', value: 'Asia/Omsk' }, - { label: '(GMT+06:00) Thimphu', value: 'Asia/Thimphu' }, - { label: '(GMT+06:00) Vostok', value: 'Antarctica/Vostok' }, - { label: '(GMT+06:30) Cocos', value: 'Indian/Cocos' }, - { label: '(GMT+06:30) Rangoon', value: 'Asia/Yangon' }, - { label: '(GMT+07:00) Bangkok', value: 'Asia/Bangkok' }, - { label: '(GMT+07:00) Christmas', value: 'Indian/Christmas' }, - { label: '(GMT+07:00) Davis', value: 'Antarctica/Davis' }, - { label: '(GMT+07:00) Hanoi', value: 'Asia/Saigon' }, - { label: '(GMT+07:00) Hovd', value: 'Asia/Hovd' }, - { label: '(GMT+07:00) Jakarta', value: 'Asia/Jakarta' }, - { label: '(GMT+07:00) Moscow+04 - Krasnoyarsk', value: 'Asia/Krasnoyarsk' }, - { label: '(GMT+08:00) Brunei', value: 'Asia/Brunei' }, - { label: '(GMT+08:00) China Time - Beijing', value: 'Asia/Shanghai' }, - { label: '(GMT+08:00) Choibalsan', value: 'Asia/Choibalsan' }, - { label: '(GMT+08:00) Hong Kong', value: 'Asia/Hong_Kong' }, - { label: '(GMT+08:00) Kuala Lumpur', value: 'Asia/Kuala_Lumpur' }, - { label: '(GMT+08:00) Macau', value: 'Asia/Macau' }, - { label: '(GMT+08:00) Makassar', value: 'Asia/Makassar' }, - { label: '(GMT+08:00) Manila', value: 'Asia/Manila' }, - { label: '(GMT+08:00) Moscow+05 - Irkutsk', value: 'Asia/Irkutsk' }, - { label: '(GMT+08:00) Singapore', value: 'Asia/Singapore' }, - { label: '(GMT+08:00) Taipei', value: 'Asia/Taipei' }, - { label: '(GMT+08:00) Ulaanbaatar', value: 'Asia/Ulaanbaatar' }, - { label: '(GMT+08:00) Western Time - Perth', value: 'Australia/Perth' }, - { label: '(GMT+08:30) Pyongyang', value: 'Asia/Pyongyang' }, - { label: '(GMT+09:00) Dili', value: 'Asia/Dili' }, - { label: '(GMT+09:00) Jayapura', value: 'Asia/Jayapura' }, - { label: '(GMT+09:00) Moscow+06 - Yakutsk', value: 'Asia/Yakutsk' }, - { label: '(GMT+09:00) Palau', value: 'Pacific/Palau' }, - { label: '(GMT+09:00) Seoul', value: 'Asia/Seoul' }, - { label: '(GMT+09:00) Tokyo', value: 'Asia/Tokyo' }, - { label: '(GMT+09:30) Central Time - Darwin', value: 'Australia/Darwin' }, - { label: '(GMT+10:00) Dumont D\'Urville', value: 'Antarctica/DumontDUrville' }, - { label: '(GMT+10:00) Eastern Time - Brisbane', value: 'Australia/Brisbane' }, - { label: '(GMT+10:00) Guam', value: 'Pacific/Guam' }, - { label: '(GMT+10:00) Moscow+07 - Vladivostok', value: 'Asia/Vladivostok' }, - { label: '(GMT+10:00) Port Moresby', value: 'Pacific/Port_Moresby' }, - { label: '(GMT+10:00) Truk', value: 'Pacific/Chuuk' }, - { label: '(GMT+10:30) Central Time - Adelaide', value: 'Australia/Adelaide' }, - { label: '(GMT+11:00) Casey', value: 'Antarctica/Casey' }, - { label: '(GMT+11:00) Eastern Time - Hobart', value: 'Australia/Hobart' }, - { label: '(GMT+11:00) Eastern Time - Melbourne, Sydney', value: 'Australia/Sydney' }, - { label: '(GMT+11:00) Efate', value: 'Pacific/Efate' }, - { label: '(GMT+11:00) Guadalcanal', value: 'Pacific/Guadalcanal' }, - { label: '(GMT+11:00) Kosrae', value: 'Pacific/Kosrae' }, - { label: '(GMT+11:00) Moscow+08 - Magadan', value: 'Asia/Magadan' }, - { label: '(GMT+11:00) Norfolk', value: 'Pacific/Norfolk' }, - { label: '(GMT+11:00) Noumea', value: 'Pacific/Noumea' }, - { label: '(GMT+11:00) Ponape', value: 'Pacific/Pohnpei' }, - { label: '(GMT+12:00) Funafuti', value: 'Pacific/Funafuti' }, - { label: '(GMT+12:00) Kwajalein', value: 'Pacific/Kwajalein' }, - { label: '(GMT+12:00) Majuro', value: 'Pacific/Majuro' }, - { label: '(GMT+12:00) Moscow+09 - Petropavlovsk-Kamchatskiy', value: 'Asia/Kamchatka' }, - { label: '(GMT+12:00) Nauru', value: 'Pacific/Nauru' }, - { label: '(GMT+12:00) Tarawa', value: 'Pacific/Tarawa' }, - { label: '(GMT+12:00) Wake', value: 'Pacific/Wake' }, - { label: '(GMT+12:00) Wallis', value: 'Pacific/Wallis' }, - { label: '(GMT+13:00) Auckland', value: 'Pacific/Auckland' }, - { label: '(GMT+13:00) Enderbury', value: 'Pacific/Enderbury' }, - { label: '(GMT+13:00) Fakaofo', value: 'Pacific/Fakaofo' }, - { label: '(GMT+13:00) Fiji', value: 'Pacific/Fiji' }, - { label: '(GMT+13:00) Tongatapu', value: 'Pacific/Tongatapu' }, - { label: '(GMT+14:00) Apia', value: 'Pacific/Apia' }, - { label: '(GMT+14:00) Kiritimati', value: 'Pacific/Kiritimati' } + { label: 'Pacific - Niue', value: 'Pacific/Niue' }, + { label: 'Pacific - Pago Pago', value: 'Pacific/Pago_Pago' }, + { label: 'Pacific - Hawaii Time', value: 'Pacific/Honolulu' }, + { label: 'Pacific - Rarotonga', value: 'Pacific/Rarotonga' }, + { label: 'Pacific - Tahiti', value: 'Pacific/Tahiti' }, + { label: 'Pacific - Marquesas', value: 'Pacific/Marquesas' }, + { label: 'America - Alaska Time', value: 'America/Anchorage' }, + { label: 'Pacific - Gambier', value: 'Pacific/Gambier' }, + { label: 'America - Pacific Time - Los Angeles', value: 'America/Los_Angeles' }, + { label: 'America - Pacific Time - Tijuana', value: 'America/Tijuana' }, + { label: 'America - Pacific Time - Vancouver', value: 'America/Vancouver' }, + { label: 'America - Pacific Time - Whitehorse', value: 'America/Whitehorse' }, + { label: 'Pacific - Pitcairn', value: 'Pacific/Pitcairn' }, + { label: 'America - Mountain Time - Arizona', value: 'America/Phoenix' }, + { label: 'America - Mountain Time - Chihuahua, Mazatlan', value: 'America/Mazatlan' }, + { label: 'America - Mountain Time - Dawson Creek', value: 'America/Dawson_Creek' }, + { label: 'America - Mountain Time - Denver', value: 'America/Denver' }, + { label: 'America - Mountain Time - Edmonton', value: 'America/Edmonton' }, + { label: 'America - Mountain Time - Hermosillo', value: 'America/Hermosillo' }, + { label: 'America - Mountain Time - Yellowknife', value: 'America/Yellowknife' }, + { label: 'America - Belize', value: 'America/Belize' }, + { label: 'America - Central Time - Chicago', value: 'America/Chicago' }, + { label: 'America - Central Time - Mexico City', value: 'America/Mexico_City' }, + { label: 'America - Central Time - Regina', value: 'America/Regina' }, + { label: 'America - Central Time - Tegucigalpa', value: 'America/Tegucigalpa' }, + { label: 'America - Central Time - Winnipeg', value: 'America/Winnipeg' }, + { label: 'America - Costa Rica', value: 'America/Costa_Rica' }, + { label: 'America - El Salvador', value: 'America/El_Salvador' }, + { label: 'Pacific - Galapagos', value: 'Pacific/Galapagos' }, + { label: 'America - Guatemala', value: 'America/Guatemala' }, + { label: 'America - Managua', value: 'America/Managua' }, + { label: 'America - America Cancun', value: 'America/Cancun' }, + { label: 'America - Bogota', value: 'America/Bogota' }, + { label: 'Pacific - Easter Island', value: 'Pacific/Easter' }, + { label: 'America - Eastern Time - New York', value: 'America/New_York' }, + { label: 'America - Eastern Time - Iqaluit', value: 'America/Iqaluit' }, + { label: 'America - Eastern Time - Toronto', value: 'America/Toronto' }, + { label: 'America - Guayaquil', value: 'America/Guayaquil' }, + { label: 'America - Havana', value: 'America/Havana' }, + { label: 'America - Jamaica', value: 'America/Jamaica' }, + { label: 'America - Lima', value: 'America/Lima' }, + { label: 'America - Nassau', value: 'America/Nassau' }, + { label: 'America - Panama', value: 'America/Panama' }, + { label: 'America - Port-au-Prince', value: 'America/Port-au-Prince' }, + { label: 'America - Rio Branco', value: 'America/Rio_Branco' }, + { label: 'America - Atlantic Time - Halifax', value: 'America/Halifax' }, + { label: 'America - Barbados', value: 'America/Barbados' }, + { label: 'Atlantic - Bermuda', value: 'Atlantic/Bermuda' }, + { label: 'America - Boa Vista', value: 'America/Boa_Vista' }, + { label: 'America - Caracas', value: 'America/Caracas' }, + { label: 'America - Curacao', value: 'America/Curacao' }, + { label: 'America - Grand Turk', value: 'America/Grand_Turk' }, + { label: 'America - Guyana', value: 'America/Guyana' }, + { label: 'America - La Paz', value: 'America/La_Paz' }, + { label: 'America - Manaus', value: 'America/Manaus' }, + { label: 'America - Martinique', value: 'America/Martinique' }, + { label: 'America - Port of Spain', value: 'America/Port_of_Spain' }, + { label: 'America - Porto Velho', value: 'America/Porto_Velho' }, + { label: 'America - Puerto Rico', value: 'America/Puerto_Rico' }, + { label: 'America - Santo Domingo', value: 'America/Santo_Domingo' }, + { label: 'America - Thule', value: 'America/Thule' }, + { label: 'America - Newfoundland Time - St. Johns', value: 'America/St_Johns' }, + { label: 'America - Araguaina', value: 'America/Araguaina' }, + { label: 'America - Asuncion', value: 'America/Asuncion' }, + { label: 'America - Belem', value: 'America/Belem' }, + { label: 'America - Buenos Aires', value: 'America/Argentina/Buenos_Aires' }, + { label: 'America - Campo Grande', value: 'America/Campo_Grande' }, + { label: 'America - Cayenne', value: 'America/Cayenne' }, + { label: 'America - Cuiaba', value: 'America/Cuiaba' }, + { label: 'America - Fortaleza', value: 'America/Fortaleza' }, + { label: 'America - Godthab', value: 'America/Godthab' }, + { label: 'America - Maceio', value: 'America/Maceio' }, + { label: 'America - Miquelon', value: 'America/Miquelon' }, + { label: 'America - Montevideo', value: 'America/Montevideo' }, + { label: 'Antarctica - Palmer', value: 'Antarctica/Palmer' }, + { label: 'America - Paramaribo', value: 'America/Paramaribo' }, + { label: 'America - Punta Arenas', value: 'America/Punta_Arenas' }, + { label: 'America - Recife', value: 'America/Recife' }, + { label: 'Antarctica - Rothera', value: 'Antarctica/Rothera' }, + { label: 'America - Salvador', value: 'America/Bahia' }, + { label: 'America - Santiago', value: 'America/Santiago' }, + { label: 'Atlantic - Stanley', value: 'Atlantic/Stanley' }, + { label: 'America - Noronha', value: 'America/Noronha' }, + { label: 'America - Sao Paulo', value: 'America/Sao_Paulo' }, + { label: 'Atlantic - South Georgia', value: 'Atlantic/South_Georgia' }, + { label: 'Atlantic - Azores', value: 'Atlantic/Azores' }, + { label: 'Atlantic - Cape Verde', value: 'Atlantic/Cape_Verde' }, + { label: 'America - Scoresbysund', value: 'America/Scoresbysund' }, + { label: 'Africa - Abidjan', value: 'Africa/Abidjan' }, + { label: 'Africa - Accra', value: 'Africa/Accra' }, + { label: 'Africa - Bissau', value: 'Africa/Bissau' }, + { label: 'Atlantic - Canary Islands', value: 'Atlantic/Canary' }, + { label: 'Africa - Casablanca', value: 'Africa/Casablanca' }, + { label: 'America - Danmarkshavn', value: 'America/Danmarkshavn' }, + { label: 'Europe - Dublin', value: 'Europe/Dublin' }, + { label: 'Africa - El Aaiun', value: 'Africa/El_Aaiun' }, + { label: 'Atlantic - Faeroe', value: 'Atlantic/Faroe' }, + { label: 'UTC / GMT', value: 'UTC' }, + { label: 'Europe - Lisbon', value: 'Europe/Lisbon' }, + { label: 'Europe - London', value: 'Europe/London' }, + { label: 'Africa - Monrovia', value: 'Africa/Monrovia' }, + { label: 'Atlantic - Reykjavik', value: 'Atlantic/Reykjavik' }, + { label: 'Africa - Algiers', value: 'Africa/Algiers' }, + { label: 'Europe - Amsterdam', value: 'Europe/Amsterdam' }, + { label: 'Europe - Andorra', value: 'Europe/Andorra' }, + { label: 'Europe - Berlin', value: 'Europe/Berlin' }, + { label: 'Europe - Brussels', value: 'Europe/Brussels' }, + { label: 'Europe - Budapest', value: 'Europe/Budapest' }, + { label: 'Europe - Central European Time - Belgrade', value: 'Europe/Belgrade' }, + { label: 'Europe - Central European Time - Prague', value: 'Europe/Prague' }, + { label: 'Africa - Ceuta', value: 'Africa/Ceuta' }, + { label: 'Europe - Copenhagen', value: 'Europe/Copenhagen' }, + { label: 'Europe - Gibraltar', value: 'Europe/Gibraltar' }, + { label: 'Africa - Lagos', value: 'Africa/Lagos' }, + { label: 'Europe - Luxembourg', value: 'Europe/Luxembourg' }, + { label: 'Europe - Madrid', value: 'Europe/Madrid' }, + { label: 'Europe - Malta', value: 'Europe/Malta' }, + { label: 'Europe - Monaco', value: 'Europe/Monaco' }, + { label: 'Africa - Ndjamena', value: 'Africa/Ndjamena' }, + { label: 'Europe - Oslo', value: 'Europe/Oslo' }, + { label: 'Europe - Paris', value: 'Europe/Paris' }, + { label: 'Europe - Rome', value: 'Europe/Rome' }, + { label: 'Europe - Stockholm', value: 'Europe/Stockholm' }, + { label: 'Europe - Tirane', value: 'Europe/Tirane' }, + { label: 'Africa - Tunis', value: 'Africa/Tunis' }, + { label: 'Europe - Vienna', value: 'Europe/Vienna' }, + { label: 'Europe - Warsaw', value: 'Europe/Warsaw' }, + { label: 'Europe - Zurich', value: 'Europe/Zurich' }, + { label: 'Asia - Amman', value: 'Asia/Amman' }, + { label: 'Europe - Athens', value: 'Europe/Athens' }, + { label: 'Asia - Beirut', value: 'Asia/Beirut' }, + { label: 'Europe - Bucharest', value: 'Europe/Bucharest' }, + { label: 'Africa - Cairo', value: 'Africa/Cairo' }, + { label: 'Europe - Chisinau', value: 'Europe/Chisinau' }, + { label: 'Asia - Damascus', value: 'Asia/Damascus' }, + { label: 'Asia - Gaza', value: 'Asia/Gaza' }, + { label: 'Europe - Helsinki', value: 'Europe/Helsinki' }, + { label: 'Asia - Jerusalem', value: 'Asia/Jerusalem' }, + { label: 'Africa - Johannesburg', value: 'Africa/Johannesburg' }, + { label: 'Africa - Khartoum', value: 'Africa/Khartoum' }, + { label: 'Europe - Kiev', value: 'Europe/Kiev' }, + { label: 'Africa - Maputo', value: 'Africa/Maputo' }, + { label: 'Europe - Moscow-01 - Kaliningrad', value: 'Europe/Kaliningrad' }, + { label: 'Asia - Nicosia', value: 'Asia/Nicosia' }, + { label: 'Europe - Riga', value: 'Europe/Riga' }, + { label: 'Europe - Sofia', value: 'Europe/Sofia' }, + { label: 'Europe - Tallinn', value: 'Europe/Tallinn' }, + { label: 'Africa - Tripoli', value: 'Africa/Tripoli' }, + { label: 'Europe - Vilnius', value: 'Europe/Vilnius' }, + { label: 'Africa - Windhoek', value: 'Africa/Windhoek' }, + { label: 'Asia - Baghdad', value: 'Asia/Baghdad' }, + { label: 'Europe - Istanbul', value: 'Europe/Istanbul' }, + { label: 'Europe - Minsk', value: 'Europe/Minsk' }, + { label: 'Europe - Moscow+00 - Moscow', value: 'Europe/Moscow' }, + { label: 'Africa - Nairobi', value: 'Africa/Nairobi' }, + { label: 'Asia - Qatar', value: 'Asia/Qatar' }, + { label: 'Asia - Riyadh', value: 'Asia/Riyadh' }, + { label: 'Antarctica - Syowa', value: 'Antarctica/Syowa' }, + { label: 'Asia - Tehran', value: 'Asia/Tehran' }, + { label: 'Asia - Baku', value: 'Asia/Baku' }, + { label: 'Asia - Dubai', value: 'Asia/Dubai' }, + { label: 'Indian - Mahe', value: 'Indian/Mahe' }, + { label: 'Indian - Mauritius', value: 'Indian/Mauritius' }, + { label: 'Europe - Moscow+01 - Samara', value: 'Europe/Samara' }, + { label: 'Indian - Reunion', value: 'Indian/Reunion' }, + { label: 'Asia - Tbilisi', value: 'Asia/Tbilisi' }, + { label: 'Asia - Yerevan', value: 'Asia/Yerevan' }, + { label: 'Asia - Kabul', value: 'Asia/Kabul' }, + { label: 'Asia - Aqtau', value: 'Asia/Aqtau' }, + { label: 'Asia - Aqtobe', value: 'Asia/Aqtobe' }, + { label: 'Asia - Ashgabat', value: 'Asia/Ashgabat' }, + { label: 'Asia - Dushanbe', value: 'Asia/Dushanbe' }, + { label: 'Asia - Karachi', value: 'Asia/Karachi' }, + { label: 'Indian - Kerguelen', value: 'Indian/Kerguelen' }, + { label: 'Indian - Maldives', value: 'Indian/Maldives' }, + { label: 'Antarctica - Mawson', value: 'Antarctica/Mawson' }, + { label: 'Asia - Moscow+02 - Yekaterinburg', value: 'Asia/Yekaterinburg' }, + { label: 'Asia - Tashkent', value: 'Asia/Tashkent' }, + { label: 'Asia - Colombo', value: 'Asia/Colombo' }, + { label: 'Asia - India Standard Time', value: 'Asia/Kolkata' }, + { label: 'Asia - Kathmandu', value: 'Asia/Kathmandu' }, + { label: 'Asia - Almaty', value: 'Asia/Almaty' }, + { label: 'Asia - Bishkek', value: 'Asia/Bishkek' }, + { label: 'Indian - Chagos', value: 'Indian/Chagos' }, + { label: 'Asia - Dhaka', value: 'Asia/Dhaka' }, + { label: 'Asia - Moscow+03 - Omsk', value: 'Asia/Omsk' }, + { label: 'Asia - Thimphu', value: 'Asia/Thimphu' }, + { label: 'Antarctica - Vostok', value: 'Antarctica/Vostok' }, + { label: 'Indian - Cocos', value: 'Indian/Cocos' }, + { label: 'Asia - Rangoon', value: 'Asia/Yangon' }, + { label: 'Asia - Bangkok', value: 'Asia/Bangkok' }, + { label: 'Indian - Christmas', value: 'Indian/Christmas' }, + { label: 'Antarctica - Davis', value: 'Antarctica/Davis' }, + { label: 'Asia - Hanoi', value: 'Asia/Saigon' }, + { label: 'Asia - Hovd', value: 'Asia/Hovd' }, + { label: 'Asia - Jakarta', value: 'Asia/Jakarta' }, + { label: 'Asia - Moscow+04 - Krasnoyarsk', value: 'Asia/Krasnoyarsk' }, + { label: 'Asia - Brunei', value: 'Asia/Brunei' }, + { label: 'Asia - China Time - Beijing', value: 'Asia/Shanghai' }, + { label: 'Asia - Choibalsan', value: 'Asia/Choibalsan' }, + { label: 'Asia - Hong Kong', value: 'Asia/Hong_Kong' }, + { label: 'Asia - Kuala Lumpur', value: 'Asia/Kuala_Lumpur' }, + { label: 'Asia - Macau', value: 'Asia/Macau' }, + { label: 'Asia - Makassar', value: 'Asia/Makassar' }, + { label: 'Asia - Manila', value: 'Asia/Manila' }, + { label: 'Asia - Moscow+05 - Irkutsk', value: 'Asia/Irkutsk' }, + { label: 'Asia - Singapore', value: 'Asia/Singapore' }, + { label: 'Asia - Taipei', value: 'Asia/Taipei' }, + { label: 'Asia - Ulaanbaatar', value: 'Asia/Ulaanbaatar' }, + { label: 'Australia - Western Time - Perth', value: 'Australia/Perth' }, + { label: 'Asia - Pyongyang', value: 'Asia/Pyongyang' }, + { label: 'Asia - Dili', value: 'Asia/Dili' }, + { label: 'Asia - Jayapura', value: 'Asia/Jayapura' }, + { label: 'Asia - Moscow+06 - Yakutsk', value: 'Asia/Yakutsk' }, + { label: 'Pacific - Palau', value: 'Pacific/Palau' }, + { label: 'Asia - Seoul', value: 'Asia/Seoul' }, + { label: 'Asia - Tokyo', value: 'Asia/Tokyo' }, + { label: 'Australia - Central Time - Darwin', value: 'Australia/Darwin' }, + { label: 'Antarctica - Dumont D\'Urville', value: 'Antarctica/DumontDUrville' }, + { label: 'Australia - Eastern Time - Brisbane', value: 'Australia/Brisbane' }, + { label: 'Pacific - Guam', value: 'Pacific/Guam' }, + { label: 'Asia - Moscow+07 - Vladivostok', value: 'Asia/Vladivostok' }, + { label: 'Pacific - Port Moresby', value: 'Pacific/Port_Moresby' }, + { label: 'Pacific - Truk', value: 'Pacific/Chuuk' }, + { label: 'Australia - Central Time - Adelaide', value: 'Australia/Adelaide' }, + { label: 'Antarctica - Casey', value: 'Antarctica/Casey' }, + { label: 'Australia - Eastern Time - Hobart', value: 'Australia/Hobart' }, + { label: 'Australia - Eastern Time - Melbourne, Sydney', value: 'Australia/Sydney' }, + { label: 'Pacific - Efate', value: 'Pacific/Efate' }, + { label: 'Pacific - Guadalcanal', value: 'Pacific/Guadalcanal' }, + { label: 'Pacific - Kosrae', value: 'Pacific/Kosrae' }, + { label: 'Asia - Moscow+08 - Magadan', value: 'Asia/Magadan' }, + { label: 'Pacific - Norfolk', value: 'Pacific/Norfolk' }, + { label: 'Pacific - Noumea', value: 'Pacific/Noumea' }, + { label: 'Pacific - Ponape', value: 'Pacific/Pohnpei' }, + { label: 'Pacific - Funafuti', value: 'Pacific/Funafuti' }, + { label: 'Pacific - Kwajalein', value: 'Pacific/Kwajalein' }, + { label: 'Pacific - Majuro', value: 'Pacific/Majuro' }, + { label: 'Asia - Moscow+09 - Petropavlovsk-Kamchatskiy', value: 'Asia/Kamchatka' }, + { label: 'Pacific - Nauru', value: 'Pacific/Nauru' }, + { label: 'Pacific - Tarawa', value: 'Pacific/Tarawa' }, + { label: 'Pacific - Wake', value: 'Pacific/Wake' }, + { label: 'Pacific - Wallis', value: 'Pacific/Wallis' }, + { label: 'Pacific - Auckland', value: 'Pacific/Auckland' }, + { label: 'Pacific - Enderbury', value: 'Pacific/Enderbury' }, + { label: 'Pacific - Fakaofo', value: 'Pacific/Fakaofo' }, + { label: 'Pacific - Fiji', value: 'Pacific/Fiji' }, + { label: 'Pacific - Tongatapu', value: 'Pacific/Tongatapu' }, + { label: 'Pacific - Apia', value: 'Pacific/Apia' }, + { label: 'Pacific - Kiritimati', value: 'Pacific/Kiritimati' } ] diff --git a/client/shared/urls.json b/client/shared/urls.json index 285caa07d2c..15410d68df1 100644 --- a/client/shared/urls.json +++ b/client/shared/urls.json @@ -1,5 +1,6 @@ { "bofDefinition": "https://www.ietf.org/how/bofs/", + "hackathonWiki": "https://wiki.ietf.org/meeting/{meetingNumber}/hackathon", "meetingCalIcs": "/meeting/{meetingNumber}/agenda.ics", "meetingDetails": "/meeting/{meetingNumber}/session/{eventAcronym}/", "meetingMaterialsPdf": "/meeting/{meetingNumber}/agenda/{eventAcronym}-drafts.pdf", diff --git a/client/shared/xslugify.js b/client/shared/xslugify.js index daf0bdf2ba4..e1ac556ddf0 100644 --- a/client/shared/xslugify.js +++ b/client/shared/xslugify.js @@ -1,5 +1,5 @@ import slugify from 'slugify' export default (str) => { - return slugify(str.replace('/', '-'), { lower: true }) + return slugify(str.replaceAll('/', '-').replaceAll(/['&]/g, ''), { lower: true }) } diff --git a/debug.py b/debug.py index bf34367cceb..4f0d64bae2b 100644 --- a/debug.py +++ b/debug.py @@ -3,15 +3,7 @@ import sys import time as timeutils import inspect -from typing import Callable -try: - import syslog - logger = syslog.syslog # type: Callable -except ImportError: # import syslog will fail on Windows boxes - import logging - logging.basicConfig(filename='tracker.log',level=logging.INFO) - logger = logging.info try: from pprint import pformat @@ -55,7 +47,7 @@ def fix(s,n=64): if len(s) > n+3: s = s[:n]+"..." return s - def wrap(fn, *params,**kwargs): + def wrap(*params,**kwargs): call = wrap.callcount = wrap.callcount + 1 indent = ' ' * _report_indent[0] @@ -81,8 +73,8 @@ def wrap(fn, *params,**kwargs): return ret wrap.callcount = 0 if debug: - from decorator import decorator - return decorator(wrap, fn) + from functools import update_wrapper + return update_wrapper(wrap, fn) else: return fn @@ -119,7 +111,7 @@ def clock(s): def time(fn): """Decorator to print timing information about a function call. """ - def wrap(fn, *params,**kwargs): + def wrap(*params,**kwargs): indent = ' ' * _report_indent[0] fc = "%s.%s()" % (fn.__module__, fn.__name__,) @@ -132,8 +124,8 @@ def wrap(fn, *params,**kwargs): return ret wrap.callcount = 0 if debug: - from decorator import decorator - return decorator(wrap, fn) + from functools import update_wrapper + return update_wrapper(wrap, fn) else: return fn @@ -155,13 +147,6 @@ def showpos(name): indent = ' ' * (_report_indent[0]) sys.stderr.write("%s%s:%s: %s: '%s'\n" % (indent, fn, line, name, value)) -def log(name): - if debug: - frame = inspect.stack()[1][0] - value = eval(name, frame.f_globals, frame.f_locals) - indent = ' ' * (_report_indent[0]) - logger("%s%s: %s" % (indent, name, value)) - def pprint(name): if debug: frame = inspect.stack()[1][0] @@ -190,7 +175,7 @@ def type(name): value = eval(name, frame.f_globals, frame.f_locals) indent = ' ' * (_report_indent[0]) sys.stderr.write("%s%s: %s\n" % (indent, name, value)) - + def say(s): if debug: indent = ' ' * (_report_indent[0]) @@ -205,11 +190,11 @@ def wrapper(*args, **kwargs): prof.dump_stats(datafn) return retval if debug: - from decorator import decorator - return decorator(wrapper, fn) + from functools import update_wrapper + return update_wrapper(wrapper, fn) else: return fn - + def traceback(levels=None): if debug: indent = ' ' * (_report_indent[0]) diff --git a/dev/INSTALL b/dev/INSTALL deleted file mode 100644 index 15c74729721..00000000000 --- a/dev/INSTALL +++ /dev/null @@ -1,155 +0,0 @@ -============================================================================== - IETF Datatracker -============================================================================== - ------------------------------------------------------------------------------- - Installation Instructions ------------------------------------------------------------------------------- - -General Instructions for Deployment of a New Release -==================================================== - - 0. Prepare to hold different roles at different stages of the instructions below. - You will need to be root, wwwrun, and some user in group docker. - Consider using separate shells for the wwwrun and other roles. These instructions - are written assuming you will only use one shell. - - 1. Make a directory to hold the new release as wwwrun:: - sudo su - -s /bin/bash wwwrun - mkdir /a/www/ietf-datatracker/${releasenumber} - cd /a/www/ietf-datatracker/${releasenumber} - - 2. Fetch the release tarball from github - (see https://github.com/ietf-tools/datatracker/releases):: - - wget https://github.com/ietf-tools/datatracker/releases/download/${releasenumber}/release.tar.gz - tar xzvf release.tar.gz - - 3. Copy ietf/settings_local.py from previous release:: - - cp ../web/ietf/settings_local.py ietf/ - - 4. Setup a new virtual environment and install requirements:: - - python3.9 -mvenv env - source env/bin/activate - pip install -r requirements.txt - pip freeze > frozen-requirements.txt - - (The pip freeze command records the exact versions of the Python libraries that pip installed. - This is used by the celery docker container to ensure it uses the same library versions as - the datatracker service.) - - 5. Move static files into place for CDN (/a/www/www6s/lib/dt): - - ietf/manage.py collectstatic - - 6. Run system checks (which patches the just installed modules):: - - ietf/manage.py check - - 7. Switch to the docker directory and update images as a user in group docker: - - exit - cd /a/docker/datatracker - docker image tag ghcr.io/ietf-tools/datatracker-celery:latest datatracker-celery-fallback - docker image tag ghcr.io/ietf-tools/datatracker-mq:latest datatracker-mq-fallback - docker-compose pull - - 8. Stop and remove the async task containers: - Wait for this to finish cleanly. Usually this will only be a few seconds, but it may take up - to about 10 minutes for the 'down' command to complete if a long-running task is in progress. - - docker-compose down - - 9. Stop the datatracker - - sudo systemctl stop datatracker.socket datatracker.service - - 10. Return to the release directory and run migrations as wwwrun: - - sudo su - -s /bin/bash wwwrun - cd /a/www/ietf-datatracker/${releasenumber} - ietf/manage.py migrate - - Take note if any migrations were executed. - - 11. Back out one directory level, then re-point the 'web' symlink:: - - cd .. - rm ./web; ln -s ${releasenumber} web - - 12. Start the datatracker service (it is no longer necessary to restart apache) :: - - exit - sudo systemctl start datatracker.service datatracker.socket - - 13. Start async task worker and message broker: - - cd /a/docker/datatracker - bash startcommand - - 14. Verify operation: - - http://datatracker.ietf.org/ - - 15. If install failed and there were no migrations at step 9, revert web symlink and docker update and repeat the - restart in steps 11 and 12. To revert the docker update: - - cd /a/docker/datatracker - docker-compose down - docker image rm ghcr.io/ietf-tools/datatracker-celery:latest ghcr.io/ietf-tools/datatracker-mq:latest - docker image tag datatracker-celery-fallback ghcr.io/ietf-tools/datatracker-celery:latest - docker image tag datatracker-mq-fallback ghcr.io/ietf-tools/datatracker-mq:latest - cd - - - If there were migrations at step 10, they will need to be reversed before the restart at step 12. - If it's not obvious what to do to reverse the migrations, contact the dev team. - - -Patching a Production Release -============================= - -Sometimes it can prove necessary to patch an existing release. -The following process should be used: - - 1. Code and test the patch on an copy of the release with any - previously applied patches put in place. - - 2. Produce a patch file, named with date and subject:: - - $ git diff > 2013-03-25-ballot-calculation.patch - - 3. Move the patch file to the production server, and place it in - '/a/www/ietf-datatracker/patches/' - - 4. Make a recursive copy of the production code to a new directory, named with a patch number. - - /a/www/ietf-datatracker $ rsync -a web/ ${releasenumber}.p1/ - - 5. Apply the patch:: - - /a/www/ietf-datatracker $ cd ${releasenumber}.p1/ - /a/www/ietf-datatracker/${releasnumber}.p1 $ patch -p1 \ - < ../patches/2013-03-25-ballot-calculation.patch - - This must not produce any messages about failing to apply any chunks; - if it does, go back to 1. and figure out why. - - 6. Edit ``.../ietf/__init__.py`` in the new patched release to indicate the patch - version in the ``__patch__`` string. - - 7. Stop the async task container (this may take a few minutes if tasks are in progress): - - cd /a/docker/datatracker - docker-compose down - - 8. Change the 'web' symlink, reload etc. as described in - `General Instructions for Deployment of a New Release`_. - - 9. Start async task worker: - - cd /a/docker/datatracker - bash startcommand - - diff --git a/dev/build/Dockerfile b/dev/build/Dockerfile new file mode 100644 index 00000000000..ae59ba1440f --- /dev/null +++ b/dev/build/Dockerfile @@ -0,0 +1,41 @@ +FROM ghcr.io/ietf-tools/datatracker-app-base:20251201T1548 +LABEL maintainer="IETF Tools Team " + +ENV DEBIAN_FRONTEND=noninteractive + +# uid 498 = wwwrun and gid 496 = www on ietfa +RUN groupadd -g 1000 datatracker && \ + useradd -c "Datatracker User" -u 1000 -g datatracker -m -s /bin/false datatracker + +RUN apt-get purge -y imagemagick imagemagick-6-common + +# Install libreoffice (needed via PPT2PDF_COMMAND) +RUN apt-get update && \ + apt-get -qy install libreoffice-nogui + +COPY . . +COPY ./dev/build/start.sh ./start.sh +COPY ./dev/build/datatracker-start.sh ./datatracker-start.sh +COPY ./dev/build/migration-start.sh ./migration-start.sh +COPY ./dev/build/celery-start.sh ./celery-start.sh +COPY ./dev/build/gunicorn.conf.py ./gunicorn.conf.py + +RUN pip3 --disable-pip-version-check --no-cache-dir install -r requirements.txt && \ + echo '# empty' > ietf/settings_local.py && \ + ietf/manage.py patch_libraries && \ + rm -f ietf/settings_local.py + +RUN chmod +x start.sh && \ + chmod +x datatracker-start.sh && \ + chmod +x migration-start.sh && \ + chmod +x celery-start.sh && \ + chmod +x docker/scripts/app-create-dirs.sh && \ + sh ./docker/scripts/app-create-dirs.sh + +RUN mkdir -p /a + +VOLUME [ "/a" ] + +EXPOSE 8000 + +CMD ["./start.sh"] diff --git a/dev/build/TARGET_BASE b/dev/build/TARGET_BASE new file mode 100644 index 00000000000..726f080c678 --- /dev/null +++ b/dev/build/TARGET_BASE @@ -0,0 +1 @@ +20251201T1548 diff --git a/dev/build/celery-start.sh b/dev/build/celery-start.sh new file mode 100644 index 00000000000..69dcd7bbda8 --- /dev/null +++ b/dev/build/celery-start.sh @@ -0,0 +1,52 @@ +#!/bin/bash -e +# +# Run a celery worker +# +echo "Running Datatracker checks..." +./ietf/manage.py check + +# Check whether the blobdb database exists - inspectdb will return a false +# status if not. +if ietf/manage.py inspectdb --database blobdb > /dev/null 2>&1; then + HAVE_BLOBDB="yes" +fi + +migrations_applied_for () { + local DATABASE=${1:-default} + ietf/manage.py migrate --check --database "$DATABASE" +} + +migrations_all_applied () { + if [[ "$HAVE_BLOBDB" == "yes" ]]; then + migrations_applied_for default && migrations_applied_for blobdb + else + migrations_applied_for default + fi +} + +if ! migrations_all_applied; then + echo "Unapplied migrations found, waiting to start..." + sleep 5 + while ! migrations_all_applied ; do + echo "... still waiting for migrations..." + sleep 5 + done +fi + +echo "Starting Celery..." + +cleanup () { + # Cleanly terminate the celery app by sending it a TERM, then waiting for it to exit. + if [[ -n "${celery_pid}" ]]; then + echo "Gracefully terminating celery worker. This may take a few minutes if tasks are in progress..." + kill -TERM "${celery_pid}" + wait "${celery_pid}" + fi +} + +trap 'trap "" TERM; cleanup' TERM + +# start celery in the background so we can trap the TERM signal +celery "$@" & +celery_pid=$! +wait "${celery_pid}" diff --git a/dev/build/collectstatics.sh b/dev/build/collectstatics.sh new file mode 100644 index 00000000000..44f1c608a93 --- /dev/null +++ b/dev/build/collectstatics.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# Copy temp local settings +cp dev/build/settings_local_collectstatics.py ietf/settings_local.py + +# Install Python dependencies +pip --disable-pip-version-check --no-cache-dir install -r requirements.txt + +# Collect statics +ietf/manage.py collectstatic + +# Delete temp local settings +rm ietf/settings_local.py \ No newline at end of file diff --git a/dev/build/datatracker-start.sh b/dev/build/datatracker-start.sh new file mode 100644 index 00000000000..a676415a261 --- /dev/null +++ b/dev/build/datatracker-start.sh @@ -0,0 +1,60 @@ +#!/bin/bash -e + +echo "Running Datatracker checks..." +./ietf/manage.py check + +# Check whether the blobdb database exists - inspectdb will return a false +# status if not. +if ietf/manage.py inspectdb --database blobdb > /dev/null 2>&1; then + HAVE_BLOBDB="yes" +fi + +migrations_applied_for () { + local DATABASE=${1:-default} + ietf/manage.py migrate --check --database "$DATABASE" +} + +migrations_all_applied () { + if [[ "$HAVE_BLOBDB" == "yes" ]]; then + migrations_applied_for default && migrations_applied_for blobdb + else + migrations_applied_for default + fi +} + +if ! migrations_all_applied; then + echo "Unapplied migrations found, waiting to start..." + sleep 5 + while ! migrations_all_applied ; do + echo "... still waiting for migrations..." + sleep 5 + done +fi + +echo "Starting Datatracker..." + +# trap TERM and shut down gunicorn +cleanup () { + if [[ -n "${gunicorn_pid}" ]]; then + echo "Terminating gunicorn..." + kill -TERM "${gunicorn_pid}" + wait "${gunicorn_pid}" + fi +} + +trap 'trap "" TERM; cleanup' TERM + +# start gunicorn in the background so we can trap the TERM signal +gunicorn \ + -c /workspace/gunicorn.conf.py \ + --workers "${DATATRACKER_GUNICORN_WORKERS:-9}" \ + --max-requests "${DATATRACKER_GUNICORN_MAX_REQUESTS:-32768}" \ + --timeout "${DATATRACKER_GUNICORN_TIMEOUT:-180}" \ + --bind :8000 \ + --log-level "${DATATRACKER_GUNICORN_LOG_LEVEL:-info}" \ + --capture-output \ + --access-logfile -\ + ${DATATRACKER_GUNICORN_EXTRA_ARGS} \ + ietf.wsgi:application & +gunicorn_pid=$! +wait "${gunicorn_pid}" diff --git a/dev/deploy/exclude-patterns.txt b/dev/build/exclude-patterns.txt similarity index 100% rename from dev/deploy/exclude-patterns.txt rename to dev/build/exclude-patterns.txt diff --git a/dev/build/gunicorn.conf.py b/dev/build/gunicorn.conf.py new file mode 100644 index 00000000000..c54b24a0546 --- /dev/null +++ b/dev/build/gunicorn.conf.py @@ -0,0 +1,155 @@ +# Copyright The IETF Trust 2024-2025, All Rights Reserved + +import os +import ietf +from opentelemetry import trace +from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter +from opentelemetry.sdk.resources import Resource +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.instrumentation.django import DjangoInstrumentor +from opentelemetry.instrumentation.psycopg2 import Psycopg2Instrumentor +from opentelemetry.instrumentation.pymemcache import PymemcacheInstrumentor +from opentelemetry.instrumentation.requests import RequestsInstrumentor + +# Configure security scheme headers for forwarded requests. Cloudflare sets X-Forwarded-Proto +# for us. Don't trust any of the other similar headers. Only trust the header if it's coming +# from localhost, as all legitimate traffic will reach gunicorn via co-located nginx. +secure_scheme_headers = {"X-FORWARDED-PROTO": "https"} +forwarded_allow_ips = "127.0.0.1, ::1" # this is the default + +# Log as JSON on stdout (to distinguish from Django's logs on stderr) +# +# This is applied as an update to gunicorn's glogging.CONFIG_DEFAULTS. +logconfig_dict = { + "version": 1, + "disable_existing_loggers": False, + "root": {"level": "INFO", "handlers": ["console"]}, + "loggers": { + "gunicorn.error": { + "level": "INFO", + "handlers": ["console"], + "propagate": False, + "qualname": "gunicorn.error", + }, + "gunicorn.access": { + "level": "INFO", + "handlers": ["access_console"], + "propagate": False, + "qualname": "gunicorn.access", + }, + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "formatter": "json", + "stream": "ext://sys.stdout", + }, + "access_console": { + "class": "logging.StreamHandler", + "formatter": "access_json", + "stream": "ext://sys.stdout", + }, + }, + "formatters": { + "json": { + "class": "ietf.utils.jsonlogger.DatatrackerJsonFormatter", + "style": "{", + "format": "{asctime}{levelname}{message}{name}{process}", + }, + "access_json": { + "class": "ietf.utils.jsonlogger.GunicornRequestJsonFormatter", + "style": "{", + "format": "{asctime}{levelname}{message}{name}{process}", + }, + }, +} + +# Track in-flight requests and emit a list of what was happeningwhen a worker is terminated. +# For the default sync worker, there will only be one request per PID, but allow for the +# possibility of multiple requests in case we switch to a different worker class. +# +# This dict is only visible within a single worker, but key by pid to guarantee no conflicts. +# +# Use a list rather than a set to allow for the possibility of overlapping identical requests. +in_flight_by_pid: dict[str, list[str]] = {} # pid -> list of in-flight requests + + +def _describe_request(req): + """Generate a consistent description of a request + + The return value is used identify in-flight requests, so it must not vary between the + start and end of handling a request. E.g., do not include a timestamp. + """ + client_ip = "-" + asn = "-" + cf_ray = "-" + for header, value in req.headers: + header = header.lower() + if header == "cf-connecting-ip": + client_ip = value + elif header == "x-ip-src-asnum": + asn = value + elif header == "cf-ray": + cf_ray = value + if req.query: + path = f"{req.path}?{req.query}" + else: + path = req.path + return f"{req.method} {path} (client_ip={client_ip}, asn={asn}, cf_ray={cf_ray})" + + +def pre_request(worker, req): + """Log the start of a request and add it to the in-flight list""" + request_description = _describe_request(req) + worker.log.info(f"gunicorn starting to process {request_description}") + in_flight = in_flight_by_pid.setdefault(worker.pid, []) + in_flight.append(request_description) + + +def worker_abort(worker): + """Emit an error log if any requests were in-flight""" + in_flight = in_flight_by_pid.get(worker.pid, []) + if len(in_flight) > 0: + worker.log.error( + f"Aborted worker {worker.pid} with in-flight requests: {', '.join(in_flight)}" + ) + + +def worker_int(worker): + """Emit an error log if any requests were in-flight""" + in_flight = in_flight_by_pid.get(worker.pid, []) + if len(in_flight) > 0: + worker.log.error( + f"Interrupted worker {worker.pid} with in-flight requests: {', '.join(in_flight)}" + ) + + +def post_request(worker, req, environ, resp): + """Remove request from in-flight list when we finish handling it""" + request_description = _describe_request(req) + in_flight = in_flight_by_pid.get(worker.pid, []) + if request_description in in_flight: + in_flight.remove(request_description) + +def post_fork(server, worker): + server.log.info("Worker spawned (pid: %s)", worker.pid) + + resource = Resource.create(attributes={ + "service.name": "datatracker", + "service.version": ietf.__version__, + "service.instance.id": worker.pid, + "service.namespace": "datatracker", + "deployment.environment.name": os.environ.get("DATATRACKER_SERVICE_ENV", "dev") + }) + + trace.set_tracer_provider(TracerProvider(resource=resource)) + otlp_exporter = OTLPSpanExporter(endpoint="https://heimdall-otlp.ietf.org/v1/traces") + + trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(otlp_exporter)) + + # Instrumentations + DjangoInstrumentor().instrument() + Psycopg2Instrumentor().instrument() + PymemcacheInstrumentor().instrument() + RequestsInstrumentor().instrument() diff --git a/dev/build/migration-start.sh b/dev/build/migration-start.sh new file mode 100644 index 00000000000..901026e53b5 --- /dev/null +++ b/dev/build/migration-start.sh @@ -0,0 +1,9 @@ +#!/bin/bash -e + +echo "Running Datatracker migrations..." +./ietf/manage.py migrate --settings=settings_local + +echo "Running Blobdb migrations ..." +./ietf/manage.py migrate --settings=settings_local --database=blobdb + +echo "Done!" diff --git a/dev/build/settings_local_collectstatics.py b/dev/build/settings_local_collectstatics.py new file mode 100644 index 00000000000..ccb4b33979e --- /dev/null +++ b/dev/build/settings_local_collectstatics.py @@ -0,0 +1,8 @@ +# Copyright The IETF Trust 2007-2019, All Rights Reserved +# -*- coding: utf-8 -*- + +from ietf import __version__ +from ietf.settings import * # pyflakes:ignore + +STATIC_URL = "https://static.ietf.org/dt/%s/"%__version__ +STATIC_ROOT = os.path.abspath(BASE_DIR + "/../static/") diff --git a/dev/build/start.sh b/dev/build/start.sh new file mode 100644 index 00000000000..3b036370685 --- /dev/null +++ b/dev/build/start.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# +# Environment config: +# +# CONTAINER_ROLE - datatracker, celery, beat, migrations, or replicator (defaults to datatracker) +# +case "${CONTAINER_ROLE:-datatracker}" in + auth) + exec ./datatracker-start.sh + ;; + beat) + exec ./celery-start.sh --app=ietf beat + ;; + celery) + exec ./celery-start.sh --app=ietf worker + ;; + datatracker) + exec ./datatracker-start.sh + ;; + migrations) + exec ./migration-start.sh + ;; + replicator) + exec ./celery-start.sh --app=ietf worker --queues=blobdb --concurrency=1 + ;; + *) + echo "Unknown role '${CONTAINER_ROLE}'" + exit 255 +esac diff --git a/dev/celery/Dockerfile b/dev/celery/Dockerfile index 91f2949a6b0..e69de29bb2d 100644 --- a/dev/celery/Dockerfile +++ b/dev/celery/Dockerfile @@ -1,20 +0,0 @@ -# Dockerfile for celery worker -# -FROM ghcr.io/ietf-tools/datatracker-app-base:latest -LABEL maintainer="IETF Tools Team " - -ENV DEBIAN_FRONTEND=noninteractive - -RUN apt-get purge -y imagemagick imagemagick-6-common - -# Copy the startup file -COPY dev/celery/docker-init.sh /docker-init.sh -RUN sed -i 's/\r$//' /docker-init.sh && \ - chmod +x /docker-init.sh - -# Install current datatracker python dependencies -COPY requirements.txt /tmp/pip-tmp/ -RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt -RUN rm -rf /tmp/pip-tmp - -ENTRYPOINT [ "/docker-init.sh" ] \ No newline at end of file diff --git a/dev/celery/docker-init.sh b/dev/celery/docker-init.sh deleted file mode 100755 index 79671bba81d..00000000000 --- a/dev/celery/docker-init.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -e -# -# Environment parameters: -# -# CELERY_APP - name of application to pass to celery (defaults to ietf) -# -# CELERY_ROLE - 'worker' or 'beat' (defaults to 'worker') -# -# CELERY_UID - numeric uid for the celery worker process -# -# CELERY_GID - numeric gid for the celery worker process -# -# UPDATES_REQUIREMENTS_FROM - path, relative to /workspace mount, to a pip requirements -# file that should be installed at container startup. Default is no package install/update. -# -# DEBUG_TERM_TIMING - if non-empty, writes debug messages during shutdown after a TERM signal -# -WORKSPACEDIR="/workspace" -CELERY_ROLE="${CELERY_ROLE:-worker}" - -cd "$WORKSPACEDIR" || exit 255 - -if [[ -n "${UPDATE_REQUIREMENTS_FROM}" ]]; then - # Need to run as root in the container for this - reqs_file="${WORKSPACEDIR}/${UPDATE_REQUIREMENTS_FROM}" - echo "Updating requirements from ${reqs_file}..." - pip install --upgrade -r "${reqs_file}" -fi - -CELERY_OPTS=( "${CELERY_ROLE}" ) -if [[ -n "${CELERY_UID}" ]]; then - # ensure that a user with the necessary UID exists in container - if ! id "${CELERY_UID}" ; then - adduser --system --uid "${CELERY_UID}" --no-create-home --disabled-login "celery-user-${CELERY_UID}" - fi - CELERY_OPTS+=("--uid=${CELERY_UID}") - CELERY_USERNAME="$(id -nu ${CELERY_UID})" -fi - -if [[ -n "${CELERY_GID}" ]]; then - # ensure that some group with the necessary GID exists in container - if ! getent group "${CELERY_GID}" ; then - addgroup --gid "${CELERY_GID}" "celery-group-${CELERY_GID}" - fi - CELERY_OPTS+=("--gid=${CELERY_GID}") - CELERY_GROUP="$(getent group ${CELERY_GID} | awk -F: '{print $1}')" -fi - -run_as_celery_uid () { - SU_OPTS=() - if [[ -n "${CELERY_GROUP}" ]]; then - SU_OPTS+=("-g" "${CELERY_GROUP}") - fi - su "${SU_OPTS[@]}" "${CELERY_USERNAME:-root}" -s /bin/sh -c "$@" -} - -log_term_timing_msgs () { - # output periodic debug message - while true; do - echo "Waiting for celery worker shutdown ($(date --utc --iso-8601=ns))" - sleep 0.5s - done -} - -cleanup () { - # Cleanly terminate the celery app by sending it a TERM, then waiting for it to exit. - if [[ -n "${celery_pid}" ]]; then - echo "Gracefully terminating celery worker. This may take a few minutes if tasks are in progress..." - kill -TERM "${celery_pid}" - if [[ -n "${DEBUG_TERM_TIMING}" ]]; then - log_term_timing_msgs & - fi - wait "${celery_pid}" - fi -} - -echo "Running checks as root to apply patches..." -/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py check - -if [[ "${CELERY_ROLE}" == "worker" ]]; then - echo "Running initial checks..." - # Run checks as celery worker if one was specified - run_as_celery_uid /usr/local/bin/python $WORKSPACEDIR/ietf/manage.py check -fi - -trap 'trap "" TERM; cleanup' TERM -# start celery in the background so we can trap the TERM signal -celery --app="${CELERY_APP:-ietf}" "${CELERY_OPTS[@]}" "$@" & -celery_pid=$! -wait "${celery_pid}" diff --git a/dev/coverage-action/action.yml b/dev/coverage-action/action.yml index b8d732a5344..60c8de2d92d 100644 --- a/dev/coverage-action/action.yml +++ b/dev/coverage-action/action.yml @@ -35,7 +35,7 @@ outputs: changelog: description: Changelog with headers prepended and coverage stats + chart appended runs: - using: 'node16' + using: 'node20' main: 'index.js' branding: icon: layers diff --git a/dev/coverage-action/index.js b/dev/coverage-action/index.js index 57249bfdb17..5a1c690be3c 100644 --- a/dev/coverage-action/index.js +++ b/dev/coverage-action/index.js @@ -5,20 +5,20 @@ const find = require('lodash/find') const round = require('lodash/round') const fs = require('fs/promises') const { DateTime } = require('luxon') -const isPlainObject = require('lodash/isPlainObject') +// const isPlainObject = require('lodash/isPlainObject') const dec = new TextDecoder() async function main () { const token = core.getInput('token') - const tokenCommon = core.getInput('tokenCommon') + // const tokenCommon = core.getInput('tokenCommon') const inputCovPath = core.getInput('coverageResultsPath') // 'data/coverage-raw.json' const outputCovPath = core.getInput('coverageResultsPath') // 'data/coverage.json' const outputHistPath = core.getInput('histCoveragePath') // 'data/historical-coverage.json' const relVersionRaw = core.getInput('version') // 'v7.47.0' const relVersion = relVersionRaw.indexOf('v') === 0 ? relVersionRaw.substring(1) : relVersionRaw const gh = github.getOctokit(token) - const ghCommon = github.getOctokit(tokenCommon) + // const ghCommon = github.getOctokit(tokenCommon) const owner = github.context.repo.owner // 'ietf-tools' const repo = github.context.repo.repo // 'datatracker' const sender = github.context.payload.sender.login // 'rjsparks' @@ -116,137 +116,137 @@ async function main () { } // -> Coverage Chart - if (chartsDirListing.some(c => c.name === `${newRelease.id}.svg`)) { - console.info(`Chart SVG already exists for ${newRelease.name}, skipping...`) - } else { - console.info(`Generating chart SVG for ${newRelease.name}...`) + // if (chartsDirListing.some(c => c.name === `${newRelease.id}.svg`)) { + // console.info(`Chart SVG already exists for ${newRelease.name}, skipping...`) + // } else { + // console.info(`Generating chart SVG for ${newRelease.name}...`) - const { ChartJSNodeCanvas } = require('chartjs-node-canvas') - const chartJSNodeCanvas = new ChartJSNodeCanvas({ type: 'svg', width: 850, height: 300, backgroundColour: '#FFFFFF' }) + // const { ChartJSNodeCanvas } = require('chartjs-node-canvas') + // const chartJSNodeCanvas = new ChartJSNodeCanvas({ type: 'svg', width: 850, height: 300, backgroundColour: '#FFFFFF' }) - // -> Reorder versions - const versions = [] - for (const [key, value] of Object.entries(covData)) { - if (isPlainObject(value)) { - const vRel = find(releases, r => r.tag_name === key || r.tag_name === `v${key}`) - if (!vRel) { - continue - } - versions.push({ - tag: key, - time: vRel.created_at, - stats: { - code: round(value.code * 100, 2), - template: round(value.template * 100, 2), - url: round(value.url * 100, 2) - } - }) - } - } - const roVersions = orderBy(versions, ['time', 'tag'], ['asc', 'asc']) + // // -> Reorder versions + // const versions = [] + // for (const [key, value] of Object.entries(covData)) { + // if (isPlainObject(value)) { + // const vRel = find(releases, r => r.tag_name === key || r.tag_name === `v${key}`) + // if (!vRel) { + // continue + // } + // versions.push({ + // tag: key, + // time: vRel.created_at, + // stats: { + // code: round(value.code * 100, 2), + // template: round(value.template * 100, 2), + // url: round(value.url * 100, 2) + // } + // }) + // } + // } + // const roVersions = orderBy(versions, ['time', 'tag'], ['asc', 'asc']) - // -> Fill axis + data points - const labels = [] - const datasetCode = [] - const datasetTemplate = [] - const datasetUrl = [] + // // -> Fill axis + data points + // const labels = [] + // const datasetCode = [] + // const datasetTemplate = [] + // const datasetUrl = [] - for (const ver of roVersions) { - labels.push(ver.tag) - datasetCode.push(ver.stats.code) - datasetTemplate.push(ver.stats.template) - datasetUrl.push(ver.stats.url) - } + // for (const ver of roVersions) { + // labels.push(ver.tag) + // datasetCode.push(ver.stats.code) + // datasetTemplate.push(ver.stats.template) + // datasetUrl.push(ver.stats.url) + // } - // -> Generate chart SVG - const outputStream = chartJSNodeCanvas.renderToBufferSync({ - type: 'line', - options: { - borderColor: '#CCC', - layout: { - padding: 20 - }, - plugins: { - legend: { - position: 'bottom', - labels: { - font: { - size: 11 - } - } - } - }, - scales: { - x: { - ticks: { - font: { - size: 10 - } - } - }, - y: { - ticks: { - callback: (value) => { - return `${value}%` - }, - font: { - size: 10 - } - } - } - } - }, - data: { - labels, - datasets: [ - { - label: 'Code', - data: datasetCode, - borderWidth: 2, - borderColor: '#E53935', - backgroundColor: '#C6282833', - fill: false, - cubicInterpolationMode: 'monotone', - tension: 0.4, - pointRadius: 0 - }, - { - label: 'Templates', - data: datasetTemplate, - borderWidth: 2, - borderColor: '#039BE5', - backgroundColor: '#0277BD33', - fill: false, - cubicInterpolationMode: 'monotone', - tension: 0.4, - pointRadius: 0 - }, - { - label: 'URLs', - data: datasetUrl, - borderWidth: 2, - borderColor: '#7CB342', - backgroundColor: '#558B2F33', - fill: false, - cubicInterpolationMode: 'monotone', - tension: 0.4, - pointRadius: 0 - } - ] - } - }, 'image/svg+xml') - const svg = Buffer.from(outputStream).toString('base64') + // // -> Generate chart SVG + // const outputStream = chartJSNodeCanvas.renderToBufferSync({ + // type: 'line', + // options: { + // borderColor: '#CCC', + // layout: { + // padding: 20 + // }, + // plugins: { + // legend: { + // position: 'bottom', + // labels: { + // font: { + // size: 11 + // } + // } + // } + // }, + // scales: { + // x: { + // ticks: { + // font: { + // size: 10 + // } + // } + // }, + // y: { + // ticks: { + // callback: (value) => { + // return `${value}%` + // }, + // font: { + // size: 10 + // } + // } + // } + // } + // }, + // data: { + // labels, + // datasets: [ + // { + // label: 'Code', + // data: datasetCode, + // borderWidth: 2, + // borderColor: '#E53935', + // backgroundColor: '#C6282833', + // fill: false, + // cubicInterpolationMode: 'monotone', + // tension: 0.4, + // pointRadius: 0 + // }, + // { + // label: 'Templates', + // data: datasetTemplate, + // borderWidth: 2, + // borderColor: '#039BE5', + // backgroundColor: '#0277BD33', + // fill: false, + // cubicInterpolationMode: 'monotone', + // tension: 0.4, + // pointRadius: 0 + // }, + // { + // label: 'URLs', + // data: datasetUrl, + // borderWidth: 2, + // borderColor: '#7CB342', + // backgroundColor: '#558B2F33', + // fill: false, + // cubicInterpolationMode: 'monotone', + // tension: 0.4, + // pointRadius: 0 + // } + // ] + // } + // }, 'image/svg+xml') + // const svg = Buffer.from(outputStream).toString('base64') - // -> Upload to common repo - console.info(`Uploading chart SVG for ${newRelease.name}...`) - await ghCommon.rest.repos.createOrUpdateFileContents({ - owner, - repo: repoCommon, - path: `assets/graphs/datatracker/${newRelease.id}.svg`, - message: `chore: update datatracker release chart for release ${newRelease.name}`, - content: svg - }) - } + // // -> Upload to common repo + // console.info(`Uploading chart SVG for ${newRelease.name}...`) + // await ghCommon.rest.repos.createOrUpdateFileContents({ + // owner, + // repo: repoCommon, + // path: `assets/graphs/datatracker/${newRelease.id}.svg`, + // message: `chore: update datatracker release chart for release ${newRelease.name}`, + // content: svg + // }) + // } // -> Add to changelog body let formattedBody = '' @@ -265,7 +265,7 @@ async function main () { formattedBody += `![](https://img.shields.io/badge/Code-${covInfo.code}%25-${getCoverageColor(covInfo.code)}?style=flat-square)` formattedBody += `![](https://img.shields.io/badge/Templates-${covInfo.template}%25-${getCoverageColor(covInfo.template)}?style=flat-square)` formattedBody += `![](https://img.shields.io/badge/URLs-${covInfo.url}%25-${getCoverageColor(covInfo.url)}?style=flat-square)\n\n` - formattedBody += `![chart](https://raw.githubusercontent.com/${owner}/${repoCommon}/main/assets/graphs/datatracker/${newRelease.id}.svg)` + // formattedBody += `![chart](https://raw.githubusercontent.com/${owner}/${repoCommon}/main/assets/graphs/datatracker/${newRelease.id}.svg)` core.setOutput('changelog', formattedBody) } diff --git a/dev/coverage-action/package-lock.json b/dev/coverage-action/package-lock.json index 15feb073eb9..09570ee0e4b 100644 --- a/dev/coverage-action/package-lock.json +++ b/dev/coverage-action/package-lock.json @@ -9,10553 +9,510 @@ "version": "1.0.0", "license": "BSD-3-Clause", "dependencies": { - "@actions/core": "1.10.0", - "@actions/github": "5.1.1", - "chart.js": "3.5.1", - "chartjs-node-canvas": "4.1.6", + "@actions/core": "1.11.1", + "@actions/github": "6.0.1", "lodash": "4.17.21", - "luxon": "3.3.0" - }, - "devDependencies": { - "eslint": "8.39.0", - "eslint-config-standard": "17.0.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "6.1.1", - "npm-check-updates": "16.10.8" + "luxon": "3.7.1" } }, "node_modules/@actions/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", - "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", + "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", + "dependencies": { + "@actions/exec": "^1.1.1", + "@actions/http-client": "^2.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" + "@actions/io": "^1.0.1" } }, "node_modules/@actions/github": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz", - "integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.1.tgz", + "integrity": "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==", + "license": "MIT", "dependencies": { - "@actions/http-client": "^2.0.1", - "@octokit/core": "^3.6.0", - "@octokit/plugin-paginate-rest": "^2.17.0", - "@octokit/plugin-rest-endpoint-methods": "^5.13.0" + "@actions/http-client": "^2.2.0", + "@octokit/core": "^5.0.1", + "@octokit/plugin-paginate-rest": "^9.2.2", + "@octokit/plugin-rest-endpoint-methods": "^10.4.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "undici": "^5.28.5" } }, "node_modules/@actions/http-client": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.0.tgz", - "integrity": "sha512-BonhODnXr3amchh4qkmjPMUO8mFi/zLaaCeCAJZqch8iQqyDnVIkySjB38VHAC8IJ+bnlgfOqlhpyCUZHlQsqw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", + "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", "dependencies": { - "tunnel": "^0.0.6" + "tunnel": "^0.0.6", + "undici": "^5.25.4" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, + "node_modules/@actions/io": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", + "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==" + }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", "engines": { - "node": ">=0.1.90" + "node": ">=14" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">= 18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", - "dev": true, + "node_modules/@octokit/core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz", + "integrity": "sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 18" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, + "node_modules/@octokit/endpoint": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 18" } }, - "node_modules/@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", - "dev": true, + "node_modules/@octokit/graphql": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "license": "MIT", + "dependencies": { + "@octokit/request": "^8.4.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 18" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "license": "MIT" }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", + "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@octokit/types": "^12.6.0" }, "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" + "node": ">= 18" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "@octokit/core": "5" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "license": "MIT" }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", "dependencies": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "@octokit/openapi-types": "^20.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", + "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@octokit/types": "^12.6.0" }, "engines": { - "node": ">= 8" + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "license": "MIT" }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "@octokit/openapi-types": "^20.0.0" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" + "node_modules/@octokit/request": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 18" } }, - "node_modules/@npmcli/git": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.3.tgz", - "integrity": "sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA==", - "dev": true, + "node_modules/@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" + "node": ">= 18" } }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", - "dev": true, + "node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@octokit/openapi-types": "^24.2.0" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "license": "Apache-2.0" }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "license": "ISC" }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, + "node_modules/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", - "dev": true, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "wrappy": "1" } }, - "node_modules/@npmcli/run-script": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", - "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", - "dev": true, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "@fastify/busboy": "^2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14.0" } }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dependencies": { - "@octokit/types": "^6.0.3" + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "license": "ISC" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + } + }, + "dependencies": { + "@actions/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", + "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", + "requires": { + "@actions/exec": "^1.1.1", + "@actions/http-client": "^2.0.1" } }, - "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "requires": { + "@actions/io": "^1.0.1" } }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@actions/github": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.1.tgz", + "integrity": "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==", + "requires": { + "@actions/http-client": "^2.2.0", + "@octokit/core": "^5.0.1", + "@octokit/plugin-paginate-rest": "^9.2.2", + "@octokit/plugin-rest-endpoint-methods": "^10.4.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "undici": "^5.28.5" } }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" + "@actions/http-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", + "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", + "requires": { + "tunnel": "^0.0.6", + "undici": "^5.25.4" } }, - "node_modules/@octokit/openapi-types": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", - "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==" + "@actions/io": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", + "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==" }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", - "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", - "dependencies": { - "@octokit/types": "^6.34.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } + "@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==" }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", - "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", - "dependencies": { - "@octokit/types": "^6.34.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } + "@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==" }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", + "@octokit/core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz", + "integrity": "sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==", + "requires": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" } }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@octokit/endpoint": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "requires": { + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" } }, - "node_modules/@octokit/types": { - "version": "6.34.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", - "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", - "dependencies": { - "@octokit/openapi-types": "^11.2.0" + "@octokit/graphql": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "requires": { + "@octokit/request": "^8.4.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz", - "integrity": "sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" + "@octokit/plugin-paginate-rest": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", + "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", + "requires": { + "@octokit/types": "^12.6.0" }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.0.tgz", - "integrity": "sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw==", - "dev": true, "dependencies": { - "@pnpm/config.env-replace": "^1.0.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" + }, + "@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "requires": { + "@octokit/openapi-types": "^20.0.0" + } + } } }, - "node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true, - "engines": { - "node": ">=14.16" + "@octokit/plugin-rest-endpoint-methods": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", + "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", + "requires": { + "@octokit/types": "^12.6.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" + "@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" + }, + "@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "requires": { + "@octokit/openapi-types": "^20.0.0" + } + } } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" + "@octokit/request": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "requires": { + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" } }, - "node_modules/@tufjs/models": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.0.tgz", - "integrity": "sha512-RRMu4uMxWnZlxaIBxahSb2IssFZiu188sndesZflWOe1cA/qUqtemSIoBWbuVKPvvdktapImWNnKpBcc+VrCQw==", - "dev": true, - "dependencies": { - "minimatch": "^6.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "requires": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" } }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "requires": { + "@octokit/openapi-types": "^24.2.0" } }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==" }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" + "undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "requires": { + "@fastify/busboy": "^2.0.0" } }, - "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" - }, - "node_modules/boxen": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.2.tgz", - "integrity": "sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/cacache": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", - "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^8.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/fs-minipass": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz", - "integrity": "sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==", - "dev": true, - "dependencies": { - "minipass": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", - "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/canvas": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.1.tgz", - "integrity": "sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.15.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.5.1.tgz", - "integrity": "sha512-m5kzt72I1WQ9LILwQC4syla/LD/N413RYv2Dx2nnTkRS9iv/ey1xLTt0DnPc/eWV4zI+BgEgDYBIzbQhZHc/PQ==" - }, - "node_modules/chartjs-node-canvas": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-4.1.6.tgz", - "integrity": "sha512-UQJbPWrvqB/FoLclGA9BaLQmZbzSYlujF4w8NZd6Xzb+sqgACBb2owDX6m7ifCXLjUW5Nz0Qx0qqrTtQkkSoYw==", - "dependencies": { - "canvas": "^2.8.0", - "tslib": "^2.3.1" - }, - "peerDependencies": { - "chart.js": "^3.5.1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", - "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", - "dev": true, - "peer": true, - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "peer": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-memoize": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/fp-and-or": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.3.tgz", - "integrity": "sha512-wJaE62fLaB3jCYvY2ZHjZvmKK2iiLiiehX38rz5QZxtdN8fVPJDeZUiVvJrHStdTc+23LHlyZuSEKgFc0pxi2g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", - "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.1.tgz", - "integrity": "sha512-/c8MxUAqpRccq+LyDOecwF+9KqajueJHh8fz7g3YqjMZt+NSfJzx05zrKiXwa2sKwFCzaiZ5qUVfRj0pmxixEA==", - "dev": true, - "dependencies": { - "minimatch": "^6.1.6" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.0.tgz", - "integrity": "sha512-HLR38RSF2iulAzc3I/sma4CoYxQP844rPYCNfzGDOHqa/YqVlwuuZgBx6M50/X8dKgzk0cm1qRg3+47mK2N+cQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", - "dev": true, - "dependencies": { - "jju": "^1.1.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", - "dev": true - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-check-updates": { - "version": "16.10.8", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.8.tgz", - "integrity": "sha512-e+p3rUCvaU0iKOvi+/Xiyx+mLe9/aRTu9Zrc7+TR6H2q+uFgmXEwqbXYN9Ngqsta8gdTjpn751UD5MEOogO5cA==", - "dev": true, - "dependencies": { - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "commander": "^10.0.0", - "fast-memoize": "^2.5.2", - "find-up": "5.0.0", - "fp-and-or": "^0.1.3", - "get-stdin": "^8.0.0", - "globby": "^11.0.4", - "hosted-git-info": "^5.1.0", - "ini": "^4.0.0", - "js-yaml": "^4.1.0", - "json-parse-helpfulerror": "^1.0.3", - "jsonlines": "^0.1.1", - "lodash": "^4.17.21", - "minimatch": "^8.0.3", - "p-map": "^4.0.0", - "pacote": "15.1.1", - "parse-github-url": "^1.0.2", - "progress": "^2.0.3", - "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.2", - "remote-git-tags": "^3.0.0", - "rimraf": "^4.4.1", - "semver": "^7.3.8", - "semver-utils": "^1.1.4", - "source-map-support": "^0.5.21", - "spawn-please": "^2.0.1", - "strip-json-comments": "^5.0.0", - "untildify": "^4.0.0", - "update-notifier": "^6.0.2" - }, - "bin": { - "ncu": "build/src/bin/cli.js", - "npm-check-updates": "build/src/bin/cli.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/npm-check-updates/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-check-updates/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-check-updates/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-install-checks": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.0.0.tgz", - "integrity": "sha512-SBU9oFglRVZnfElwAtF14NivyulDqF1VKqqwNsFW9HDcbHMAPHpRSsVFgKuwFGq/hVvWZExz62Th0kvxn/XE7Q==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", - "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz", - "integrity": "sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", - "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", - "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", - "dev": true, - "dependencies": { - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", - "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pacote": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.1.tgz", - "integrity": "sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ==", - "dev": true, - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/fs-minipass": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz", - "integrity": "sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==", - "dev": true, - "dependencies": { - "minipass": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", - "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", - "dev": true, - "dependencies": { - "lru-cache": "^9.0.0", - "minipass": "^5.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.3.tgz", - "integrity": "sha512-cyjNRew29d4kbgnz1sjDqxg7qg8NW4s+HQzCGjeon7DV5T2yDije16W9HaUFV1dhVEMh+SjrOcK0TomBmf3Egg==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", - "dev": true, - "dependencies": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc-config-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.2.tgz", - "integrity": "sha512-qKTnVWFl9OQYKATPzdfaZIbTxcHziQl92zYSxYC6umhOqyAsoj8H8Gq/+aFjAso68sBdjTz3A7omqeAkkF1MWg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, - "node_modules/rc-config-loader/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-package-json": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.0.tgz", - "integrity": "sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w==", - "dev": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/remote-git-tags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", - "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", - "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", - "dev": true - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sigstore": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.1.1.tgz", - "integrity": "sha512-4hR3tPP1y59YWlaoAgAWFVZ7srTjNWOrrpkQXWu05qP0BvwFYyt3K3l848+IHo+mKhkOzGcNDf7ktASXLEPC+A==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.0.0" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", - "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", - "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", - "dev": true, - "dependencies": { - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-please": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.1.tgz", - "integrity": "sha512-W+cFbZR2q2mMTfjz5ZGvhBAiX+e/zczFCNlbS9mxiSdYswBXwUuBUT+a0urH+xZZa8f/bs0mXHyZsZHR9hKogA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.1.tgz", - "integrity": "sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==", - "dev": true, - "dependencies": { - "minipass": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "node_modules/tuf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.1.tgz", - "integrity": "sha512-WTp382/PR96k0dI4GD5RdiRhgOU0rAC7+lnoih/5pZg3cyb3aNMqDozleEEWwyfT3+FOg7Qz9JU3n6A44tLSHw==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", - "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", - "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", - "dev": true, - "dependencies": { - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@actions/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", - "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==", - "requires": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "@actions/github": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz", - "integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==", - "requires": { - "@actions/http-client": "^2.0.1", - "@octokit/core": "^3.6.0", - "@octokit/plugin-paginate-rest": "^2.17.0", - "@octokit/plugin-rest-endpoint-methods": "^5.13.0" - } - }, - "@actions/http-client": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.0.tgz", - "integrity": "sha512-BonhODnXr3amchh4qkmjPMUO8mFi/zLaaCeCAJZqch8iQqyDnVIkySjB38VHAC8IJ+bnlgfOqlhpyCUZHlQsqw==", - "requires": { - "tunnel": "^0.0.6" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", - "dev": true - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", - "requires": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.3.tgz", - "integrity": "sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "requires": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true - }, - "@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "requires": { - "which": "^3.0.0" - }, - "dependencies": { - "which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@npmcli/run-script": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", - "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", - "dev": true, - "requires": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "dependencies": { - "which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "requires": { - "@octokit/types": "^6.0.3" - } - }, - "@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "requires": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", - "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==" - }, - "@octokit/plugin-paginate-rest": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", - "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", - "requires": { - "@octokit/types": "^6.34.0" - } - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", - "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", - "requires": { - "@octokit/types": "^6.34.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/types": { - "version": "6.34.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", - "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", - "requires": { - "@octokit/openapi-types": "^11.2.0" - } - }, - "@pnpm/config.env-replace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz", - "integrity": "sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA==", - "dev": true - }, - "@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "requires": { - "graceful-fs": "4.2.10" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - } - } - }, - "@pnpm/npm-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.0.tgz", - "integrity": "sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw==", - "dev": true, - "requires": { - "@pnpm/config.env-replace": "^1.0.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", - "dev": true - }, - "@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@tufjs/models": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.0.tgz", - "integrity": "sha512-RRMu4uMxWnZlxaIBxahSb2IssFZiu188sndesZflWOe1cA/qUqtemSIoBWbuVKPvvdktapImWNnKpBcc+VrCQw==", - "dev": true, - "requires": { - "minimatch": "^6.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" - }, - "boxen": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.2.tgz", - "integrity": "sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==", - "dev": true, - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", - "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", - "dev": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^8.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "fs-minipass": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz", - "integrity": "sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==", - "dev": true, - "requires": { - "minipass": "^4.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - } - } - }, - "cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true - }, - "cacheable-request": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", - "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "dependencies": { - "mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true - }, - "canvas": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.1.tgz", - "integrity": "sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.15.0", - "simple-get": "^3.0.3" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chart.js": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.5.1.tgz", - "integrity": "sha512-m5kzt72I1WQ9LILwQC4syla/LD/N413RYv2Dx2nnTkRS9iv/ey1xLTt0DnPc/eWV4zI+BgEgDYBIzbQhZHc/PQ==" - }, - "chartjs-node-canvas": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-4.1.6.tgz", - "integrity": "sha512-UQJbPWrvqB/FoLclGA9BaLQmZbzSYlujF4w8NZd6Xzb+sqgACBb2owDX6m7ifCXLjUW5Nz0Qx0qqrTtQkkSoYw==", - "requires": { - "canvas": "^2.8.0", - "tslib": "^2.3.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - } - } - }, - "configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "requires": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "eslint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", - "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - } - }, - "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", - "dev": true, - "peer": true, - "requires": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "dependencies": { - "eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "peer": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "peer": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "peer": true - } - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "peer": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "peer": true - } - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, - "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-memoize": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true - }, - "fp-and-or": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.3.tgz", - "integrity": "sha512-wJaE62fLaB3jCYvY2ZHjZvmKK2iiLiiehX38rz5QZxtdN8fVPJDeZUiVvJrHStdTc+23LHlyZuSEKgFc0pxi2g==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "got": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", - "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", - "dev": true, - "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true - }, - "hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "ignore-walk": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.1.tgz", - "integrity": "sha512-/c8MxUAqpRccq+LyDOecwF+9KqajueJHh8fz7g3YqjMZt+NSfJzx05zrKiXwa2sKwFCzaiZ5qUVfRj0pmxixEA==", - "dev": true, - "requires": { - "minimatch": "^6.1.6" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.0.tgz", - "integrity": "sha512-HLR38RSF2iulAzc3I/sma4CoYxQP844rPYCNfzGDOHqa/YqVlwuuZgBx6M50/X8dKgzk0cm1qRg3+47mK2N+cQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true - }, - "json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", - "dev": true, - "requires": { - "jju": "^1.1.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "requires": { - "package-json": "^8.1.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "dependencies": { - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "dependencies": { - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true - }, - "npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^3.0.0" - } - }, - "npm-check-updates": { - "version": "16.10.8", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.8.tgz", - "integrity": "sha512-e+p3rUCvaU0iKOvi+/Xiyx+mLe9/aRTu9Zrc7+TR6H2q+uFgmXEwqbXYN9Ngqsta8gdTjpn751UD5MEOogO5cA==", - "dev": true, - "requires": { - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "commander": "^10.0.0", - "fast-memoize": "^2.5.2", - "find-up": "5.0.0", - "fp-and-or": "^0.1.3", - "get-stdin": "^8.0.0", - "globby": "^11.0.4", - "hosted-git-info": "^5.1.0", - "ini": "^4.0.0", - "js-yaml": "^4.1.0", - "json-parse-helpfulerror": "^1.0.3", - "jsonlines": "^0.1.1", - "lodash": "^4.17.21", - "minimatch": "^8.0.3", - "p-map": "^4.0.0", - "pacote": "15.1.1", - "parse-github-url": "^1.0.2", - "progress": "^2.0.3", - "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.2", - "remote-git-tags": "^3.0.0", - "rimraf": "^4.4.1", - "semver": "^7.3.8", - "semver-utils": "^1.1.4", - "source-map-support": "^0.5.21", - "spawn-please": "^2.0.1", - "strip-json-comments": "^5.0.0", - "untildify": "^4.0.0", - "update-notifier": "^6.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - }, - "glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - } - }, - "minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true - }, - "rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "requires": { - "glob": "^9.2.0" - } - }, - "strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", - "dev": true - } - } - }, - "npm-install-checks": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.0.0.tgz", - "integrity": "sha512-SBU9oFglRVZnfElwAtF14NivyulDqF1VKqqwNsFW9HDcbHMAPHpRSsVFgKuwFGq/hVvWZExz62Th0kvxn/XE7Q==", - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", - "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", - "dev": true - }, - "npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, - "npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dev": true, - "requires": { - "ignore-walk": "^6.0.0" - } - }, - "npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", - "dev": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - } - }, - "npm-registry-fetch": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz", - "integrity": "sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA==", - "dev": true, - "requires": { - "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-fetch-happen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", - "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - }, - "minipass-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", - "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - } - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", - "dev": true, - "requires": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - } - }, - "pacote": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.1.tgz", - "integrity": "sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ==", - "dev": true, - "requires": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "dependencies": { - "fs-minipass": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz", - "integrity": "sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==", - "dev": true, - "requires": { - "minipass": "^4.0.0" - } - }, - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-scurry": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", - "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", - "dev": true, - "requires": { - "lru-cache": "^9.0.0", - "minipass": "^5.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.0.3.tgz", - "integrity": "sha512-cyjNRew29d4kbgnz1sjDqxg7qg8NW4s+HQzCGjeon7DV5T2yDije16W9HaUFV1dhVEMh+SjrOcK0TomBmf3Egg==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - } - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", - "dev": true, - "requires": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "requires": { - "escape-goat": "^4.0.0" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, - "rc-config-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.2.tgz", - "integrity": "sha512-qKTnVWFl9OQYKATPzdfaZIbTxcHziQl92zYSxYC6umhOqyAsoj8H8Gq/+aFjAso68sBdjTz3A7omqeAkkF1MWg==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - }, - "dependencies": { - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - } - } - }, - "read-package-json": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.0.tgz", - "integrity": "sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w==", - "dev": true, - "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "requires": { - "@pnpm/npm-conf": "^2.1.0" - } - }, - "registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "remote-git-tags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", - "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "requires": { - "lowercase-keys": "^3.0.0" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "semver-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", - "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "sigstore": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.1.1.tgz", - "integrity": "sha512-4hR3tPP1y59YWlaoAgAWFVZ7srTjNWOrrpkQXWu05qP0BvwFYyt3K3l848+IHo+mKhkOzGcNDf7ktASXLEPC+A==", - "dev": true, - "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-fetch-happen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", - "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - }, - "minipass-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", - "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - } - } - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spawn-please": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.1.tgz", - "integrity": "sha512-W+cFbZR2q2mMTfjz5ZGvhBAiX+e/zczFCNlbS9mxiSdYswBXwUuBUT+a0urH+xZZa8f/bs0mXHyZsZHR9hKogA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3" - } - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "ssri": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.1.tgz", - "integrity": "sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==", - "dev": true, - "requires": { - "minipass": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "tuf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.1.tgz", - "integrity": "sha512-WTp382/PR96k0dI4GD5RdiRhgOU0rAC7+lnoih/5pZg3cyb3aNMqDozleEEWwyfT3+FOg7Qz9JU3n6A44tLSHw==", - "dev": true, - "requires": { - "@tufjs/models": "1.0.0", - "make-fetch-happen": "^11.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-fetch-happen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", - "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - }, - "minipass-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", - "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - } - } - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "requires": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "dependencies": { - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "requires": { - "string-width": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } + "universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" } } } diff --git a/dev/coverage-action/package.json b/dev/coverage-action/package.json index 05ceac94db1..3f72b78028c 100644 --- a/dev/coverage-action/package.json +++ b/dev/coverage-action/package.json @@ -6,19 +6,9 @@ "author": "IETF Trust", "license": "BSD-3-Clause", "dependencies": { - "@actions/core": "1.10.0", - "@actions/github": "5.1.1", - "chart.js": "3.5.1", - "chartjs-node-canvas": "4.1.6", + "@actions/core": "1.11.1", + "@actions/github": "6.0.1", "lodash": "4.17.21", - "luxon": "3.3.0" - }, - "devDependencies": { - "eslint": "8.39.0", - "eslint-config-standard": "17.0.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "6.1.1", - "npm-check-updates": "16.10.8" + "luxon": "3.7.1" } } diff --git a/dev/del-old-packages/index.js b/dev/del-old-packages/index.js index 927b2d37ae0..ff5ab649a2c 100644 --- a/dev/del-old-packages/index.js +++ b/dev/del-old-packages/index.js @@ -8,7 +8,7 @@ const octokit = new Octokit({ const oldestDate = DateTime.utc().minus({ days: 7 }) -for (const pkgName of ['datatracker-db', 'datatracker-db-pg']) { +for (const pkgName of ['datatracker-db']) { let hasMore = true let currentPage = 1 diff --git a/dev/del-old-packages/package-lock.json b/dev/del-old-packages/package-lock.json index f40c8036db3..9899b290fb8 100644 --- a/dev/del-old-packages/package-lock.json +++ b/dev/del-old-packages/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@octokit/core": "^4.2.0", - "luxon": "^3.3.0" + "@octokit/core": "^4.2.4", + "luxon": "^3.4.4" } }, "node_modules/@octokit/auth-token": { @@ -25,9 +25,9 @@ } }, "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", @@ -141,9 +141,9 @@ } }, "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } @@ -215,9 +215,9 @@ } }, "@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "requires": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", @@ -315,9 +315,9 @@ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" }, "luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==" + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==" }, "node-fetch": { "version": "2.6.7", diff --git a/dev/del-old-packages/package.json b/dev/del-old-packages/package.json index f141a4e115d..c0b57b7f7b7 100644 --- a/dev/del-old-packages/package.json +++ b/dev/del-old-packages/package.json @@ -10,7 +10,7 @@ "author": "", "license": "ISC", "dependencies": { - "@octokit/core": "^4.2.0", - "luxon": "^3.3.0" + "@octokit/core": "^4.2.4", + "luxon": "^3.4.4" } } diff --git a/dev/deploy-to-container/cli.js b/dev/deploy-to-container/cli.js index d0d4cef5482..1a2d993ac4b 100644 --- a/dev/deploy-to-container/cli.js +++ b/dev/deploy-to-container/cli.js @@ -3,7 +3,7 @@ import Docker from 'dockerode' import path from 'path' import fs from 'fs-extra' -import tar from 'tar' +import * as tar from 'tar' import yargs from 'yargs/yargs' import { hideBin } from 'yargs/helpers' import slugify from 'slugify' @@ -23,7 +23,7 @@ async function main () { throw new Error('Missing --branch argument!') } if (branch.indexOf('/') >= 0) { - branch = branch.split('/')[1] + branch = branch.split('/').slice(1).join('-') } branch = slugify(branch, { lower: true, strict: true }) if (branch.length < 1) { @@ -67,8 +67,10 @@ async function main () { .replace('__DBHOST__', `dt-db-${branch}`) .replace('__SECRETKEY__', nanoid(36)) .replace('__MQCONNSTR__', `amqp://datatracker:${mqKey}@dt-mq-${branch}/dt`) + .replace('__HOSTNAME__', hostname) ) await fs.copy(path.join(basePath, 'docker/scripts/app-create-dirs.sh'), path.join(releasePath, 'app-create-dirs.sh')) + await fs.copy(path.join(basePath, 'docker/scripts/app-init-celery.sh'), path.join(releasePath, 'app-init-celery.sh')) await fs.copy(path.join(basePath, 'dev/deploy-to-container/start.sh'), path.join(releasePath, 'start.sh')) await fs.copy(path.join(basePath, 'test/data'), path.join(releasePath, 'test/data')) console.info('Updated configuration files.') @@ -97,14 +99,6 @@ async function main () { }) console.info('Pulled latest MQ docker image.') - // Pull latest Celery image - console.info('Pulling latest Celery docker image...') - const celeryImagePullStream = await dock.pull('ghcr.io/ietf-tools/datatracker-celery:latest') - await new Promise((resolve, reject) => { - dock.modem.followProgress(celeryImagePullStream, (err, res) => err ? reject(err) : resolve(res)) - }) - console.info('Pulled latest Celery docker image.') - // Terminate existing containers console.info('Ensuring existing containers with same name are terminated...') const containers = await dock.listContainers({ all: true }) @@ -175,6 +169,9 @@ async function main () { Image: 'ghcr.io/ietf-tools/datatracker-db:latest', name: `dt-db-${branch}`, Hostname: `dt-db-${branch}`, + Labels: { + ...argv.nodbrefresh === 'true' && { nodbrefresh: '1' } + }, HostConfig: { NetworkMode: 'shared', RestartPolicy: { @@ -194,6 +191,9 @@ async function main () { Env: [ `CELERY_PASSWORD=${mqKey}` ], + Labels: { + ...argv.nodbrefresh === 'true' && { nodbrefresh: '1' } + }, HostConfig: { Memory: 4 * (1024 ** 3), // in bytes NetworkMode: 'shared', @@ -214,7 +214,7 @@ async function main () { const celeryContainers = {} for (const conConf of conConfs) { celeryContainers[conConf.name] = await dock.createContainer({ - Image: 'ghcr.io/ietf-tools/datatracker-celery:latest', + Image: 'ghcr.io/ietf-tools/datatracker-app-base:latest', name: `dt-${conConf.name}-${branch}`, Hostname: `dt-${conConf.name}-${branch}`, Env: [ @@ -222,6 +222,9 @@ async function main () { `CELERY_ROLE=${conConf.role}`, 'UPDATE_REQUIREMENTS_FROM=requirements.txt' ], + Labels: { + ...argv.nodbrefresh === 'true' && { nodbrefresh: '1' } + }, HostConfig: { Binds: [ 'dt-assets:/assets', @@ -233,7 +236,7 @@ async function main () { Name: 'unless-stopped' } }, - Cmd: ['--loglevel=INFO'] + Entrypoint: ['bash', '-c', 'chmod +x ./app-init-celery.sh && ./app-init-celery.sh'] }) } console.info('Created Celery docker containers successfully.') @@ -245,7 +248,7 @@ async function main () { name: `dt-app-${branch}`, Hostname: `dt-app-${branch}`, Env: [ - `LETSENCRYPT_HOST=${hostname}`, + // `LETSENCRYPT_HOST=${hostname}`, `VIRTUAL_HOST=${hostname}`, `VIRTUAL_PORT=8000`, `PGHOST=dt-db-${branch}` @@ -254,7 +257,8 @@ async function main () { appversion: `${argv.appversion}` ?? '0.0.0', commit: `${argv.commit}` ?? 'unknown', ghrunid: `${argv.ghrunid}` ?? '0', - hostname + hostname, + ...argv.nodbrefresh === 'true' && { nodbrefresh: '1' } }, HostConfig: { Binds: [ diff --git a/dev/deploy-to-container/package-lock.json b/dev/deploy-to-container/package-lock.json index 13c3680efce..0954ec9af47 100644 --- a/dev/deploy-to-container/package-lock.json +++ b/dev/deploy-to-container/package-lock.json @@ -6,12 +6,12 @@ "": { "name": "deploy-to-container", "dependencies": { - "dockerode": "^3.3.5", - "fs-extra": "^11.1.1", - "nanoid": "4.0.2", - "nanoid-dictionary": "5.0.0-beta.1", + "dockerode": "^4.0.6", + "fs-extra": "^11.3.0", + "nanoid": "5.1.5", + "nanoid-dictionary": "5.0.0", "slugify": "1.6.6", - "tar": "^6.1.14", + "tar": "^7.4.3", "yargs": "^17.7.2" }, "engines": { @@ -23,6 +23,215 @@ "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" }, + "node_modules/@grpc/grpc-js": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz", + "integrity": "sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@types/node": { + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -49,10 +258,16 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -70,20 +285,65 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buildcheck": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", - "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", "optional": true, "engines": { "node": ">=10.0.0" @@ -92,7 +352,8 @@ "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, "node_modules/cliui": { "version": "8.0.1", @@ -124,25 +385,39 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/cpu-features": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", - "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", "hasInstallScript": true, "optional": true, "dependencies": { - "buildcheck": "0.0.3", - "nan": "^2.15.0" + "buildcheck": "~0.0.6", + "nan": "^2.19.0" }, "engines": { "node": ">=10.0.0" } }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -154,32 +429,43 @@ } }, "node_modules/docker-modem": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.5.tgz", - "integrity": "sha512-x1E6jxWdtoK3+ifAUWj4w5egPdTDGBpesSCErm+aKET5BnnEOvDtTP6GxcnMB1zZiv2iQ0qJZvJie+1wfIRg6Q==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", + "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", + "license": "Apache-2.0", "dependencies": { "debug": "^4.1.1", "readable-stream": "^3.5.0", "split-ca": "^1.0.1", - "ssh2": "^1.4.0" + "ssh2": "^1.15.0" }, "engines": { "node": ">= 8.0" } }, "node_modules/dockerode": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.5.tgz", - "integrity": "sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.6.tgz", + "integrity": "sha512-FbVf3Z8fY/kALB9s+P9epCpWhfi/r0N2DgYYcYpsAUlaTxPjdsitsFobnltb+lyCgAIvf9C+4PSWlTnHlJMf1w==", + "license": "Apache-2.0", "dependencies": { "@balena/dockerignore": "^1.0.2", - "docker-modem": "^3.0.0", - "tar-fs": "~2.0.1" + "@grpc/grpc-js": "^1.11.1", + "@grpc/proto-loader": "^0.7.13", + "docker-modem": "^5.0.6", + "protobufjs": "^7.3.2", + "tar-fs": "~2.1.2", + "uuid": "^10.0.0" }, "engines": { "node": ">= 8.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -189,6 +475,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -201,15 +488,32 @@ "node": ">=6" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -219,17 +523,6 @@ "node": ">=14.14" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -238,6 +531,27 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -260,7 +574,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/inherits": { "version": "2.0.4", @@ -275,6 +590,28 @@ "node": ">=8" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -286,90 +623,175 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" + }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": ">= 8" + "node": ">= 18" } }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "bin": { - "mkdirp": "bin/cmd.js" + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT", "optional": true }, "node_modules/nanoid": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", - "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18 || >=20" } }, "node_modules/nanoid-dictionary": { - "version": "5.0.0-beta.1", - "resolved": "https://registry.npmjs.org/nanoid-dictionary/-/nanoid-dictionary-5.0.0-beta.1.tgz", - "integrity": "sha512-xBkL9zzkNjzJ/UnmWyiOUDVX/COoi05eS0oU28RYKFFQhdnzO5dTOPbVZ/fCFgIOGr1zNinDHJ68mm/KQfcgcw==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nanoid-dictionary/-/nanoid-dictionary-5.0.0.tgz", + "integrity": "sha512-/iCyQHwt36XkaIvSE9fcC8p6DiMPCZMTSMj9UT56Cv6T7f5CuxvOMhpNncaNieQ4z4d32p7ruEtAfRsb7Ya8Gw==", + "license": "MIT" }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -396,6 +818,23 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -418,7 +857,38 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/slugify": { "version": "1.6.6", @@ -431,23 +901,24 @@ "node_modules/split-ca": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", + "license": "ISC" }, "node_modules/ssh2": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", - "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", "hasInstallScript": true, "dependencies": { - "asn1": "^0.2.4", + "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2" }, "engines": { "node": ">=10.16.0" }, "optionalDependencies": { - "cpu-features": "~0.0.4", - "nan": "^2.16.0" + "cpu-features": "~0.0.10", + "nan": "^2.20.0" } }, "node_modules/string_decoder": { @@ -471,6 +942,20 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -482,37 +967,51 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/tar-fs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", - "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.0.0" + "tar-stream": "^2.1.4" } }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -524,59 +1023,24 @@ "node": ">=6" } }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/tar/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "node_modules/universalify": { "version": "2.0.0", @@ -591,6 +1055,32 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -607,10 +1097,28 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/y18n": { "version": "5.0.8", @@ -621,9 +1129,12 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "engines": { + "node": ">=18" + } }, "node_modules/yargs": { "version": "17.7.2", @@ -657,6 +1168,165 @@ "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" }, + "@grpc/grpc-js": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz", + "integrity": "sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==", + "requires": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + } + }, + "@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "requires": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "requires": { + "minipass": "^7.0.4" + } + }, + "@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==" + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@types/node": { + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "requires": { + "undici-types": "~6.20.0" + } + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -678,6 +1348,11 @@ "safer-buffer": "~2.1.0" } }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -691,10 +1366,37 @@ "tweetnacl": "^0.14.3" } }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buildcheck": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", - "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", "optional": true }, "chownr": { @@ -726,44 +1428,63 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "cpu-features": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", - "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", "optional": true, "requires": { - "buildcheck": "0.0.3", - "nan": "^2.15.0" + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "docker-modem": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.5.tgz", - "integrity": "sha512-x1E6jxWdtoK3+ifAUWj4w5egPdTDGBpesSCErm+aKET5BnnEOvDtTP6GxcnMB1zZiv2iQ0qJZvJie+1wfIRg6Q==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", + "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", "requires": { "debug": "^4.1.1", "readable-stream": "^3.5.0", "split-ca": "^1.0.1", - "ssh2": "^1.4.0" + "ssh2": "^1.15.0" } }, "dockerode": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.5.tgz", - "integrity": "sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.6.tgz", + "integrity": "sha512-FbVf3Z8fY/kALB9s+P9epCpWhfi/r0N2DgYYcYpsAUlaTxPjdsitsFobnltb+lyCgAIvf9C+4PSWlTnHlJMf1w==", "requires": { "@balena/dockerignore": "^1.0.2", - "docker-modem": "^3.0.0", - "tar-fs": "~2.0.1" + "@grpc/grpc-js": "^1.11.1", + "@grpc/proto-loader": "^0.7.13", + "docker-modem": "^5.0.6", + "protobufjs": "^7.3.2", + "tar-fs": "~2.1.2", + "uuid": "^10.0.0" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -782,34 +1503,47 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -830,6 +1564,20 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -839,27 +1587,47 @@ "universalify": "^2.0.0" } }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" + }, + "lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==" + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "requires": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" } }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" } }, "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" }, "mkdirp-classic": { "version": "0.5.3", @@ -867,25 +1635,25 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", "optional": true }, "nanoid": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", - "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==" + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==" }, "nanoid-dictionary": { - "version": "5.0.0-beta.1", - "resolved": "https://registry.npmjs.org/nanoid-dictionary/-/nanoid-dictionary-5.0.0-beta.1.tgz", - "integrity": "sha512-xBkL9zzkNjzJ/UnmWyiOUDVX/COoi05eS0oU28RYKFFQhdnzO5dTOPbVZ/fCFgIOGr1zNinDHJ68mm/KQfcgcw==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nanoid-dictionary/-/nanoid-dictionary-5.0.0.tgz", + "integrity": "sha512-/iCyQHwt36XkaIvSE9fcC8p6DiMPCZMTSMj9UT56Cv6T7f5CuxvOMhpNncaNieQ4z4d32p7ruEtAfRsb7Ya8Gw==" }, "once": { "version": "1.4.0", @@ -895,10 +1663,43 @@ "wrappy": "1" } }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + } + }, + "protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + } + }, "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -919,6 +1720,14 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, + "rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "requires": { + "glob": "^10.3.7" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -929,6 +1738,24 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, "slugify": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", @@ -940,14 +1767,14 @@ "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" }, "ssh2": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", - "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", "requires": { - "asn1": "^0.2.4", + "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2", - "cpu-features": "~0.0.4", - "nan": "^2.16.0" + "cpu-features": "~0.0.10", + "nan": "^2.20.0" } }, "string_decoder": { @@ -968,6 +1795,16 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -976,40 +1813,43 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, "tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "dependencies": { "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" } } }, "tar-fs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", - "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.0.0" + "tar-stream": "^2.1.4" } }, "tar-stream": { @@ -1022,27 +1862,6 @@ "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } } }, "tweetnacl": { @@ -1050,6 +1869,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, + "undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -1060,6 +1884,19 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -1070,6 +1907,16 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -1081,9 +1928,9 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" }, "yargs": { "version": "17.7.2", diff --git a/dev/deploy-to-container/package.json b/dev/deploy-to-container/package.json index 552ebc0bff9..09716c3094a 100644 --- a/dev/deploy-to-container/package.json +++ b/dev/deploy-to-container/package.json @@ -2,12 +2,12 @@ "name": "deploy-to-container", "type": "module", "dependencies": { - "dockerode": "^3.3.5", - "fs-extra": "^11.1.1", - "nanoid": "4.0.2", - "nanoid-dictionary": "5.0.0-beta.1", + "dockerode": "^4.0.6", + "fs-extra": "^11.3.0", + "nanoid": "5.1.5", + "nanoid-dictionary": "5.0.0", "slugify": "1.6.6", - "tar": "^6.1.14", + "tar": "^7.4.3", "yargs": "^17.7.2" }, "engines": { diff --git a/dev/deploy-to-container/refresh.js b/dev/deploy-to-container/refresh.js index 827d85de6cb..7ea13c885a4 100644 --- a/dev/deploy-to-container/refresh.js +++ b/dev/deploy-to-container/refresh.js @@ -24,7 +24,8 @@ async function main () { const containersToRestart = [] for (const container of containers) { if ( - container.Names.some(n => n.startsWith('/dt-db-')) + container.Names.some(n => n.startsWith('/dt-db-')) && + container.Labels?.nodbrefresh !== '1' ) { console.info(`Terminating DB container ${container.Id}...`) dbContainersToCreate.push(container.Names.find(n => n.startsWith('/dt-db-')).substring(1)) @@ -37,9 +38,11 @@ async function main () { v: true }) } else if ( - container.Names.some(n => n.startsWith('/dt-app-')) || - container.Names.some(n => n.startsWith('/dt-celery-')) || - container.Names.some(n => n.startsWith('/dt-beat-')) + ( + container.Names.some(n => n.startsWith('/dt-app-')) || + container.Names.some(n => n.startsWith('/dt-celery-')) || + container.Names.some(n => n.startsWith('/dt-beat-')) + ) && container.Labels?.nodbrefresh !== '1' ) { if (container.State === 'running') { const appContainer = dock.getContainer(container.Id) diff --git a/dev/deploy-to-container/settings_local.py b/dev/deploy-to-container/settings_local.py index d9bf00f22d5..aacf000093f 100644 --- a/dev/deploy-to-container/settings_local.py +++ b/dev/deploy-to-container/settings_local.py @@ -1,7 +1,7 @@ # Copyright The IETF Trust 2007-2019, All Rights Reserved # -*- coding: utf-8 -*- -from ietf.settings import * # pyflakes:ignore +from ietf.settings import * # pyflakes:ignore ALLOWED_HOSTS = ['*'] @@ -10,7 +10,7 @@ 'HOST': '__DBHOST__', 'PORT': 5432, 'NAME': 'datatracker', - 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'ENGINE': 'django.db.backends.postgresql', 'USER': 'django', 'PASSWORD': 'RkTkDPFnKpko', }, @@ -40,7 +40,6 @@ SUBMIT_YANG_CATALOG_MODEL_DIR = '/assets/ietf-ftp/yang/catalogmod/' SUBMIT_YANG_DRAFT_MODEL_DIR = '/assets/ietf-ftp/yang/draftmod/' -SUBMIT_YANG_INVAL_MODEL_DIR = '/assets/ietf-ftp/yang/invalmod/' SUBMIT_YANG_IANA_MODEL_DIR = '/assets/ietf-ftp/yang/ianamod/' SUBMIT_YANG_RFC_MODEL_DIR = '/assets/ietf-ftp/yang/rfcmod/' @@ -53,18 +52,30 @@ # 'ietf.context_processors.sql_debug', # ] -DOCUMENT_PATH_PATTERN = '/assets/ietf-ftp/{doc.type_id}/' +DOCUMENT_PATH_PATTERN = '/assets/ietfdata/doc/{doc.type_id}/' INTERNET_DRAFT_PATH = '/assets/ietf-ftp/internet-drafts/' RFC_PATH = '/assets/ietf-ftp/rfc/' CHARTER_PATH = '/assets/ietf-ftp/charter/' BOFREQ_PATH = '/assets/ietf-ftp/bofreq/' CONFLICT_REVIEW_PATH = '/assets/ietf-ftp/conflict-reviews/' STATUS_CHANGE_PATH = '/assets/ietf-ftp/status-changes/' -INTERNET_DRAFT_ARCHIVE_DIR = '/assets/ietf-ftp/internet-drafts/' -INTERNET_ALL_DRAFTS_ARCHIVE_DIR = '/assets/ietf-ftp/internet-drafts/' +INTERNET_DRAFT_ARCHIVE_DIR = '/assets/collection/draft-archive' +INTERNET_ALL_DRAFTS_ARCHIVE_DIR = '/assets/archive/id' BIBXML_BASE_PATH = '/assets/ietfdata/derived/bibxml' +IDSUBMIT_REPOSITORY_PATH = INTERNET_DRAFT_PATH +FTP_DIR = '/assets/ftp' +NFS_METRICS_TMP_DIR = '/assets/tmp' NOMCOM_PUBLIC_KEYS_DIR = 'data/nomcom_keys/public_keys/' SLIDE_STAGING_PATH = '/test/staging/' DE_GFM_BINARY = '/usr/local/bin/de-gfm' + +# No real secrets here, these are public testing values _only_ +APP_API_TOKENS = { + "ietf.api.views.ingest_email_test": ["ingestion-test-token"] +} + + +# OIDC configuration +SITE_URL = 'https://__HOSTNAME__' diff --git a/dev/deploy-to-container/start.sh b/dev/deploy-to-container/start.sh index 2257aaf11cd..5d976f80ea6 100644 --- a/dev/deploy-to-container/start.sh +++ b/dev/deploy-to-container/start.sh @@ -27,13 +27,28 @@ if [ -n "$PGHOST" ]; then psql -U django -h $PGHOST -d datatracker -v ON_ERROR_STOP=1 -c '\x' -c 'ALTER USER django set search_path=datatracker,public;' fi +echo "Starting memcached..." +/usr/bin/memcached -d -u root + echo "Running Datatracker checks..." ./ietf/manage.py check # Migrate, adjusting to what the current state of the underlying database might be: +# On production, the blobdb tables are in a separate database. Manipulate migration +# history to ensure that they're created for the sandbox environment that runs it +# all from a single database. +echo "Ensuring blobdb relations exist..." +/usr/local/bin/python ./ietf/manage.py migrate --settings=settings_local --fake blobdb zero +if ! /usr/local/bin/python ./ietf/manage.py migrate --settings=settings_local blobdb; then + # If we are restarting a sandbox, the migration may already have run and re-running + # it will fail. Assume that happened and fake it. + /usr/local/bin/python ./ietf/manage.py migrate --settings=settings_local --fake blobdb +fi + +# Now run the migrations for real echo "Running Datatracker migrations..." -/usr/local/bin/python ./ietf/manage.py migrate --fake-initial --settings=settings_local +/usr/local/bin/python ./ietf/manage.py migrate --settings=settings_local echo "Starting Datatracker..." ./ietf/manage.py runserver 0.0.0.0:8000 --settings=settings_local diff --git a/dev/deploy/build.sh b/dev/deploy/build.sh deleted file mode 100644 index a802acb46ba..00000000000 --- a/dev/deploy/build.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -echo "Compiling native node packages..." -yarn rebuild -echo "Packaging static assets..." -if [ "${SHOULD_DEPLOY}" = "true" ]; then - yarn build --base=https://www.ietf.org/lib/dt/$PKG_VERSION/ -else - yarn build -fi -yarn legacy:build diff --git a/dev/diff/package-lock.json b/dev/diff/package-lock.json index f7824b67a4f..d1c2fbd7639 100644 --- a/dev/diff/package-lock.json +++ b/dev/diff/package-lock.json @@ -6,18 +6,18 @@ "": { "name": "diff", "dependencies": { - "chalk": "^5.2.0", - "dockerode": "^3.3.5", - "enquirer": "^2.3.6", + "chalk": "^5.4.1", + "dockerode": "^4.0.6", + "enquirer": "^2.4.1", "extract-zip": "^2.0.1", - "fs-extra": "^11.1.1", - "got": "^12.6.0", + "fs-extra": "^11.3.0", + "got": "^13.0.0", "keypress": "^0.2.1", - "listr2": "^6.3.1", + "listr2": "^6.6.1", "lodash-es": "^4.17.21", - "luxon": "^3.3.0", - "pretty-bytes": "^6.1.0", - "tar": "^6.1.14", + "luxon": "^3.6.1", + "pretty-bytes": "^6.1.1", + "tar": "^7.4.3", "yargs": "^17.7.2" }, "engines": { @@ -29,6 +29,220 @@ "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" }, + "node_modules/@grpc/grpc-js": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz", + "integrity": "sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@sindresorhus/is": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", @@ -59,8 +273,7 @@ "node_modules/@types/node": { "version": "18.6.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", - "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", - "optional": true + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==" }, "node_modules/@types/yauzl": { "version": "2.10.0", @@ -119,10 +332,16 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -140,16 +359,61 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -159,9 +423,9 @@ } }, "node_modules/buildcheck": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", - "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", "optional": true, "engines": { "node": ">=10.0.0" @@ -193,9 +457,10 @@ } }, "node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -206,7 +471,8 @@ "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, "node_modules/cli-cursor": { "version": "4.0.0", @@ -313,24 +579,37 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "node_modules/cpu-features": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", - "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", "hasInstallScript": true, "optional": true, "dependencies": { - "buildcheck": "0.0.3", - "nan": "^2.15.0" + "buildcheck": "~0.0.6", + "nan": "^2.19.0" }, "engines": { "node": ">=10.0.0" } }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -381,27 +660,33 @@ } }, "node_modules/docker-modem": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.5.tgz", - "integrity": "sha512-x1E6jxWdtoK3+ifAUWj4w5egPdTDGBpesSCErm+aKET5BnnEOvDtTP6GxcnMB1zZiv2iQ0qJZvJie+1wfIRg6Q==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", + "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", + "license": "Apache-2.0", "dependencies": { "debug": "^4.1.1", "readable-stream": "^3.5.0", "split-ca": "^1.0.1", - "ssh2": "^1.4.0" + "ssh2": "^1.15.0" }, "engines": { "node": ">= 8.0" } }, "node_modules/dockerode": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.5.tgz", - "integrity": "sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.6.tgz", + "integrity": "sha512-FbVf3Z8fY/kALB9s+P9epCpWhfi/r0N2DgYYcYpsAUlaTxPjdsitsFobnltb+lyCgAIvf9C+4PSWlTnHlJMf1w==", + "license": "Apache-2.0", "dependencies": { "@balena/dockerignore": "^1.0.2", - "docker-modem": "^3.0.0", - "tar-fs": "~2.0.1" + "@grpc/grpc-js": "^1.11.1", + "@grpc/proto-loader": "^0.7.13", + "docker-modem": "^5.0.6", + "protobufjs": "^7.3.2", + "tar-fs": "~2.1.2", + "uuid": "^10.0.0" }, "engines": { "node": ">= 8.0" @@ -426,11 +711,12 @@ } }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -445,9 +731,9 @@ } }, "node_modules/eventemitter3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.0.tgz", - "integrity": "sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/extract-zip": { "version": "2.0.1", @@ -490,6 +776,32 @@ "pend": "~1.2.0" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -501,12 +813,14 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -516,17 +830,6 @@ "node": ">=14.14" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -546,10 +849,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/got": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", - "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", + "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -564,7 +888,7 @@ "responselike": "^3.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" @@ -609,7 +933,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/inherits": { "version": "2.0.4", @@ -624,6 +949,28 @@ "node": ">=8" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -654,13 +1001,13 @@ } }, "node_modules/listr2": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.3.1.tgz", - "integrity": "sha512-FOTLAjWKYpfONygQ4DQiOFxQRD+YV9fzW7MKcHBSa9E6QD4POnrEkfGMNy4ND0KiUDO/mQcHzxmuZKlbrkOpiw==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dependencies": { "cli-truncate": "^3.1.0", - "colorette": "^2.0.19", - "eventemitter3": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", "log-update": "^5.0.1", "rfdc": "^1.3.0", "wrap-ansi": "^8.1.0" @@ -755,6 +1102,12 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, "node_modules/log-update": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", @@ -846,6 +1199,12 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==", + "license": "Apache-2.0" + }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -857,10 +1216,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", + "license": "MIT", "engines": { "node": ">=12" } @@ -884,44 +1252,59 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": ">= 8" + "node": ">= 18" } }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "bin": { - "mkdirp": "bin/cmd.js" + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" }, "node_modules/ms": { "version": "2.1.2", @@ -929,9 +1312,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT", "optional": true }, "node_modules/normalize-url": { @@ -975,15 +1359,38 @@ "node": ">=12.20" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/pretty-bytes": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.0.tgz", - "integrity": "sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", "engines": { "node": "^14.13.1 || >=16.0.0" }, @@ -991,6 +1398,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -1071,6 +1502,23 @@ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, + "node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1093,7 +1541,27 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } }, "node_modules/signal-exit": { "version": "3.0.7", @@ -1140,23 +1608,24 @@ "node_modules/split-ca": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", + "license": "ISC" }, "node_modules/ssh2": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", - "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", "hasInstallScript": true, "dependencies": { - "asn1": "^0.2.4", + "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2" }, "engines": { "node": ">=10.16.0" }, "optionalDependencies": { - "cpu-features": "~0.0.4", - "nan": "^2.16.0" + "cpu-features": "~0.0.10", + "nan": "^2.20.0" } }, "node_modules/string_decoder": { @@ -1180,6 +1649,20 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1191,37 +1674,51 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/tar-fs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", - "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.0.0" + "tar-stream": "^2.1.4" } }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -1233,59 +1730,19 @@ "node": ">=6" } }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/tar/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" }, "node_modules/type-fest": { "version": "1.4.0", @@ -1311,6 +1768,33 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -1327,6 +1811,23 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -1341,9 +1842,12 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "engines": { + "node": ">=18" + } }, "node_modules/yargs": { "version": "17.7.2", @@ -1386,6 +1890,157 @@ "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" }, + "@grpc/grpc-js": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz", + "integrity": "sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==", + "requires": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + } + }, + "@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "requires": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "requires": { + "minipass": "^7.0.4" + } + }, + "@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==" + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "@sindresorhus/is": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", @@ -1407,8 +2062,7 @@ "@types/node": { "version": "18.6.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", - "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", - "optional": true + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==" }, "@types/yauzl": { "version": "2.10.0", @@ -1453,6 +2107,11 @@ "safer-buffer": "~2.1.0" } }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1466,15 +2125,42 @@ "tweetnacl": "^0.14.3" } }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" }, "buildcheck": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", - "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", "optional": true }, "cacheable-lookup": { @@ -1497,9 +2183,9 @@ } }, "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==" }, "chownr": { "version": "1.1.4", @@ -1577,18 +2263,28 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "cpu-features": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", - "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", "optional": true, "requires": { - "buildcheck": "0.0.3", - "nan": "^2.15.0" + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { @@ -1620,24 +2316,28 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, "docker-modem": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.5.tgz", - "integrity": "sha512-x1E6jxWdtoK3+ifAUWj4w5egPdTDGBpesSCErm+aKET5BnnEOvDtTP6GxcnMB1zZiv2iQ0qJZvJie+1wfIRg6Q==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", + "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", "requires": { "debug": "^4.1.1", "readable-stream": "^3.5.0", "split-ca": "^1.0.1", - "ssh2": "^1.4.0" + "ssh2": "^1.15.0" } }, "dockerode": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.5.tgz", - "integrity": "sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.6.tgz", + "integrity": "sha512-FbVf3Z8fY/kALB9s+P9epCpWhfi/r0N2DgYYcYpsAUlaTxPjdsitsFobnltb+lyCgAIvf9C+4PSWlTnHlJMf1w==", "requires": { "@balena/dockerignore": "^1.0.2", - "docker-modem": "^3.0.0", - "tar-fs": "~2.0.1" + "@grpc/grpc-js": "^1.11.1", + "@grpc/proto-loader": "^0.7.13", + "docker-modem": "^5.0.6", + "protobufjs": "^7.3.2", + "tar-fs": "~2.1.2", + "uuid": "^10.0.0" } }, "eastasianwidth": { @@ -1659,11 +2359,12 @@ } }, "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "requires": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" } }, "escalade": { @@ -1672,9 +2373,9 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "eventemitter3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.0.tgz", - "integrity": "sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "extract-zip": { "version": "2.0.1", @@ -1705,6 +2406,22 @@ "pend": "~1.2.0" } }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + } + }, "form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -1716,23 +2433,15 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1743,10 +2452,22 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, + "glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + } + }, "got": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", - "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", + "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", "requires": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -1795,6 +2516,20 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -1823,13 +2558,13 @@ } }, "listr2": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.3.1.tgz", - "integrity": "sha512-FOTLAjWKYpfONygQ4DQiOFxQRD+YV9fzW7MKcHBSa9E6QD4POnrEkfGMNy4ND0KiUDO/mQcHzxmuZKlbrkOpiw==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "requires": { "cli-truncate": "^3.1.0", - "colorette": "^2.0.19", - "eventemitter3": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", "log-update": "^5.0.1", "rfdc": "^1.3.0", "wrap-ansi": "^8.1.0" @@ -1885,6 +2620,11 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "log-update": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", @@ -1942,15 +2682,25 @@ } } }, + "long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" + }, "lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" }, + "lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==" + }, "luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==" + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==" }, "mimic-fn": { "version": "2.1.0", @@ -1962,27 +2712,32 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==" }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "requires": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" } }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" } }, "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" }, "mkdirp-classic": { "version": "0.5.3", @@ -1995,9 +2750,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", "optional": true }, "normalize-url": { @@ -2026,15 +2781,48 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==" }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "pretty-bytes": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.0.tgz", - "integrity": "sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==" + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==" + }, + "protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + } }, "pump": { "version": "3.0.0", @@ -2092,6 +2880,14 @@ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, + "rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "requires": { + "glob": "^10.3.7" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2102,6 +2898,19 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -2134,14 +2943,14 @@ "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" }, "ssh2": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", - "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", "requires": { - "asn1": "^0.2.4", + "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2", - "cpu-features": "~0.0.4", - "nan": "^2.16.0" + "cpu-features": "~0.0.10", + "nan": "^2.20.0" } }, "string_decoder": { @@ -2162,6 +2971,16 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2170,40 +2989,43 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, "tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "dependencies": { "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" } } }, "tar-fs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", - "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.0.0" + "tar-stream": "^2.1.4" } }, "tar-stream": { @@ -2216,27 +3038,6 @@ "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } } }, "tweetnacl": { @@ -2259,6 +3060,19 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -2269,6 +3083,16 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2280,9 +3104,9 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" }, "yargs": { "version": "17.7.2", diff --git a/dev/diff/package.json b/dev/diff/package.json index 1143840a49b..a5a7beb0df1 100644 --- a/dev/diff/package.json +++ b/dev/diff/package.json @@ -2,18 +2,18 @@ "name": "diff", "type": "module", "dependencies": { - "chalk": "^5.2.0", - "dockerode": "^3.3.5", - "enquirer": "^2.3.6", + "chalk": "^5.4.1", + "dockerode": "^4.0.6", + "enquirer": "^2.4.1", "extract-zip": "^2.0.1", - "fs-extra": "^11.1.1", - "got": "^12.6.0", + "fs-extra": "^11.3.0", + "got": "^13.0.0", "keypress": "^0.2.1", - "listr2": "^6.3.1", + "listr2": "^6.6.1", "lodash-es": "^4.17.21", - "luxon": "^3.3.0", - "pretty-bytes": "^6.1.0", - "tar": "^6.1.14", + "luxon": "^3.6.1", + "pretty-bytes": "^6.1.1", + "tar": "^7.4.3", "yargs": "^17.7.2" }, "engines": { diff --git a/dev/diff/settings_local.py b/dev/diff/settings_local.py index cd3923d5004..c255cac23dc 100644 --- a/dev/diff/settings_local.py +++ b/dev/diff/settings_local.py @@ -1,7 +1,7 @@ # Copyright The IETF Trust 2007-2019, All Rights Reserved # -*- coding: utf-8 -*- -from ietf.settings import * # pyflakes:ignore +from ietf.settings import * # pyflakes:ignore ALLOWED_HOSTS = ['*'] @@ -10,7 +10,7 @@ 'HOST': '__DBHOST__', 'PORT': 5432, 'NAME': 'datatracker', - 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'ENGINE': 'django.db.backends.postgresql', 'USER': 'django', 'PASSWORD': 'RkTkDPFnKpko', }, @@ -37,7 +37,6 @@ SUBMIT_YANG_CATALOG_MODEL_DIR = '/assets/ietf-ftp/yang/catalogmod/' SUBMIT_YANG_DRAFT_MODEL_DIR = '/assets/ietf-ftp/yang/draftmod/' -SUBMIT_YANG_INVAL_MODEL_DIR = '/assets/ietf-ftp/yang/invalmod/' SUBMIT_YANG_IANA_MODEL_DIR = '/assets/ietf-ftp/yang/ianamod/' SUBMIT_YANG_RFC_MODEL_DIR = '/assets/ietf-ftp/yang/rfcmod/' @@ -57,9 +56,11 @@ BOFREQ_PATH = '/assets/ietf-ftp/bofreq/' CONFLICT_REVIEW_PATH = '/assets/ietf-ftp/conflict-reviews/' STATUS_CHANGE_PATH = '/assets/ietf-ftp/status-changes/' -INTERNET_DRAFT_ARCHIVE_DIR = '/assets/ietf-ftp/internet-drafts/' +INTERNET_DRAFT_ARCHIVE_DIR = '/assets/collection/draft-archive' INTERNET_ALL_DRAFTS_ARCHIVE_DIR = '/assets/ietf-ftp/internet-drafts/' BIBXML_BASE_PATH = '/assets/ietfdata/derived/bibxml' +FTP_DIR = '/assets/ftp' +NFS_METRICS_TMP_DIR = '/assets/tmp' NOMCOM_PUBLIC_KEYS_DIR = 'data/nomcom_keys/public_keys/' SLIDE_STAGING_PATH = 'test/staging/' diff --git a/dev/k8s-get-deploy-name/.editorconfig b/dev/k8s-get-deploy-name/.editorconfig new file mode 100644 index 00000000000..fec5c665197 --- /dev/null +++ b/dev/k8s-get-deploy-name/.editorconfig @@ -0,0 +1,7 @@ +[*] +indent_size = 2 +indent_style = space +charset = utf-8 +trim_trailing_whitespace = false +end_of_line = lf +insert_final_newline = true diff --git a/dev/k8s-get-deploy-name/.gitignore b/dev/k8s-get-deploy-name/.gitignore new file mode 100644 index 00000000000..07e6e472cc7 --- /dev/null +++ b/dev/k8s-get-deploy-name/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/dev/k8s-get-deploy-name/.npmrc b/dev/k8s-get-deploy-name/.npmrc new file mode 100644 index 00000000000..580a68c499d --- /dev/null +++ b/dev/k8s-get-deploy-name/.npmrc @@ -0,0 +1,3 @@ +audit = false +fund = false +save-exact = true diff --git a/dev/k8s-get-deploy-name/README.md b/dev/k8s-get-deploy-name/README.md new file mode 100644 index 00000000000..a6605e4dd2c --- /dev/null +++ b/dev/k8s-get-deploy-name/README.md @@ -0,0 +1,16 @@ +# Datatracker Get Deploy Name + +This tool process and slugify a git branch into an appropriate subdomain name. + +## Usage + +1. From the `dev/k8s-get-deploy-name` directory, install the dependencies: +```sh +npm install +``` +2. Run the command: (replacing the `branch` argument) +```sh +node /cli.js --branch feat/fooBar-123 +``` + +The subdomain name will be output. It can then be used in a workflow as a namespace name and subdomain value. diff --git a/dev/k8s-get-deploy-name/cli.js b/dev/k8s-get-deploy-name/cli.js new file mode 100644 index 00000000000..b6c3b5119ef --- /dev/null +++ b/dev/k8s-get-deploy-name/cli.js @@ -0,0 +1,22 @@ +#!/usr/bin/env node + +import yargs from 'yargs/yargs' +import { hideBin } from 'yargs/helpers' +import slugify from 'slugify' + +const argv = yargs(hideBin(process.argv)).argv + +let branch = argv.branch +if (!branch) { + throw new Error('Missing --branch argument!') +} +if (branch.indexOf('/') >= 0) { + branch = branch.split('/').slice(1).join('-') +} +branch = slugify(branch, { lower: true, strict: true }) +if (branch.length < 1) { + throw new Error('Branch name is empty!') +} +process.stdout.write(`dt-${branch}`) + +process.exit(0) diff --git a/dev/k8s-get-deploy-name/package-lock.json b/dev/k8s-get-deploy-name/package-lock.json new file mode 100644 index 00000000000..e492a4cd38c --- /dev/null +++ b/dev/k8s-get-deploy-name/package-lock.json @@ -0,0 +1,303 @@ +{ + "name": "k8s-get-deploy-name", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "k8s-get-deploy-name", + "dependencies": { + "slugify": "1.6.6", + "yargs": "17.7.2" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } +} diff --git a/dev/k8s-get-deploy-name/package.json b/dev/k8s-get-deploy-name/package.json new file mode 100644 index 00000000000..849f5d9b8d0 --- /dev/null +++ b/dev/k8s-get-deploy-name/package.json @@ -0,0 +1,8 @@ +{ + "name": "k8s-get-deploy-name", + "type": "module", + "dependencies": { + "slugify": "1.6.6", + "yargs": "17.7.2" + } +} diff --git a/dev/legacy/add-old-drafts-from-archive.py b/dev/legacy/add-old-drafts-from-archive.py new file mode 100644 index 00000000000..f09c3b4558d --- /dev/null +++ b/dev/legacy/add-old-drafts-from-archive.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python +import sys + +print("This is only here as documention - please read the file") +sys.exit(0) + +# #!/usr/bin/env python +# # Copyright The IETF Trust 2017-2019, All Rights Reserved + +# import datetime +# import os +# import sys +# from pathlib import Path +# from contextlib import closing + +# os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" + +# import django +# django.setup() + +# from django.conf import settings +# from django.core.validators import validate_email, ValidationError +# from ietf.utils.draft import PlaintextDraft +# from ietf.submit.utils import update_authors +# from ietf.utils.timezone import date_today + +# import debug # pyflakes:ignore + +# from ietf.doc.models import Document, NewRevisionDocEvent, DocEvent, State +# from ietf.person.models import Person + +# system = Person.objects.get(name="(System)") +# expired = State.objects.get(type='draft',slug='expired') + +# names = set() +# print 'collecting draft names ...' +# versions = 0 +# for p in Path(settings.INTERNET_DRAFT_PATH).glob('draft*.txt'): +# n = str(p).split('/')[-1].split('-') +# if n[-1][:2].isdigit(): +# name = '-'.join(n[:-1]) +# if '--' in name or '.txt' in name or '[' in name or '=' in name or '&' in name: +# continue +# if name.startswith('draft-draft-'): +# continue +# if name == 'draft-ietf-trade-iotp-v1_0-dsig': +# continue +# if len(n[-1]) != 6: +# continue +# if name.startswith('draft-mlee-'): +# continue +# names.add('-'.join(n[:-1])) + +# count=0 +# print 'iterating through names ...' +# for name in sorted(names): +# if not Document.objects.filter(name=name).exists(): +# paths = list(Path(settings.INTERNET_DRAFT_PATH).glob('%s-??.txt'%name)) +# paths.sort() +# doc = None +# for p in paths: +# n = str(p).split('/')[-1].split('-') +# rev = n[-1][:2] +# with open(str(p)) as txt_file: +# raw = txt_file.read() +# try: +# text = raw.decode('utf8') +# except UnicodeDecodeError: +# text = raw.decode('latin1') +# try: +# draft = PlaintextDraft(text, txt_file.name, name_from_source=True) +# except Exception as e: +# print name, rev, "Can't parse", p,":",e +# continue +# if draft.errors and draft.errors.keys()!=['draftname',]: +# print "Errors - could not process", name, rev, datetime.datetime.fromtimestamp(p.stat().st_mtime, datetime.timezone.utc), draft.errors, draft.get_title().encode('utf8') +# else: +# time = datetime.datetime.fromtimestamp(p.stat().st_mtime, datetime.timezone.utc) +# if not doc: +# doc = Document.objects.create(name=name, +# time=time, +# type_id='draft', +# title=draft.get_title(), +# abstract=draft.get_abstract(), +# rev = rev, +# pages=draft.get_pagecount(), +# words=draft.get_wordcount(), +# expires=time+datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), +# ) +# DocAlias.objects.create(name=doc.name).docs.add(doc) +# doc.states.add(expired) +# # update authors +# authors = [] +# for author in draft.get_author_list(): +# full_name, first_name, middle_initial, last_name, name_suffix, email, country, company = author + +# author_name = full_name.replace("\n", "").replace("\r", "").replace("<", "").replace(">", "").strip() + +# if email: +# try: +# validate_email(email) +# except ValidationError: +# email = "" + +# def turn_into_unicode(s): +# if s is None: +# return u"" + +# if isinstance(s, unicode): +# return s +# else: +# try: +# return s.decode("utf-8") +# except UnicodeDecodeError: +# try: +# return s.decode("latin-1") +# except UnicodeDecodeError: +# return "" + +# author_name = turn_into_unicode(author_name) +# email = turn_into_unicode(email) +# company = turn_into_unicode(company) + +# authors.append({ +# "name": author_name, +# "email": email, +# "affiliation": company, +# "country": country +# }) +# dummysubmission=type('', (), {})() #https://stackoverflow.com/questions/19476816/creating-an-empty-object-in-python +# dummysubmission.authors = authors +# update_authors(doc,dummysubmission) + +# # add a docevent with words explaining where this came from +# events = [] +# e = NewRevisionDocEvent.objects.create( +# type="new_revision", +# doc=doc, +# rev=rev, +# by=system, +# desc="New version available: %s-%s.txt" % (doc.name, doc.rev), +# time=time, +# ) +# events.append(e) +# e = DocEvent.objects.create( +# type="comment", +# doc = doc, +# rev = rev, +# by = system, +# desc = "Revision added from id-archive on %s by %s"%(date_today(),sys.argv[0]), +# time=time, +# ) +# events.append(e) +# doc.time = time +# doc.rev = rev +# doc.save_with_history(events) +# print "Added",name, rev diff --git a/dev/legacy/notes/notes.html b/dev/legacy/notes/notes.html index 85980a5b1bb..cb10a18689d 100644 --- a/dev/legacy/notes/notes.html +++ b/dev/legacy/notes/notes.html @@ -355,7 +355,7 @@

Introduction

in one place.

With my recent investigations of code analysis tools, I thought it might be a good idea to start collecting these in one place for the project.

-
+
Henrik <henrik@levkowetz.com>, 23 Mar 2014
@@ -398,8 +398,9 @@

PyChecker

do the right thing, but once it was made to run on the datatracker code, and ignore the django code, it didn't report anything that PyFlakes hadn't already caught.

-
-Henrik <henrik@levkowetz.com>, 23 Mar 2014
+
+ Henrik <henrik@levkowetz.com>, 23 Mar 2014 +
diff --git a/dev/legacy/recalculate-rfc-authors-snapshot b/dev/legacy/recalculate-rfc-authors-snapshot new file mode 100644 index 00000000000..cbe7a7a2f3b --- /dev/null +++ b/dev/legacy/recalculate-rfc-authors-snapshot @@ -0,0 +1,8346 @@ +#!/bin/sh + +echo "This is only here as documentation. Please read the file" +exit + +# #!/usr/bin/env python + +# """DANGER, WILL ROBINSON + +# This code was used in the construction of person migrations 0016 through 0019 +# and doc migration 0029 The original intent was to provide a utility that could +# be run periodically, but the need for manual inspection of the results was too +# great. It is here as a _starting point_ for future exploration of updating rfc +# documentauthor sets. Be careful to check that assumptions haven't changed in +# the interim. + +# """ + +# import os, sys +# import django +# import argparse +# from collections import namedtuple +# import subprocess +# from tempfile import mkstemp + +# basedir = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../..')) +# sys.path.insert(0, basedir) +# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ietf.settings") + +# django.setup() + +# from ietf.person.models import Email, Person +# from ietf.doc.models import Document +# from ietf import settings + +# import debug + +# # This is a snapshot dump from the RFC Editor in late April 2017 +# rfced_data = """RFC1 || S. Crocker || +# RFC2 || B. Duvall || +# RFC3 || S.D. Crocker || +# RFC4 || E.B. Shapiro || +# RFC5 || J. Rulifson || +# RFC6 || S.D. Crocker || +# RFC7 || G. Deloche || +# RFC8 || G. Deloche || +# RFC9 || G. Deloche || +# RFC10 || S.D. Crocker || +# RFC11 || G. Deloche || +# RFC12 || M. Wingfield || +# RFC13 || V. Cerf || +# RFC14 || || +# RFC15 || C.S. Carr || +# RFC16 || S. Crocker || +# RFC17 || J.E. Kreznar || +# RFC18 || V. Cerf || +# RFC19 || J.E. Kreznar || +# RFC20 || V.G. Cerf || +# RFC21 || V.G. Cerf || +# RFC22 || V.G. Cerf || +# RFC23 || G. Gregg || +# RFC24 || S.D. Crocker || +# RFC25 || S.D. Crocker || +# RFC26 || || +# RFC27 || S.D. Crocker || +# RFC28 || W.K. English || +# RFC29 || R.E. Kahn || +# RFC30 || S.D. Crocker || +# RFC31 || D. Bobrow, W.R. Sutherland || +# RFC32 || J. Cole || +# RFC33 || S.D. Crocker || +# RFC34 || W.K. English || +# RFC35 || S.D. Crocker || +# RFC36 || S.D. Crocker || +# RFC37 || S.D. Crocker || +# RFC38 || S.M. Wolfe || +# RFC39 || E. Harslem, J.F. Heafner || +# RFC40 || E. Harslem, J.F. Heafner || +# RFC41 || J.T. Melvin || +# RFC42 || E. Ancona || +# RFC43 || A.G. Nemeth || +# RFC44 || A. Shoshani, R. Long, A. Landsberg || +# RFC45 || J. Postel, S.D. Crocker || +# RFC46 || E. Meyer || +# RFC47 || J. Postel, S. Crocker || +# RFC48 || J. Postel, S.D. Crocker || +# RFC49 || E. Meyer || +# RFC50 || E. Harslen, J. Heafner || +# RFC51 || M. Elie || +# RFC52 || J. Postel, S.D. Crocker || +# RFC53 || S.D. Crocker || +# RFC54 || S.D. Crocker, J. Postel, J. Newkirk, M. Kraley || +# RFC55 || J. Newkirk, M. Kraley, J. Postel, S.D. Crocker || +# RFC56 || E. Belove, D. Black, R. Flegal, L.G. Farquar || +# RFC57 || M. Kraley, J. Newkirk || +# RFC58 || T.P. Skinner || +# RFC59 || E. Meyer || +# RFC60 || R. Kalin || +# RFC61 || D.C. Walden || +# RFC62 || D.C. Walden || +# RFC63 || V.G. Cerf || +# RFC64 || M. Elie || +# RFC65 || D.C. Walden || +# RFC66 || S.D. Crocker || +# RFC67 || W.R. Crowther || +# RFC68 || M. Elie || +# RFC69 || A.K. Bhushan || +# RFC70 || S.D. Crocker || +# RFC71 || T. Schipper || +# RFC72 || R.D. Bressler || +# RFC73 || S.D. Crocker || +# RFC74 || J.E. White || +# RFC75 || S.D. Crocker || +# RFC76 || J. Bouknight, J. Madden, G.R. Grossman || +# RFC77 || J. Postel || +# RFC78 || E. Harslem, J.F. Heafner, J.E. White || +# RFC79 || E. Meyer || +# RFC80 || E. Harslem, J.F. Heafner || +# RFC81 || J. Bouknight || +# RFC82 || E. Meyer || +# RFC83 || R.H. Anderson, E. Harslem, J.F. Heafner || +# RFC84 || J.B. North || +# RFC85 || S.D. Crocker || +# RFC86 || S.D. Crocker || +# RFC87 || A. Vezza || +# RFC88 || R.T. Braden, S.M. Wolfe || +# RFC89 || R.M. Metcalfe || +# RFC90 || R.T. Braden || +# RFC91 || G.H. Mealy || +# RFC92 || || +# RFC93 || A.M. McKenzie || +# RFC94 || E. Harslem, J.F. Heafner || +# RFC95 || S. Crocker || +# RFC96 || R.W. Watson || +# RFC97 || J.T. Melvin, R.W. Watson || +# RFC98 || E. Meyer, T. Skinner || +# RFC99 || P.M. Karp || +# RFC100 || P.M. Karp || +# RFC101 || R.W. Watson || +# RFC102 || S.D. Crocker || +# RFC103 || R.B. Kalin || +# RFC104 || J.B. Postel, S.D. Crocker || +# RFC105 || J.E. White || +# RFC106 || T.C. O'Sullivan || +# RFC107 || R.D. Bressler, S.D. Crocker, W.R. Crowther, G.R. Grossman, R.S. Tomlinson, J.E. White || +# RFC108 || R.W. Watson || +# RFC109 || J. Winett || +# RFC110 || J. Winett || +# RFC111 || S.D. Crocker || +# RFC112 || T.C. O'Sullivan || +# RFC113 || E. Harslem, J.F. Heafner, J.E. White || +# RFC114 || A.K. Bhushan || +# RFC115 || R.W. Watson, J.B. North || +# RFC116 || S.D. Crocker || +# RFC117 || J. Wong || +# RFC118 || R.W. Watson || +# RFC119 || M. Krilanovich || +# RFC120 || M. Krilanovich || +# RFC121 || M. Krilanovich || +# RFC122 || J.E. White || +# RFC123 || S.D. Crocker || +# RFC124 || J.T. Melvin || +# RFC125 || J. McConnell || +# RFC126 || J. McConnell || +# RFC127 || J. Postel || +# RFC128 || J. Postel || +# RFC129 || E. Harslem, J. Heafner, E. Meyer || +# RFC130 || J.F. Heafner || +# RFC131 || E. Harslem, J.F. Heafner || +# RFC132 || J.E. White || +# RFC133 || R.L. Sunberg || +# RFC134 || A. Vezza || +# RFC135 || W. Hathaway || +# RFC136 || R.E. Kahn || +# RFC137 || T.C. O'Sullivan || +# RFC138 || R.H. Anderson, V.G. Cerf, E. Harslem, J.F. Heafner, J. Madden, R.M. Metcalfe, A. Shoshani, J.E. White, D.C.M. Wood || +# RFC139 || T.C. O'Sullivan || +# RFC140 || S.D. Crocker || +# RFC141 || E. Harslem, J.F. Heafner || +# RFC142 || C. Kline, J. Wong || +# RFC143 || W. Naylor, J. Wong, C. Kline, J. Postel || +# RFC144 || A. Shoshani || +# RFC145 || J. Postel || +# RFC146 || P.M. Karp, D.B. McKay, D.C.M. Wood || +# RFC147 || J.M. Winett || +# RFC148 || A.K. Bhushan || +# RFC149 || S.D. Crocker || +# RFC150 || R.B. Kalin || +# RFC151 || A. Shoshani || +# RFC152 || M. Wilber || +# RFC153 || J.T. Melvin, R.W. Watson || +# RFC154 || S.D. Crocker || +# RFC155 || J.B. North || +# RFC156 || J. Bouknight || +# RFC157 || V.G. Cerf || +# RFC158 || T.C. O'Sullivan || +# RFC159 || || +# RFC160 || Network Information Center. Stanford Research Institute || +# RFC161 || A. Shoshani || +# RFC162 || M. Kampe || +# RFC163 || V.G. Cerf || +# RFC164 || J.F. Heafner || +# RFC165 || J. Postel || +# RFC166 || R.H. Anderson, V.G. Cerf, E. Harslem, J.F. Heafner, J. Madden, R.M. Metcalfe, A. Shoshani, J.E. White, D.C.M. Wood || +# RFC167 || A.K. Bhushan, R.M. Metcalfe, J.M. Winett || +# RFC168 || J.B. North || +# RFC169 || S.D. Crocker || +# RFC170 || Network Information Center. Stanford Research Institute || +# RFC171 || A. Bhushan, B. Braden, W. Crowther, E. Harslem, J. Heafner, A. McKenize, J. Melvin, B. Sundberg, D. Watson, J. White || +# RFC172 || A. Bhushan, B. Braden, W. Crowther, E. Harslem, J. Heafner, A. McKenzie, J. Melvin, B. Sundberg, D. Watson, J. White || +# RFC173 || P.M. Karp, D.B. McKay || +# RFC174 || J. Postel, V.G. Cerf || +# RFC175 || E. Harslem, J.F. Heafner || +# RFC176 || A.K. Bhushan, R. Kanodia, R.M. Metcalfe, J. Postel || +# RFC177 || J. McConnell || +# RFC178 || I.W. Cotton || +# RFC179 || A.M. McKenzie || +# RFC180 || A.M. McKenzie || +# RFC181 || J. McConnell || +# RFC182 || J.B. North || +# RFC183 || J.M. Winett || +# RFC184 || K.C. Kelley || +# RFC185 || J.B. North || +# RFC186 || J.C. Michener || +# RFC187 || D.B. McKay, D.P. Karp || +# RFC188 || P.M. Karp, D.B. McKay || +# RFC189 || R.T. Braden || +# RFC190 || L.P. Deutsch || +# RFC191 || C.H. Irby || +# RFC192 || R.W. Watson || +# RFC193 || E. Harslem, J.F. Heafner || +# RFC194 || V. Cerf, E. Harslem, J. Heafner, B. Metcalfe, J. White || +# RFC195 || G.H. Mealy || +# RFC196 || R.W. Watson || +# RFC197 || A. Shoshani, E. Harslem || +# RFC198 || J.F. Heafner || +# RFC199 || T. Williams || +# RFC200 || J.B. North || +# RFC201 || || +# RFC202 || S.M. Wolfe, J. Postel || +# RFC203 || R.B. Kalin || +# RFC204 || J. Postel || +# RFC205 || R.T. Braden || +# RFC206 || J. White || +# RFC207 || A. Vezza || +# RFC208 || A.M. McKenzie || +# RFC209 || B. Cosell || +# RFC210 || W. Conrad || +# RFC211 || J.B. North || +# RFC212 || Information Sciences Institute University of Southern California || +# RFC213 || B. Cosell || +# RFC214 || E. Harslem || +# RFC215 || A.M. McKenzie || +# RFC216 || J.E. White || +# RFC217 || J.E. White || +# RFC218 || B. Cosell || +# RFC219 || R. Winter || +# RFC220 || || +# RFC221 || R.W. Watson || +# RFC222 || R.M. Metcalfe || +# RFC223 || J.T. Melvin, R.W. Watson || +# RFC224 || A.M. McKenzie || +# RFC225 || E. Harslem, R. Stoughton || +# RFC226 || P.M. Karp || +# RFC227 || J.F. Heafner, E. Harslem || +# RFC228 || D.C. Walden || +# RFC229 || J. Postel || +# RFC230 || T. Pyke || +# RFC231 || J.F. Heafner, E. Harslem || +# RFC232 || A. Vezza || +# RFC233 || A. Bhushan, R. Metcalfe || +# RFC234 || A. Vezza || +# RFC235 || E. Westheimer || +# RFC236 || J. Postel || +# RFC237 || R.W. Watson || +# RFC238 || R.T. Braden || +# RFC239 || R.T. Braden || +# RFC240 || A.M. McKenzie || +# RFC241 || A.M. McKenzie || +# RFC242 || L. Haibt, A.P. Mullery || +# RFC243 || A.P. Mullery || +# RFC244 || || +# RFC245 || C. Falls || +# RFC246 || A. Vezza || +# RFC247 || P.M. Karp || +# RFC248 || || +# RFC249 || R.F. Borelli || +# RFC250 || H. Brodie || +# RFC251 || D. Stern || +# RFC252 || E. Westheimer || +# RFC253 || J.A. Moorer || +# RFC254 || A. Bhushan || +# RFC255 || E. Westheimer || +# RFC256 || B. Cosell || +# RFC257 || || +# RFC258 || || +# RFC259 || || +# RFC260 || || +# RFC261 || || +# RFC262 || || +# RFC263 || A.M. McKenzie || +# RFC264 || A. Bhushan, B. Braden, W. Crowther, E. Harslem, J. Heafner, A. McKenize, B. Sundberg, D. Watson, J. White || +# RFC265 || A. Bhushan, B. Braden, W. Crowther, E. Harslem, J. Heafner, A. McKenzie, J. Melvin, B. Sundberg, D. Watson, J. White || +# RFC266 || E. Westheimer || +# RFC267 || E. Westheimer || +# RFC268 || J. Postel || +# RFC269 || H. Brodie || +# RFC270 || A.M. McKenzie || +# RFC271 || B. Cosell || +# RFC272 || || +# RFC273 || R.W. Watson || +# RFC274 || E. Forman || +# RFC275 || || +# RFC276 || R.W. Watson || +# RFC277 || || +# RFC278 || A.K. Bhushan, R.T. Braden, E. Harslem, J.F. Heafner, A.M. McKenzie, J.T. Melvin, R.L. Sundberg, R.W. Watson, J.E. White || +# RFC279 || || +# RFC280 || R.W. Watson || +# RFC281 || A.M. McKenzie || +# RFC282 || M.A. Padlipsky || +# RFC283 || R.T. Braden || +# RFC284 || || +# RFC285 || D. Huff || +# RFC286 || E. Forman || +# RFC287 || E. Westheimer || +# RFC288 || E. Westheimer || +# RFC289 || R.W. Watson || +# RFC290 || A.P. Mullery || +# RFC291 || D.B. McKay || +# RFC292 || J.C. Michener, I.W. Cotton, K.C. Kelley, D.E. Liddle, E. Meyer || +# RFC293 || E. Westheimer || +# RFC294 || A.K. Bhushan || +# RFC295 || J. Postel || +# RFC296 || D.E. Liddle || +# RFC297 || D.C. Walden || +# RFC298 || E. Westheimer || +# RFC299 || D. Hopkin || +# RFC300 || J.B. North || +# RFC301 || R. Alter || +# RFC302 || R.F. Bryan || +# RFC303 || Network Information Center. Stanford Research Institute || +# RFC304 || D.B. McKay || +# RFC305 || R. Alter || +# RFC306 || E. Westheimer || +# RFC307 || E. Harslem || +# RFC308 || M. Seriff || +# RFC309 || A.K. Bhushan || +# RFC310 || A.K. Bhushan || +# RFC311 || R.F. Bryan || +# RFC312 || A.M. McKenzie || +# RFC313 || T.C. O'Sullivan || +# RFC314 || I.W. Cotton || +# RFC315 || E. Westheimer || +# RFC316 || D.B. McKay, A.P. Mullery || +# RFC317 || J. Postel || +# RFC318 || J. Postel || +# RFC319 || E. Westheimer || +# RFC320 || R. Reddy || +# RFC321 || P.M. Karp || +# RFC322 || V. Cerf, J. Postel || +# RFC323 || V. Cerf || +# RFC324 || J. Postel || +# RFC325 || G. Hicks || +# RFC326 || E. Westheimer || +# RFC327 || A.K. Bhushan || +# RFC328 || J. Postel || +# RFC329 || Network Information Center. Stanford Research Institute || +# RFC330 || E. Westheimer || +# RFC331 || J.M. McQuillan || +# RFC332 || E. Westheimer || +# RFC333 || R.D. Bressler, D. Murphy, D.C. Walden || +# RFC334 || A.M. McKenzie || +# RFC335 || R.F. Bryan || +# RFC336 || I.W. Cotton || +# RFC337 || || +# RFC338 || R.T. Braden || +# RFC339 || R. Thomas || +# RFC340 || T.C. O'Sullivan || +# RFC341 || || +# RFC342 || E. Westheimer || +# RFC343 || A.M. McKenzie || +# RFC344 || E. Westheimer || +# RFC345 || K.C. Kelley || +# RFC346 || J. Postel || +# RFC347 || J. Postel || +# RFC348 || J. Postel || +# RFC349 || J. Postel || +# RFC350 || R. Stoughton || +# RFC351 || D. Crocker || +# RFC352 || D. Crocker || +# RFC353 || E. Westheimer || +# RFC354 || A.K. Bhushan || +# RFC355 || J. Davidson || +# RFC356 || R. Alter || +# RFC357 || J. Davidson || +# RFC358 || || +# RFC359 || D.C. Walden || +# RFC360 || C. Holland || +# RFC361 || R.D. Bressler || +# RFC362 || E. Westheimer || +# RFC363 || Network Information Center. Stanford Research Institute || +# RFC364 || M.D. Abrams || +# RFC365 || D.C. Walden || +# RFC366 || E. Westheimer || +# RFC367 || E. Westheimer || +# RFC368 || R.T. Braden || +# RFC369 || J.R. Pickens || +# RFC370 || E. Westheimer || +# RFC371 || R.E. Kahn || +# RFC372 || R.W. Watson || +# RFC373 || J. McCarthy || +# RFC374 || A.M. McKenzie || +# RFC375 || || +# RFC376 || E. Westheimer || +# RFC377 || R.T. Braden || +# RFC378 || A.M. McKenzie || +# RFC379 || R. Braden || +# RFC380 || || +# RFC381 || J.M. McQuillan || +# RFC382 || L. McDaniel || +# RFC383 || || +# RFC384 || J.B. North || +# RFC385 || A.K. Bhushan || +# RFC386 || B. Cosell, D.C. Walden || +# RFC387 || K.C. Kelley, J. Meir || +# RFC388 || V. Cerf || +# RFC389 || B. Noble || +# RFC390 || R.T. Braden || +# RFC391 || A.M. McKenzie || +# RFC392 || G. Hicks, B.D. Wessler || +# RFC393 || J.M. Winett || +# RFC394 || J.M. McQuillan || +# RFC395 || J.M. McQuillan || +# RFC396 || S. Bunch || +# RFC397 || || +# RFC398 || J.R. Pickens, E. Faeh || +# RFC399 || M. Krilanovich || +# RFC400 || A.M. McKenzie || +# RFC401 || J. Hansen || +# RFC402 || J.B. North || +# RFC403 || G. Hicks || +# RFC404 || A.M. McKenzie || +# RFC405 || A.M. McKenzie || +# RFC406 || J.M. McQuillan || +# RFC407 || R.D. Bressler, R. Guida, A.M. McKenzie || +# RFC408 || A.D. Owen, J. Postel || +# RFC409 || J.E. White || +# RFC410 || J.M. McQuillan || +# RFC411 || M.A. Padlipsky || +# RFC412 || G. Hicks || +# RFC413 || A.M. McKenzie || +# RFC414 || A.K. Bhushan || +# RFC415 || H. Murray || +# RFC416 || J.C. Norton || +# RFC417 || J. Postel, C. Kline || +# RFC418 || W. Hathaway || +# RFC419 || A. Vezza || +# RFC420 || H. Murray || +# RFC421 || A.M. McKenzie || +# RFC422 || A.M. McKenzie || +# RFC423 || B. Noble || +# RFC424 || || +# RFC425 || R.D. Bressler || +# RFC426 || R. Thomas || +# RFC427 || || +# RFC428 || || +# RFC429 || J. Postel || +# RFC430 || R.T. Braden || +# RFC431 || M. Krilanovich || +# RFC432 || N. Neigus || +# RFC433 || J. Postel || +# RFC434 || A.M. McKenzie || +# RFC435 || B. Cosell, D.C. Walden || +# RFC436 || M. Krilanovich || +# RFC437 || E. Faeh || +# RFC438 || R. Thomas, R. Clements || +# RFC439 || V. Cerf || +# RFC440 || D.C. Walden || +# RFC441 || R.D. Bressler, R. Thomas || +# RFC442 || V. Cerf || +# RFC443 || A.M. McKenzie || +# RFC444 || || +# RFC445 || A.M. McKenzie || +# RFC446 || L.P. Deutsch || +# RFC447 || A.M. McKenzie || +# RFC448 || R.T. Braden || +# RFC449 || D.C. Walden || +# RFC450 || M.A. Padlipsky || +# RFC451 || M.A. Padlipsky || +# RFC452 || J. Winett || +# RFC453 || M.D. Kudlick || +# RFC454 || A.M. McKenzie || +# RFC455 || A.M. McKenzie || +# RFC456 || M.D. Kudlick || +# RFC457 || D.C. Walden || +# RFC458 || R.D. Bressler, R. Thomas || +# RFC459 || W. Kantrowitz || +# RFC460 || C. Kline || +# RFC461 || A.M. McKenzie || +# RFC462 || J. Iseli, D. Crocker || +# RFC463 || A.K. Bhushan || +# RFC464 || M.D. Kudlick || +# RFC465 || || +# RFC466 || J.M. Winett || +# RFC467 || J.D. Burchfiel, R.S. Tomlinson || +# RFC468 || R.T. Braden || +# RFC469 || M.D. Kudlick || +# RFC470 || R. Thomas || +# RFC471 || R. Thomas || +# RFC472 || S. Bunch || +# RFC473 || D.C. Walden || +# RFC474 || S. Bunch || +# RFC475 || A.K. Bhushan || +# RFC476 || A.M. McKenzie || +# RFC477 || M. Krilanovich || +# RFC478 || R.D. Bressler, R. Thomas || +# RFC479 || J.E. White || +# RFC480 || J.E. White || +# RFC481 || || +# RFC482 || A.M. McKenzie || +# RFC483 || M.D. Kudlick || +# RFC484 || || +# RFC485 || J.R. Pickens || +# RFC486 || R.D. Bressler || +# RFC487 || R.D. Bressler || +# RFC488 || M.F. Auerbach || +# RFC489 || J. Postel || +# RFC490 || J.R. Pickens || +# RFC491 || M.A. Padlipsky || +# RFC492 || E. Meyer || +# RFC493 || J.C. Michener, I.W. Cotton, K.C. Kelley, D.E. Liddle, E. Meyer || +# RFC494 || D.C. Walden || +# RFC495 || A.M. McKenzie || +# RFC496 || M.F. Auerbach || +# RFC497 || A.M. McKenzie || +# RFC498 || R.T. Braden || +# RFC499 || B.R. Reussow || +# RFC500 || A. Shoshani, I. Spiegler || +# RFC501 || K.T. Pogran || +# RFC502 || || +# RFC503 || N. Neigus, J. Postel || +# RFC504 || R. Thomas || +# RFC505 || M.A. Padlipsky || +# RFC506 || M.A. Padlipsky || +# RFC507 || || +# RFC508 || L. Pfeifer, J. McAfee || +# RFC509 || A.M. McKenzie || +# RFC510 || J.E. White || +# RFC511 || J.B. North || +# RFC512 || W. Hathaway || +# RFC513 || W. Hathaway || +# RFC514 || W. Kantrowitz || +# RFC515 || R. Winter || +# RFC516 || J. Postel || +# RFC517 || || +# RFC518 || N. Vaughan, E.J. Feinler || +# RFC519 || J.R. Pickens || +# RFC520 || J.D. Day || +# RFC521 || A.M. McKenzie || +# RFC522 || A.M. McKenzie || +# RFC523 || A.K. Bhushan || +# RFC524 || J.E. White || +# RFC525 || W. Parrish, J.R. Pickens || +# RFC526 || W.K. Pratt || +# RFC527 || R. Merryman || +# RFC528 || J.M. McQuillan || +# RFC529 || A.M. McKenzie, R. Thomas, R.S. Tomlinson, K.T. Pogran || +# RFC530 || A.K. Bhushan || +# RFC531 || M.A. Padlipsky || +# RFC532 || R.G. Merryman || +# RFC533 || D.C. Walden || +# RFC534 || D.C. Walden || +# RFC535 || R. Thomas || +# RFC536 || || +# RFC537 || S. Bunch || +# RFC538 || A.M. McKenzie || +# RFC539 || D. Crocker, J. Postel || +# RFC540 || || +# RFC541 || || +# RFC542 || N. Neigus || +# RFC543 || N.D. Meyer || +# RFC544 || N.D. Meyer, K. Kelley || +# RFC545 || J.R. Pickens || +# RFC546 || R. Thomas || +# RFC547 || D.C. Walden || +# RFC548 || D.C. Walden || +# RFC549 || J.C. Michener || +# RFC550 || L.P. Deutsch || +# RFC551 || Y. Feinroth, R. Fink || +# RFC552 || A.D. Owen || +# RFC553 || C.H. Irby, K. Victor || +# RFC554 || || +# RFC555 || J.E. White || +# RFC556 || A.M. McKenzie || +# RFC557 || B.D. Wessler || +# RFC558 || || +# RFC559 || A.K. Bushan || +# RFC560 || D. Crocker, J. Postel || +# RFC561 || A.K. Bhushan, K.T. Pogran, R.S. Tomlinson, J.E. White || +# RFC562 || A.M. McKenzie || +# RFC563 || J. Davidson || +# RFC564 || || +# RFC565 || D. Cantor || +# RFC566 || A.M. McKenzie || +# RFC567 || L.P. Deutsch || +# RFC568 || J.M. McQuillan || +# RFC569 || M.A. Padlipsky || +# RFC570 || J.R. Pickens || +# RFC571 || R. Braden || +# RFC572 || || +# RFC573 || A. Bhushan || +# RFC574 || M. Krilanovich || +# RFC575 || || +# RFC576 || K. Victor || +# RFC577 || D. Crocker || +# RFC578 || A.K. Bhushan, N.D. Ryan || +# RFC579 || A.M. McKenzie || +# RFC580 || J. Postel || +# RFC581 || D. Crocker, J. Postel || +# RFC582 || R. Clements || +# RFC583 || || +# RFC584 || J. Iseli, D. Crocker, N. Neigus || +# RFC585 || D. Crocker, N. Neigus, E.J. Feinler, J. Iseli || +# RFC586 || A.M. McKenzie || +# RFC587 || J. Postel || +# RFC588 || A. Stokes || +# RFC589 || R.T. Braden || +# RFC590 || M.A. Padlipsky || +# RFC591 || D.C. Walden || +# RFC592 || R.W. Watson || +# RFC593 || A.M. McKenzie, J. Postel || +# RFC594 || J.D. Burchfiel || +# RFC595 || W. Hathaway || +# RFC596 || E.A. Taft || +# RFC597 || N. Neigus, E.J. Feinler || +# RFC598 || Network Information Center. Stanford Research Institute || +# RFC599 || R.T. Braden || +# RFC600 || A. Berggreen || +# RFC601 || A.M. McKenzie || +# RFC602 || R.M. Metcalfe || +# RFC603 || J.D. Burchfiel || +# RFC604 || J. Postel || +# RFC605 || || +# RFC606 || L.P. Deutsch || +# RFC607 || M. Krilanovich, G. Gregg || +# RFC608 || M.D. Kudlick || +# RFC609 || B. Ferguson || +# RFC610 || R. Winter, J. Hill, W. Greiff || +# RFC611 || D.C. Walden || +# RFC612 || A.M. McKenzie || +# RFC613 || A.M. McKenzie || +# RFC614 || K.T. Pogran, N. Neigus || +# RFC615 || D. Crocker || +# RFC616 || D. Walden || +# RFC617 || E.A. Taft || +# RFC618 || E.A. Taft || +# RFC619 || W. Naylor, H. Opderbeck || +# RFC620 || B. Ferguson || +# RFC621 || M.D. Kudlick || +# RFC622 || A.M. McKenzie || +# RFC623 || M. Krilanovich || +# RFC624 || M. Krilanovich, G. Gregg, W. Hathaway, J.E. White || +# RFC625 || M.D. Kudlick, E.J. Feinler || +# RFC626 || L. Kleinrock, H. Opderbeck || +# RFC627 || M.D. Kudlick, E.J. Feinler || +# RFC628 || M.L. Keeney || +# RFC629 || J.B. North || +# RFC630 || J. Sussman || +# RFC631 || A. Danthine || +# RFC632 || H. Opderbeck || +# RFC633 || A.M. McKenzie || +# RFC634 || A.M. McKenzie || +# RFC635 || V. Cerf || +# RFC636 || J.D. Burchfiel, B. Cosell, R.S. Tomlinson, D.C. Walden || +# RFC637 || A.M. McKenzie || +# RFC638 || A.M. McKenzie || +# RFC639 || || +# RFC640 || J. Postel || +# RFC641 || || +# RFC642 || J.D. Burchfiel || +# RFC643 || E. Mader || +# RFC644 || R. Thomas || +# RFC645 || D. Crocker || +# RFC646 || || +# RFC647 || M.A. Padlipsky || +# RFC648 || || +# RFC649 || || +# RFC650 || || +# RFC651 || D. Crocker || +# RFC652 || D. Crocker || +# RFC653 || D. Crocker || +# RFC654 || D. Crocker || +# RFC655 || D. Crocker || +# RFC656 || D. Crocker || +# RFC657 || D. Crocker || +# RFC658 || D. Crocker || +# RFC659 || J. Postel || +# RFC660 || D.C. Walden || +# RFC661 || J. Postel || +# RFC662 || R. Kanodia || +# RFC663 || R. Kanodia || +# RFC664 || || +# RFC665 || || +# RFC666 || M.A. Padlipsky || +# RFC667 || S.G. Chipman || +# RFC668 || || +# RFC669 || D.W. Dodds || +# RFC670 || || +# RFC671 || R. Schantz || +# RFC672 || R. Schantz || +# RFC673 || || +# RFC674 || J. Postel, J.E. White || +# RFC675 || V. Cerf, Y. Dalal, C. Sunshine || +# RFC676 || || +# RFC677 || P.R. Johnson, R. Thomas || +# RFC678 || J. Postel || +# RFC679 || D.W. Dodds || +# RFC680 || T.H. Myer, D.A. Henderson || +# RFC681 || S. Holmgren || +# RFC682 || || +# RFC683 || R. Clements || +# RFC684 || R. Schantz || +# RFC685 || M. Beeler || +# RFC686 || B. Harvey || +# RFC687 || D.C. Walden || +# RFC688 || D.C. Walden || +# RFC689 || R. Clements || +# RFC690 || J. Postel || +# RFC691 || B. Harvey || +# RFC692 || S.M. Wolfe || +# RFC693 || || +# RFC694 || J. Postel || +# RFC695 || M. Krilanovich || +# RFC696 || V.G. Cerf || +# RFC697 || J. Lieb || +# RFC698 || T. Mock || +# RFC699 || J. Postel, J. Vernon || +# RFC700 || E. Mader, W.W. Plummer, R.S. Tomlinson || +# RFC701 || D.W. Dodds || +# RFC702 || D.W. Dodds || +# RFC703 || D.W. Dodds || +# RFC704 || P.J. Santos || +# RFC705 || R.F. Bryan || +# RFC706 || J. Postel || +# RFC707 || J.E. White || +# RFC708 || J.E. White || +# RFC709 || || +# RFC710 || || +# RFC711 || || +# RFC712 || J.E. Donnelley || +# RFC713 || J. Haverty || +# RFC714 || A.M. McKenzie || +# RFC715 || || +# RFC716 || D.C. Walden, J. Levin || +# RFC717 || J. Postel || +# RFC718 || J. Postel || +# RFC719 || J. Postel || +# RFC720 || D. Crocker || +# RFC721 || L.L. Garlick || +# RFC722 || J. Haverty || +# RFC723 || || +# RFC724 || D. Crocker, K.T. Pogran, J. Vittal, D.A. Henderson || +# RFC725 || J.D. Day, G.R. Grossman || +# RFC726 || J. Postel, D. Crocker || +# RFC727 || M.R. Crispin || +# RFC728 || J.D. Day || +# RFC729 || D. Crocker || +# RFC730 || J. Postel || +# RFC731 || J.D. Day || +# RFC732 || J.D. Day || +# RFC733 || D. Crocker, J. Vittal, K.T. Pogran, D.A. Henderson || +# RFC734 || M.R. Crispin || +# RFC735 || D. Crocker, R.H. Gumpertz || +# RFC736 || M.R. Crispin || +# RFC737 || K. Harrenstien || +# RFC738 || K. Harrenstien || +# RFC739 || J. Postel || +# RFC740 || R.T. Braden || +# RFC741 || D. Cohen || +# RFC742 || K. Harrenstien || +# RFC743 || K. Harrenstien || +# RFC744 || J. Sattley || +# RFC745 || M. Beeler || +# RFC746 || R. Stallman || +# RFC747 || M.R. Crispin || +# RFC748 || M.R. Crispin || +# RFC749 || B. Greenberg || +# RFC750 || J. Postel || +# RFC751 || P.D. Lebling || +# RFC752 || M.R. Crispin || +# RFC753 || J. Postel || +# RFC754 || J. Postel || +# RFC755 || J. Postel || +# RFC756 || J.R. Pickens, E.J. Feinler, J.E. Mathis || +# RFC757 || D.P. Deutsch || +# RFC758 || J. Postel || +# RFC759 || J. Postel || +# RFC760 || J. Postel || +# RFC761 || J. Postel || +# RFC762 || J. Postel || +# RFC763 || M.D. Abrams || +# RFC764 || J. Postel || +# RFC765 || J. Postel || +# RFC766 || J. Postel || +# RFC767 || J. Postel || +# RFC768 || J. Postel || +# RFC769 || J. Postel || +# RFC770 || J. Postel || +# RFC771 || V.G. Cerf, J. Postel || +# RFC772 || S. Sluizer, J. Postel || +# RFC773 || V.G. Cerf || +# RFC774 || J. Postel || +# RFC775 || D. Mankins, D. Franklin, A.D. Owen || +# RFC776 || J. Postel || +# RFC777 || J. Postel || +# RFC778 || D.L. Mills || +# RFC779 || E. Killian || +# RFC780 || S. Sluizer, J. Postel || +# RFC781 || Z. Su || +# RFC782 || J. Nabielsky, A.P. Skelton || +# RFC783 || K.R. Sollins || +# RFC784 || S. Sluizer, J. Postel || +# RFC785 || S. Sluizer, J. Postel || +# RFC786 || S. Sluizer, J. Postel || +# RFC787 || A.L. Chapin || +# RFC788 || J. Postel || +# RFC789 || E.C. Rosen || +# RFC790 || J. Postel || +# RFC791 || J. Postel || +# RFC792 || J. Postel || +# RFC793 || J. Postel || +# RFC794 || V.G. Cerf || +# RFC795 || J. Postel || +# RFC796 || J. Postel || +# RFC797 || A.R. Katz || +# RFC798 || A.R. Katz || +# RFC799 || D.L. Mills || +# RFC800 || J. Postel, J. Vernon || +# RFC801 || J. Postel || +# RFC802 || A.G. Malis || +# RFC803 || A. Agarwal, M.J. O'Connor, D.L. Mills || +# RFC804 || International Telegraph and Telephone Consultative Committee of the International Telecommunication Union || +# RFC805 || J. Postel || +# RFC806 || National Bureau of Standards || +# RFC807 || J. Postel || +# RFC808 || J. Postel || +# RFC809 || T. Chang || +# RFC810 || E.J. Feinler, K. Harrenstien, Z. Su, V. White || +# RFC811 || K. Harrenstien, V. White, E.J. Feinler || +# RFC812 || K. Harrenstien, V. White || +# RFC813 || D.D. Clark || +# RFC814 || D.D. Clark || +# RFC815 || D.D. Clark || +# RFC816 || D.D. Clark || +# RFC817 || D.D. Clark || +# RFC818 || J. Postel || +# RFC819 || Z. Su, J. Postel || +# RFC820 || J. Postel || +# RFC821 || J. Postel || +# RFC822 || D. Crocker || +# RFC823 || R.M. Hinden, A. Sheltzer || bob.hinden@gmail.com +# RFC824 || W.I. MacGregor, D.C. Tappan || +# RFC825 || J. Postel || +# RFC826 || D. Plummer || +# RFC827 || E.C. Rosen || +# RFC828 || K. Owen || +# RFC829 || V.G. Cerf || +# RFC830 || Z. Su || +# RFC831 || R.T. Braden || +# RFC832 || D. Smallberg || +# RFC833 || D. Smallberg || +# RFC834 || D. Smallberg || +# RFC835 || D. Smallberg || +# RFC836 || D. Smallberg || +# RFC837 || D. Smallberg || +# RFC838 || D. Smallberg || +# RFC839 || D. Smallberg || +# RFC840 || J. Postel || +# RFC841 || National Bureau of Standards || +# RFC842 || D. Smallberg || +# RFC843 || D. Smallberg || +# RFC844 || R. Clements || +# RFC845 || D. Smallberg || +# RFC846 || D. Smallberg || +# RFC847 || A. Westine, D. Smallberg, J. Postel || +# RFC848 || D. Smallberg || +# RFC849 || M.R. Crispin || +# RFC850 || M.R. Horton || +# RFC851 || A.G. Malis || +# RFC852 || A.G. Malis || +# RFC853 || || +# RFC854 || J. Postel, J.K. Reynolds || +# RFC855 || J. Postel, J.K. Reynolds || +# RFC856 || J. Postel, J. Reynolds || +# RFC857 || J. Postel, J. Reynolds || +# RFC858 || J. Postel, J. Reynolds || +# RFC859 || J. Postel, J. Reynolds || +# RFC860 || J. Postel, J. Reynolds || +# RFC861 || J. Postel, J. Reynolds || +# RFC862 || J. Postel || +# RFC863 || J. Postel || +# RFC864 || J. Postel || +# RFC865 || J. Postel || +# RFC866 || J. Postel || +# RFC867 || J. Postel || +# RFC868 || J. Postel, K. Harrenstien || +# RFC869 || R. Hinden || bob.hinden@gmail.com +# RFC870 || J.K. Reynolds, J. Postel || +# RFC871 || M.A. Padlipsky || +# RFC872 || M.A. Padlipsky || +# RFC873 || M.A. Padlipsky || +# RFC874 || M.A. Padlipsky || +# RFC875 || M.A. Padlipsky || +# RFC876 || D. Smallberg || +# RFC877 || J.T. Korb || +# RFC878 || A.G. Malis || +# RFC879 || J. Postel || +# RFC880 || J.K. Reynolds, J. Postel || +# RFC881 || J. Postel || +# RFC882 || P.V. Mockapetris || +# RFC883 || P.V. Mockapetris || +# RFC884 || M. Solomon, E. Wimmers || +# RFC885 || J. Postel || +# RFC886 || M.T. Rose || +# RFC887 || M. Accetta || +# RFC888 || L. Seamonson, E.C. Rosen || +# RFC889 || D.L. Mills || +# RFC890 || J. Postel || +# RFC891 || D.L. Mills || +# RFC892 || International Organization for Standardization || +# RFC893 || S. Leffler, M.J. Karels || +# RFC894 || C. Hornig || +# RFC895 || J. Postel || +# RFC896 || J. Nagle || +# RFC897 || J. Postel || +# RFC898 || R.M. Hinden, J. Postel, M. Muuss, J.K. Reynolds || bob.hinden@gmail.com +# RFC899 || J. Postel, A. Westine || +# RFC900 || J.K. Reynolds, J. Postel || +# RFC901 || J.K. Reynolds, J. Postel || +# RFC902 || J.K. Reynolds, J. Postel || +# RFC903 || R. Finlayson, T. Mann, J.C. Mogul, M. Theimer || +# RFC904 || D.L. Mills || +# RFC905 || ISO || +# RFC906 || R. Finlayson || +# RFC907 || Bolt Beranek and Newman Laboratories || +# RFC908 || D. Velten, R.M. Hinden, J. Sax || bob.hinden@gmail.com +# RFC909 || C. Welles, W. Milliken || +# RFC910 || H.C. Forsdick || +# RFC911 || P. Kirton || +# RFC912 || M. St. Johns || +# RFC913 || M. Lottor || +# RFC914 || D.J. Farber, G. Delp, T.M. Conte || +# RFC915 || M.A. Elvy, R. Nedved || +# RFC916 || G.G. Finn || +# RFC917 || J.C. Mogul || +# RFC918 || J.K. Reynolds || +# RFC919 || J.C. Mogul || +# RFC920 || J. Postel, J.K. Reynolds || +# RFC921 || J. Postel || +# RFC922 || J.C. Mogul || +# RFC923 || J.K. Reynolds, J. Postel || +# RFC924 || J.K. Reynolds, J. Postel || +# RFC925 || J. Postel || +# RFC926 || International Organization for Standardization || +# RFC927 || B.A. Anderson || +# RFC928 || M.A. Padlipsky || +# RFC929 || J. Lilienkamp, R. Mandell, M.A. Padlipsky || +# RFC930 || M. Solomon, E. Wimmers || +# RFC931 || M. St. Johns || +# RFC932 || D.D. Clark || +# RFC933 || S. Silverman || +# RFC934 || M.T. Rose, E.A. Stefferud || +# RFC935 || J.G. Robinson || +# RFC936 || M.J. Karels || +# RFC937 || M. Butler, J. Postel, D. Chase, J. Goldberger, J.K. Reynolds || +# RFC938 || T. Miller || +# RFC939 || National Research Council || +# RFC940 || Gateway Algorithms and Data Structures Task Force || +# RFC941 || International Organization for Standardization || +# RFC942 || National Research Council || +# RFC943 || J.K. Reynolds, J. Postel || +# RFC944 || J.K. Reynolds, J. Postel || +# RFC945 || J. Postel || +# RFC946 || R. Nedved || +# RFC947 || K. Lebowitz, D. Mankins || +# RFC948 || I. Winston || +# RFC949 || M.A. Padlipsky || +# RFC950 || J.C. Mogul, J. Postel || +# RFC951 || W.J. Croft, J. Gilmore || +# RFC952 || K. Harrenstien, M.K. Stahl, E.J. Feinler || +# RFC953 || K. Harrenstien, M.K. Stahl, E.J. Feinler || +# RFC954 || K. Harrenstien, M.K. Stahl, E.J. Feinler || +# RFC955 || R.T. Braden || +# RFC956 || D.L. Mills || +# RFC957 || D.L. Mills || +# RFC958 || D.L. Mills || +# RFC959 || J. Postel, J. Reynolds || +# RFC960 || J.K. Reynolds, J. Postel || +# RFC961 || J.K. Reynolds, J. Postel || +# RFC962 || M.A. Padlipsky || +# RFC963 || D.P. Sidhu || +# RFC964 || D.P. Sidhu, T. Blumer || +# RFC965 || L. Aguilar || +# RFC966 || S.E. Deering, D.R. Cheriton || +# RFC967 || M.A. Padlipsky || +# RFC968 || V.G. Cerf || +# RFC969 || D.D. Clark, M.L. Lambert, L. Zhang || +# RFC970 || J. Nagle || +# RFC971 || A.L. DeSchon || +# RFC972 || F.J. Wancho || +# RFC973 || P.V. Mockapetris || +# RFC974 || C. Partridge || +# RFC975 || D.L. Mills || +# RFC976 || M.R. Horton || +# RFC977 || B. Kantor, P. Lapsley || +# RFC978 || J.K. Reynolds, R. Gillman, W.A. Brackenridge, A. Witkowski, J. Postel || +# RFC979 || A.G. Malis || +# RFC980 || O.J. Jacobsen, J. Postel || +# RFC981 || D.L. Mills || +# RFC982 || H.W. Braun || +# RFC983 || D.E. Cass, M.T. Rose || +# RFC984 || D.D. Clark, M.L. Lambert || +# RFC985 || National Science Foundation, Network Technical Advisory Group || +# RFC986 || R.W. Callon, H.W. Braun || +# RFC987 || S.E. Kille || +# RFC988 || S.E. Deering || +# RFC989 || J. Linn || +# RFC990 || J.K. Reynolds, J. Postel || +# RFC991 || J.K. Reynolds, J. Postel || +# RFC992 || K.P. Birman, T.A. Joseph || +# RFC993 || D.D. Clark, M.L. Lambert || +# RFC994 || International Organization for Standardization || +# RFC995 || International Organization for Standardization || +# RFC996 || D.L. Mills || +# RFC997 || J.K. Reynolds, J. Postel || +# RFC998 || D.D. Clark, M.L. Lambert, L. Zhang || +# RFC999 || A. Westine, J. Postel || +# RFC1000 || J.K. Reynolds, J. Postel || +# RFC1001 || NetBIOS Working Group in the Defense Advanced Research Projects Agency, Internet Activities Board, End-to-End Services Task Force || +# RFC1002 || NetBIOS Working Group in the Defense Advanced Research Projects Agency, Internet Activities Board, End-to-End Services Task Force || +# RFC1003 || A.R. Katz || +# RFC1004 || D.L. Mills || +# RFC1005 || A. Khanna, A.G. Malis || +# RFC1006 || M.T. Rose, D.E. Cass || +# RFC1007 || W. McCoy || +# RFC1008 || W. McCoy || +# RFC1009 || R.T. Braden, J. Postel || +# RFC1010 || J.K. Reynolds, J. Postel || +# RFC1011 || J.K. Reynolds, J. Postel || +# RFC1012 || J.K. Reynolds, J. Postel || +# RFC1013 || R.W. Scheifler || +# RFC1014 || Sun Microsystems || +# RFC1015 || B.M. Leiner || +# RFC1016 || W. Prue, J. Postel || +# RFC1017 || B.M. Leiner || +# RFC1018 || A.M. McKenzie || +# RFC1019 || D. Arnon || +# RFC1020 || S. Romano, M.K. Stahl || +# RFC1021 || C. Partridge, G. Trewitt || +# RFC1022 || C. Partridge, G. Trewitt || +# RFC1023 || G. Trewitt, C. Partridge || +# RFC1024 || C. Partridge, G. Trewitt || +# RFC1025 || J. Postel || +# RFC1026 || S.E. Kille || +# RFC1027 || S. Carl-Mitchell, J.S. Quarterman || +# RFC1028 || J. Davin, J.D. Case, M. Fedor, M.L. Schoffstall || +# RFC1029 || G. Parr || +# RFC1030 || M.L. Lambert || +# RFC1031 || W.D. Lazear || +# RFC1032 || M.K. Stahl || +# RFC1033 || M. Lottor || +# RFC1034 || P.V. Mockapetris || +# RFC1035 || P.V. Mockapetris || +# RFC1036 || M.R. Horton, R. Adams || +# RFC1037 || B. Greenberg, S. Keene || +# RFC1038 || M. St. Johns || +# RFC1039 || D. Latham || +# RFC1040 || J. Linn || +# RFC1041 || Y. Rekhter || +# RFC1042 || J. Postel, J.K. Reynolds || +# RFC1043 || A. Yasuda, T. Thompson || +# RFC1044 || K. Hardwick, J. Lekashman || +# RFC1045 || D.R. Cheriton || +# RFC1046 || W. Prue, J. Postel || +# RFC1047 || C. Partridge || +# RFC1048 || P.A. Prindeville || +# RFC1049 || M.A. Sirbu || +# RFC1050 || Sun Microsystems || +# RFC1051 || P.A. Prindeville || +# RFC1052 || V.G. Cerf || +# RFC1053 || S. Levy, T. Jacobson || +# RFC1054 || S.E. Deering || +# RFC1055 || J.L. Romkey || +# RFC1056 || M.L. Lambert || +# RFC1057 || Sun Microsystems || +# RFC1058 || C.L. Hedrick || +# RFC1059 || D.L. Mills || +# RFC1060 || J.K. Reynolds, J. Postel || +# RFC1061 || || +# RFC1062 || S. Romano, M.K. Stahl, M. Recker || +# RFC1063 || J.C. Mogul, C.A. Kent, C. Partridge, K. McCloghrie || +# RFC1064 || M.R. Crispin || +# RFC1065 || K. McCloghrie, M.T. Rose || +# RFC1066 || K. McCloghrie, M.T. Rose || +# RFC1067 || J.D. Case, M. Fedor, M.L. Schoffstall, J. Davin || +# RFC1068 || A.L. DeSchon, R.T. Braden || +# RFC1069 || R.W. Callon, H.W. Braun || +# RFC1070 || R.A. Hagens, N.E. Hall, M.T. Rose || hagens@cs.wisc.edu, nhall@cs.wisc.edu +# RFC1071 || R.T. Braden, D.A. Borman, C. Partridge || +# RFC1072 || V. Jacobson, R.T. Braden || +# RFC1073 || D. Waitzman || +# RFC1074 || J. Rekhter || +# RFC1075 || D. Waitzman, C. Partridge, S.E. Deering || +# RFC1076 || G. Trewitt, C. Partridge || +# RFC1077 || B.M. Leiner || +# RFC1078 || M. Lottor || +# RFC1079 || C.L. Hedrick || +# RFC1080 || C.L. Hedrick || +# RFC1081 || M.T. Rose || +# RFC1082 || M.T. Rose || +# RFC1083 || Defense Advanced Research Projects Agency, Internet Activities Board || +# RFC1084 || J.K. Reynolds || JKREYNOLDS@ISI.EDU +# RFC1085 || M.T. Rose || mrose17@gmail.com +# RFC1086 || J.P. Onions, M.T. Rose || JPO@CS.NOTT.AC.UK, mrose17@gmail.com +# RFC1087 || Defense Advanced Research Projects Agency, Internet Activities Board || +# RFC1088 || L.J. McLaughlin || ljm@TWG.COM +# RFC1089 || M. Schoffstall, C. Davin, M. Fedor, J. Case || schoff@stonewall.nyser.net, jrd@ptt.lcs.mit.edu, fedor@patton.NYSER.NET, case@UTKUX1.UTK.EDU +# RFC1090 || R. Ullmann || +# RFC1091 || J. VanBokkelen || +# RFC1092 || J. Rekhter || +# RFC1093 || H.W. Braun || +# RFC1094 || B. Nowicki || +# RFC1095 || U.S. Warrier, L. Besaw || +# RFC1096 || G.A. Marcy || +# RFC1097 || B. Miller || +# RFC1098 || J.D. Case, M. Fedor, M.L. Schoffstall, J. Davin || jrd@ptt.lcs.mit.edu +# RFC1099 || J. Reynolds || JKREY@ISI.EDU +# RFC1100 || Defense Advanced Research Projects Agency, Internet Activities Board || +# RFC1101 || P.V. Mockapetris || +# RFC1102 || D.D. Clark || +# RFC1103 || D. Katz || +# RFC1104 || H.W. Braun || hwb@merit.edu +# RFC1105 || K. Lougheed, Y. Rekhter || +# RFC1106 || R. Fox || rfox@tandem.com +# RFC1107 || K.R. Sollins || SOLLINS@XX.LCS.MIT.EDU +# RFC1108 || S. Kent || +# RFC1109 || V.G. Cerf || CERF@A.ISI.EDU +# RFC1110 || A.M. McKenzie || MCKENZIE@BBN.COM +# RFC1111 || J. Postel || POSTEL@ISI.EDU +# RFC1112 || S.E. Deering || deering@PESCADERO.STANFORD.EDU +# RFC1113 || J. Linn || Linn@ultra.enet.dec.com +# RFC1114 || S.T. Kent, J. Linn || kent@BBN.COM, Linn@ultra.enet.dec.com +# RFC1115 || J. Linn || Linn@ultra.enet.dec.com +# RFC1116 || D.A. Borman || dab@CRAY.COM +# RFC1117 || S. Romano, M.K. Stahl, M. Recker || +# RFC1118 || E. Krol || Krol@UXC.CSO.UIUC.EDU +# RFC1119 || D.L. Mills || +# RFC1120 || V. Cerf || VCERF@NRI.RESTON.VA.US +# RFC1121 || J. Postel, L. Kleinrock, V.G. Cerf, B. Boehm || Postel@ISI.EDU, lk@CS.UCLA.EDU, VCerf@NRI.RESTON.VA.US, boehm@CS.UCLA.EDU +# RFC1122 || R. Braden, Ed. || Braden@ISI.EDU +# RFC1123 || R. Braden, Ed. || Braden@ISI.EDU +# RFC1124 || B.M. Leiner || +# RFC1125 || D. Estrin || +# RFC1126 || M. Little || little@SAIC.COM +# RFC1127 || R.T. Braden || Braden@ISI.EDU +# RFC1128 || D.L. Mills || +# RFC1129 || D.L. Mills || +# RFC1130 || Defense Advanced Research Projects Agency, Internet Activities Board || +# RFC1131 || J. Moy || +# RFC1132 || L.J. McLaughlin || ljm@TWG.COM +# RFC1133 || J.Y. Yu, H.W. Braun || jyy@merit.edu, hwb@merit.edu +# RFC1134 || D. Perkins || rdhobby@ucdavis.edu +# RFC1135 || J.K. Reynolds || JKREY@ISI.EDU +# RFC1136 || S. Hares, D. Katz || +# RFC1137 || S. Kille || S.Kille@Cs.Ucl.AC.UK +# RFC1138 || S.E. Kille || S.Kille@Cs.Ucl.AC.UK +# RFC1139 || R.A. Hagens || hagens@CS.WISC.EDU +# RFC1140 || Defense Advanced Research Projects Agency, Internet Activities Board || +# RFC1141 || T. Mallory, A. Kullberg || tmallory@CCV.BBN.COM, akullberg@BBN.COM +# RFC1142 || D. Oran, Ed. || +# RFC1143 || D.J. Bernstein || +# RFC1144 || V. Jacobson || +# RFC1145 || J. Zweig, C. Partridge || zweig@CS.UIUC.EDU, craig@BBN.COM +# RFC1146 || J. Zweig, C. Partridge || zweig@CS.UIUC.EDU, craig@BBN.COM +# RFC1147 || R.H. Stine || STINE@SPARTA.COM +# RFC1148 || S.E. Kille || S.Kille@Cs.Ucl.AC.UK +# RFC1149 || D. Waitzman || dwaitzman@BBN.COM +# RFC1150 || G.S. Malkin, J.K. Reynolds || gmalkin@proteon.com, jkrey@isi.edu +# RFC1151 || C. Partridge, R.M. Hinden || craig@BBN.COM, bob.hinden@gmail.com +# RFC1152 || C. Partridge || craig@BBN.COM +# RFC1153 || F.J. Wancho || +# RFC1154 || D. Robinson, R. Ullmann || +# RFC1155 || M.T. Rose, K. McCloghrie || mrose17@gmail.com +# RFC1156 || K. McCloghrie, M.T. Rose || mrose17@gmail.com +# RFC1157 || J.D. Case, M. Fedor, M.L. Schoffstall, J. Davin || jrd@ptt.lcs.mit.edu +# RFC1158 || M.T. Rose || +# RFC1159 || R. Nelson || nelson@sun.soe.clarkson.edu +# RFC1160 || V. Cerf || VCERF@NRI.RESTON.VA.US +# RFC1161 || M.T. Rose || +# RFC1162 || G. Satz || +# RFC1163 || K. Lougheed, Y. Rekhter || +# RFC1164 || J.C. Honig, D. Katz, M. Mathis, Y. Rekhter, J.Y. Yu || +# RFC1165 || J. Crowcroft, J.P. Onions || JON@CS.UCL.AC.UK, JPO@CS.NOTT.AC.UK +# RFC1166 || S. Kirkpatrick, M.K. Stahl, M. Recker || +# RFC1167 || V.G. Cerf || vcerf@NRI.Reston.VA.US +# RFC1168 || A. Westine, A.L. DeSchon, J. Postel, C.E. Ward || +# RFC1169 || V.G. Cerf, K.L. Mills || vcerf@nri.reston.va.us, MILLS@ECF.NCSL.NIST.GOV +# RFC1170 || R.B. Fougner || +# RFC1171 || D. Perkins || ddp@andrew.cmu.edu +# RFC1172 || D. Perkins, R. Hobby || rdhobby@ucdavis.edu, ddp@andrew.cmu.edu +# RFC1173 || J. VanBokkelen || jbvb@ftp.com +# RFC1174 || V.G. Cerf || vcerf@nri.reston.va.us +# RFC1175 || K.L. Bowers, T.L. LaQuey, J.K. Reynolds, K. Roubicek, M.K. Stahl, A. Yuan || +# RFC1176 || M.R. Crispin || mrc@Tomobiki-Cho.CAC.Washington.EDU +# RFC1177 || G.S. Malkin, A.N. Marine, J.K. Reynolds || gmalkin@ftp.com, APRIL@NIC.DDN.MIL, jkrey@isi.edu +# RFC1178 || D. Libes || libes@cme.nist.gov +# RFC1179 || L. McLaughlin || ljm@twg.com +# RFC1180 || T.J. Socolofsky, C.J. Kale || TEDS@SPIDER.CO.UK, CLAUDIAK@SPIDER.CO.UK +# RFC1181 || R. Blokzijl || k13@nikhef.nl +# RFC1182 || || +# RFC1183 || C.F. Everhart, L.A. Mamakos, R. Ullmann, P.V. Mockapetris || Craig_Everhart@transarc.com, pvm@isi.edu +# RFC1184 || D.A. Borman || dab@CRAY.COM +# RFC1185 || V. Jacobson, R.T. Braden, L. Zhang || van@CSAM.LBL.GOV, Braden@ISI.EDU, lixia@PARC.XEROX.COM +# RFC1186 || R.L. Rivest || rivest@theory.lcs.mit.edu +# RFC1187 || M.T. Rose, K. McCloghrie, J.R. Davin || mrose17@gmail.com, KZM@HLS.COM, jrd@ptt.lcs.mit.edu +# RFC1188 || D. Katz || dkatz@merit.edu +# RFC1189 || U.S. Warrier, L. Besaw, L. LaBarre, B.D. Handspicker || +# RFC1190 || C. Topolcic || Casner@ISI.Edu, CLynn@BBN.Com, ppark@BBN.COM, Schroder@BBN.Com, Topolcic@BBN.Com +# RFC1191 || J.C. Mogul, S.E. Deering || mogul@decwrl.dec.com, deering@xerox.com +# RFC1192 || B. Kahin || kahin@hulaw.harvard.edu +# RFC1193 || D. Ferrari || ferrari@UCBVAX.BERKELEY.EDU +# RFC1194 || D.P. Zimmerman || dpz@dimacs.rutgers.edu +# RFC1195 || R.W. Callon || +# RFC1196 || D.P. Zimmerman || dpz@dimacs.rutgers.edu +# RFC1197 || M. Sherman || +# RFC1198 || R.W. Scheifler || rws@expo.lcs.mit.edu +# RFC1199 || J. Reynolds || JKREY@ISI.EDU +# RFC1200 || Defense Advanced Research Projects Agency, Internet Activities Board || +# RFC1201 || D. Provan || donp@Novell.Com +# RFC1202 || M.T. Rose || mrose17@gmail.com +# RFC1203 || J. Rice || RICE@SUMEX-AIM.STANFORD.EDU +# RFC1204 || S. Yeh, D. Lee || dlee@netix.com +# RFC1205 || P. Chmielewski || paulc@rchland.iinus1.ibm.com +# RFC1206 || G.S. Malkin, A.N. Marine || gmalkin@ftp.com, APRIL@nic.ddn.mil +# RFC1207 || G.S. Malkin, A.N. Marine, J.K. Reynolds || gmalkin@ftp.com, APRIL@nic.ddn.mil, jkrey@isi.edu +# RFC1208 || O.J. Jacobsen, D.C. Lynch || OLE@CSLI.STANFORD.EDU, Lynch@ISI.EDU +# RFC1209 || D. Piscitello, J. Lawrence || dave@sabre.bellcore.com, jcl@sabre.bellcore.com +# RFC1210 || V.G. Cerf, P.T. Kirstein, B. Randell || +# RFC1211 || A. Westine, J. Postel || Westine@ISI.EDU, Postel@ISI.EDU +# RFC1212 || M.T. Rose, K. McCloghrie || mrose17@gmail.com, kzm@hls.com +# RFC1213 || K. McCloghrie, M. Rose || kzm@hls.com, mrose17@gmail.com +# RFC1214 || L. LaBarre || cel@mbunix.mitre.org +# RFC1215 || M.T. Rose || mrose17@gmail.com +# RFC1216 || P. Richard, P. Kynikos || +# RFC1217 || V.G. Cerf || CERF@NRI.RESTON.VA.US +# RFC1218 || North American Directory Forum || +# RFC1219 || P.F. Tsuchiya || tsuchiya@thumper.bellcore.com +# RFC1220 || F. Baker || fbaker@ACC.COM +# RFC1221 || W. Edmond || wbe@bbn.com +# RFC1222 || H.W. Braun, Y. Rekhter || HWB@SDSC.EDU, Yakov@Watson.IBM.COM +# RFC1223 || J.M. Halpern || +# RFC1224 || L. Steinberg || LOUISS@IBM.COM +# RFC1225 || M.T. Rose || mrose17@gmail.com +# RFC1226 || B. Kantor || brian@UCSD.EDU +# RFC1227 || M.T. Rose || mrose17@gmail.com +# RFC1228 || G. Carpenter, B. Wijnen || +# RFC1229 || K. McCloghrie || kzm@hls.com +# RFC1230 || K. McCloghrie, R. Fox || kzm@hls.com, rfox@synoptics.com +# RFC1231 || K. McCloghrie, R. Fox, E. Decker || kzm@hls.com, rfox@synoptics.com, cire@cisco.com +# RFC1232 || F. Baker, C.P. Kolb || fbaker@acc.com, kolb@psi.com +# RFC1233 || T.A. Cox, K. Tesink || tacox@sabre.bellcore.com, kaj@nvuxr.cc.bellcore.com +# RFC1234 || D. Provan || donp@Novell.Com +# RFC1235 || J. Ioannidis, G. Maguire || ji@cs.columbia.edu, maguire@cs.columbia.edu +# RFC1236 || L. Morales, P. Hasse || lmorales@huachuca-emh8.army.mil, phasse@huachuca-emh8.army.mil +# RFC1237 || R. Colella, E. Gardner, R. Callon || colella@osi3.ncsl.nist.gov, epg@gateway.mitre.org +# RFC1238 || G. Satz || +# RFC1239 || J.K. Reynolds || jkrey@isi.edu +# RFC1240 || C. Shue, W. Haggerty, K. Dobbins || chi@osf.org, bill@comm.wang.com +# RFC1241 || R.A. Woodburn, D.L. Mills || woody@cseic.saic.com, mills@udel.edu +# RFC1242 || S. Bradner || SOB@HARVARD.HARVARD.EDU +# RFC1243 || S. Waldbusser || waldbusser@andrew.cmu.edu +# RFC1244 || J.P. Holbrook, J.K. Reynolds || holbrook@cic.net, JKREY@ISI.EDU +# RFC1245 || J. Moy || +# RFC1246 || J. Moy || +# RFC1247 || J. Moy || jmoy@proteon.com +# RFC1248 || F. Baker, R. Coltun || fbaker@acc.com, rcoltun@ni.umd.edu +# RFC1249 || T. Howes, M. Smith, B. Beecher || tim@umich.edu, mcs@umich.edu, bryan@umich.edu +# RFC1250 || J. Postel || +# RFC1251 || G. Malkin || gmalkin@ftp.com +# RFC1252 || F. Baker, R. Coltun || fbaker@acc.com, rcoltun@ni.umd.edu +# RFC1253 || F. Baker, R. Coltun || fbaker@acc.com, rcoltun@ni.umd.edu +# RFC1254 || A. Mankin, K. Ramakrishnan || +# RFC1255 || The North American Directory Forum || +# RFC1256 || S. Deering, Ed. || deering@xerox.com +# RFC1257 || C. Partridge || craig@SICS.SE +# RFC1258 || B. Kantor || brian@UCSD.EDU +# RFC1259 || M. Kapor || mkapor@eff.org +# RFC1260 || || +# RFC1261 || S. Williamson, L. Nobile || scottw@DIIS.DDN.MIL +# RFC1262 || V.G. Cerf || +# RFC1263 || S. O'Malley, L.L. Peterson || llp@cs.arizona.edu, sean@cs.arizona.edu +# RFC1264 || R.M. Hinden || bob.hinden@gmail.com +# RFC1265 || Y. Rekhter || yakov@watson.ibm.com +# RFC1266 || Y. Rekhter || yakov@watson.ibm.com +# RFC1267 || K. Lougheed, Y. Rekhter || +# RFC1268 || Y. Rekhter, P. Gross || yakov@watson.ibm.com +# RFC1269 || S. Willis, J.W. Burruss || +# RFC1270 || F. Kastenholz || +# RFC1271 || S. Waldbusser || waldbusser@andrew.cmu.edu +# RFC1272 || C. Mills, D. Hirsh, G.R. Ruth || +# RFC1273 || M.F. Schwartz || schwartz@cs.colorado.edu +# RFC1274 || P. Barker, S. Kille || P.Barker@cs.ucl.ac.uk, S.Kille@cs.ucl.ac.uk +# RFC1275 || S.E. Hardcastle-Kille || S.Kille@CS.UCL.AC.UK +# RFC1276 || S.E. Hardcastle-Kille || S.Kille@CS.UCL.AC.UK +# RFC1277 || S.E. Hardcastle-Kille || S.Kille@CS.UCL.AC.UK +# RFC1278 || S.E. Hardcastle-Kille || S.Kille@CS.UCL.AC.UK +# RFC1279 || S.E. Hardcastle-Kille || S.Kille@CS.UCL.AC.UK +# RFC1280 || J. Postel || +# RFC1281 || R. Pethia, S. Crocker, B. Fraser || rdp@cert.sei.cmu.edu, crocker@tis.com, byf@cert.sei.cmu.edu +# RFC1282 || B. Kantor || brian@UCSD.EDU +# RFC1283 || M. Rose || +# RFC1284 || J. Cook, Ed. || kasten@europa.clearpoint.com +# RFC1285 || J. Case || case@CS.UTK.EDU +# RFC1286 || E. Decker, P. Langille, A. Rijsinghani, K. McCloghrie || langille@edwin.enet.dec.com, anil@levers.enet.dec.com, kzm@hls.com +# RFC1287 || D. Clark, L. Chapin, V. Cerf, R. Braden, R. Hobby || ddc@LCS.MIT.EDU, vcerf@nri.reston.va.us, lyman@BBN.COM, braden@isi.edu, rdhobby@ucdavis.edu +# RFC1288 || D. Zimmerman || dpz@dimacs.rutgers.edu +# RFC1289 || J. Saperia || saperia@enet.dec.com +# RFC1290 || J. Martin || jmartin@magnus.acs.ohio-state.edu +# RFC1291 || V. Aggarwal || +# RFC1292 || R. Lang, R. Wright || +# RFC1293 || T. Bradley, C. Brown || +# RFC1294 || T. Bradley, C. Brown, A. Malis || +# RFC1295 || The North American Directory Forum || 0004454742@mcimail.com +# RFC1296 || M. Lottor || mkl@nisc.sri.com +# RFC1297 || D. Johnson || +# RFC1298 || R. Wormley, S. Bostock || bwormley@novell.com, steveb@novell.com +# RFC1299 || M. Kennedy || MKENNEDY@ISI.EDU +# RFC1300 || S. Greenfield || 0004689513@mcimail.com +# RFC1301 || S. Armstrong, A. Freier, K. Marzullo || armstrong@wrc.xerox.com, freier@apple.com, marzullo@cs.cornell.edu +# RFC1302 || D. Sitzler, P. Smith, A. Marine || +# RFC1303 || K. McCloghrie, M. Rose || kzm@hls.com, mrose17@gmail.com +# RFC1304 || T. Cox, Ed., K. Tesink, Ed. || tacox@sabre.bellcore.com, kaj@nvuxr.cc.bellcore.com +# RFC1305 || D. Mills || +# RFC1306 || A. Nicholson, J. Young || droid@cray.com, jsy@cray.com +# RFC1307 || J. Young, A. Nicholson || jsy@cray.com, droid@cray.com +# RFC1308 || C. Weider, J. Reynolds || +# RFC1309 || C. Weider, J. Reynolds, S. Heker || jkrey@isi.edu +# RFC1310 || L. Chapin || +# RFC1311 || J. Postel || +# RFC1312 || R. Nelson, G. Arnold || nelson@crynwr.com, geoff@east.sun.com +# RFC1313 || C. Partridge || craig@aland.bbn.com +# RFC1314 || A. Katz, D. Cohen || Katz@ISI.Edu, Cohen@ISI.Edu +# RFC1315 || C. Brown, F. Baker, C. Carvalho || cbrown@wellfleet.com, fbaker@acc.com, charles@acc.com +# RFC1316 || B. Stewart || rlstewart@eng.xyplex.com +# RFC1317 || B. Stewart || rlstewart@eng.xyplex.com +# RFC1318 || B. Stewart || rlstewart@eng.xyplex.com +# RFC1319 || B. Kaliski || burt@rsa.com +# RFC1320 || R. Rivest || rivest@theory.lcs.mit.edu +# RFC1321 || R. Rivest || rivest@theory.lcs.mit.edu +# RFC1322 || D. Estrin, Y. Rekhter, S. Hotz || estrin@usc.edu, yakov@ibm.com, hotz@usc.edu +# RFC1323 || V. Jacobson, R. Braden, D. Borman || van@CSAM.LBL.GOV, Braden@ISI.EDU +# RFC1324 || D. Reed || +# RFC1325 || G. Malkin, A. Marine || gmalkin@Xylogics.COM, april@nisc.sri.com +# RFC1326 || P. Tsuchiya || tsuchiya@thumper.bellcore.com +# RFC1327 || S. Hardcastle-Kille || +# RFC1328 || S. Hardcastle-Kille || S.Kille@CS.UCL.AC.UK +# RFC1329 || P. Kuehn || thimmela@sniabg.wa.sni.de +# RFC1330 || ESCC X.500/X.400 Task Force, ESnet Site Coordinating Comittee (ESCC), Energy Sciences Network (ESnet) || +# RFC1331 || W. Simpson || bsimpson@ray.lloyd.com +# RFC1332 || G. McGregor || Glenn.McGregor@Merit.edu +# RFC1333 || W. Simpson || bsimpson@ray.lloyd.com +# RFC1334 || B. Lloyd, W. Simpson || Bill.Simpson@um.cc.umich.edu +# RFC1335 || Z. Wang, J. Crowcroft || z.wang@cs.ucl.ac.uk, j.crowcroft@cs.ucl.ac.uk +# RFC1336 || G. Malkin || gmalkin@Xylogics.COM +# RFC1337 || R. Braden || Braden@ISI.EDU +# RFC1338 || V. Fuller, T. Li, J. Yu, K. Varadhan || +# RFC1339 || S. Dorner, P. Resnick || s-dorner@uiuc.edu, presnick@qti.qualcomm.com +# RFC1340 || J. Reynolds, J. Postel || +# RFC1341 || N. Borenstein, N. Freed || +# RFC1342 || K. Moore || moore@cs.utk.edu +# RFC1343 || N. Borenstein || +# RFC1344 || N. Borenstein || +# RFC1345 || K. Simonsen || +# RFC1346 || P. Jones || +# RFC1347 || R. Callon || +# RFC1348 || B. Manning || bmanning@rice.edu +# RFC1349 || P. Almquist || +# RFC1350 || K. Sollins || SOLLINS@LCS.MIT.EDU +# RFC1351 || J. Davin, J. Galvin, K. McCloghrie || jrd@ptt.lcs.mit.edu, galvin@tis.com, kzm@hls.com +# RFC1352 || J. Galvin, K. McCloghrie, J. Davin || galvin@tis.com, kzm@hls.com, jrd@ptt.lcs.mit.edu +# RFC1353 || K. McCloghrie, J. Davin, J. Galvin || kzm@hls.com, jrd@ptt.lcs.mit.edu, galvin@tis.com +# RFC1354 || F. Baker || fbaker@acc.com +# RFC1355 || J. Curran, A. Marine || jcurran@nnsc.nsf.net, april@nisc.sri.com +# RFC1356 || A. Malis, D. Robinson, R. Ullmann || +# RFC1357 || D. Cohen || Cohen@ISI.EDU +# RFC1358 || L. Chapin || lyman@BBN.COM +# RFC1359 || ACM SIGUCCS || martyne@nr-tech.cit.cornell.edu +# RFC1360 || J. Postel || +# RFC1361 || D. Mills || mills@udel.edu +# RFC1362 || M. Allen || MALLEN@NOVELL.COM, brian@ray.lloyd.com +# RFC1363 || C. Partridge || craig@aland.bbn.com +# RFC1364 || K. Varadhan || kannan@oar.net +# RFC1365 || K. Siyan || 72550.1634@compuserve.com +# RFC1366 || E. Gerich || epg@MERIT.EDU +# RFC1367 || C. Topolcic || topolcic@NRI.Reston.VA.US +# RFC1368 || D. McMaster, K. McCloghrie || mcmaster@synoptics.com, kzm@hls.com +# RFC1369 || F. Kastenholz || kasten@ftp.com +# RFC1370 || Internet Architecture Board, L. Chapin || +# RFC1371 || P. Gross || pgross@ans.net +# RFC1372 || C. Hedrick, D. Borman || +# RFC1373 || T. Tignor || tpt2@isi.edu +# RFC1374 || J. Renwick, A. Nicholson || jkr@CRAY.COM, droid@CRAY.COM +# RFC1375 || P. Robinson || +# RFC1376 || S. Senum || sjs@network.com +# RFC1377 || D. Katz || dkatz@cisco.com +# RFC1378 || B. Parker || brad@cayman.com +# RFC1379 || R. Braden || Braden@ISI.EDU +# RFC1380 || P. Gross, P. Almquist || pgross@ans.net, Almquist@JESSICA.STANFORD.EDU +# RFC1381 || D. Throop, F. Baker || throop@dg-rtp.dg.com, fbaker@acc.com +# RFC1382 || D. Throop, Ed. || throop@dg-rtp.dg.com +# RFC1383 || C. Huitema || Christian.Huitema@MIRSA.INRIA.FR +# RFC1384 || P. Barker, S.E. Hardcastle-Kille || P.Barker@CS.UCL.AC.UK, S.Kille@ISODE.COM +# RFC1385 || Z. Wang || z.wang@cs.ucl.ac.uk +# RFC1386 || A. Cooper, J. Postel || +# RFC1387 || G. Malkin || gmalkin@Xylogics.COM +# RFC1388 || G. Malkin || gmalkin@Xylogics.COM +# RFC1389 || G. Malkin, F. Baker || gmalkin@Xylogics.COM, fbaker@acc.com +# RFC1390 || D. Katz || dkatz@cisco.com +# RFC1391 || G. Malkin || gmalkin@Xylogics.COM +# RFC1392 || G. Malkin, T. LaQuey Parker || gmalkin@Xylogics.COM, tracy@utexas.edu +# RFC1393 || G. Malkin || gmalkin@Xylogics.COM +# RFC1394 || P. Robinson || +# RFC1395 || J. Reynolds || jkrey@isi.edu +# RFC1396 || S. Crocker || +# RFC1397 || D. Haskin || +# RFC1398 || F. Kastenholz || kasten@ftp.com +# RFC1399 || J. Elliott || elliott@isi.edu +# RFC1400 || S. Williamson || scottw@internic.net +# RFC1401 || Internet Architecture Board || +# RFC1402 || J. Martin || nic@osu.edu +# RFC1403 || K. Varadhan || +# RFC1404 || B. Stockman || +# RFC1405 || C. Allocchio || Claudio.Allocchio@elettra.Trieste.it +# RFC1406 || F. Baker, Ed., J. Watt, Ed. || fbaker@acc.com, james@newbridge.com +# RFC1407 || T. Cox, K. Tesink || tacox@mail.bellcore.com, kaj@cc.bellcore.com +# RFC1408 || D. Borman, Ed. || dab@CRAY.COM, stevea@isc.com +# RFC1409 || D. Borman, Ed. || dab@CRAY.COM, stevea@isc.com +# RFC1410 || J. Postel, Ed. || +# RFC1411 || D. Borman, Ed. || dab@CRAY.COM, stevea@isc.com +# RFC1412 || K. Alagappan || kannan@sejour.lkg.dec.com, stevea@isc.com +# RFC1413 || M. St. Johns || stjohns@DARPA.MIL +# RFC1414 || M. St. Johns, M. Rose || stjohns@DARPA.MIL, mrose17@gmail.com +# RFC1415 || J. Mindel, R. Slaski || +# RFC1416 || D. Borman, Ed. || dab@CRAY.COM, stevea@isc.com +# RFC1417 || The North American Directory Forum || 0004454742@mcimail.com +# RFC1418 || M. Rose || mrose17@gmail.com +# RFC1419 || G. Minshall, M. Ritter || minshall@wc.novell.com, MWRITTER@applelink.apple.com +# RFC1420 || S. Bostock || +# RFC1421 || J. Linn || 104-8456@mcimail.com +# RFC1422 || S. Kent || kent@BBN.COM +# RFC1423 || D. Balenson || balenson@tis.com +# RFC1424 || B. Kaliski || burt@rsa.com +# RFC1425 || J. Klensin, WG Chair, N. Freed, Ed., M. Rose, E. Stefferud, D. Crocker || +# RFC1426 || J. Klensin, WG Chair, N. Freed, Ed., M. Rose, E. Stefferud, D. Crocker || +# RFC1427 || J. Klensin, WG Chair, N. Freed, Ed., K. Moore || +# RFC1428 || G. Vaudreuil || GVaudre@CNRI.Reston.VA.US +# RFC1429 || E. Thomas || +# RFC1430 || S. Hardcastle-Kille, E. Huizer, V. Cerf, R. Hobby, S. Kent || S.Kille@isode.com, vcerf@cnri.reston.va.us, rdhobby@ucdavis.edu, skent@bbn.com +# RFC1431 || P. Barker || +# RFC1432 || J. Quarterman || jsq@tic.com, mids@tic.com +# RFC1433 || J. Garrett, J. Hagan, J. Wong || jwg@garage.att.com, Hagan@UPENN.EDU, jwong@garage.att.com +# RFC1434 || R. Dixon, D. Kushi || rcdixon@ralvmg.vnet.ibm.com, kushi@watson.ibm.com +# RFC1435 || S. Knowles || stev@ftp.com +# RFC1436 || F. Anklesaria, M. McCahill, P. Lindner, D. Johnson, D. Torrey, B. Albert || fxa@boombox.micro.umn.edu, mpm@boombox.micro.umn.edu, lindner@boombox.micro.umn.edu, dmj@boombox.micro.umn.edu, daniel@boombox.micro.umn.edu, alberti@boombox.micro.umn.edu +# RFC1437 || N. Borenstein, M. Linimon || nsb@bellcore.com, linimon@LONESOME.COM +# RFC1438 || A. Lyman Chapin, C. Huitema || Lyman@BBN.COM, Christian.Huitema@MIRSA.INRIA.FR +# RFC1439 || C. Finseth || Craig.A.Finseth-1@umn.edu +# RFC1440 || R. Troth || troth@rice.edu +# RFC1441 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1442 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1443 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1444 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1445 || J. Galvin, K. McCloghrie || galvin@tis.com +# RFC1446 || J. Galvin, K. McCloghrie || galvin@tis.com +# RFC1447 || K. McCloghrie, J. Galvin || galvin@tis.com +# RFC1448 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1449 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1450 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1451 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1452 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1453 || W. Chimiak || chim@relito.medeng.wfu.edu +# RFC1454 || T. Dixon || dixon@rare.nl +# RFC1455 || D. Eastlake 3rd || +# RFC1456 || Vietnamese Standardization Working Group || +# RFC1457 || R. Housley || Housley.McLean_CSD@Xerox.COM +# RFC1458 || R. Braudes, S. Zabele || rebraudes@tasc.com, gszabele@tasc.com +# RFC1459 || J. Oikarinen, D. Reed || +# RFC1460 || M. Rose || mrose17@gmail.com +# RFC1461 || D. Throop || throop@dg-rtp.dg.com +# RFC1462 || E. Krol, E. Hoffman || e-krol@uiuc.edu, ellen@merit.edu +# RFC1463 || E. Hoffman, L. Jackson || +# RFC1464 || R. Rosenbaum || +# RFC1465 || D. Eppenberger || Eppenberger@switch.ch +# RFC1466 || E. Gerich || epg@MERIT.EDU +# RFC1467 || C. Topolcic || topolcic@CNRI.Reston.VA.US +# RFC1468 || J. Murai, M. Crispin, E. van der Poel || jun@wide.ad.jp, MRC@PANDA.COM, erik@poel.juice.or.jp +# RFC1469 || T. Pusateri || pusateri@cs.duke.edu +# RFC1470 || R. Enger, J. Reynolds || enger@reston.ans.net +# RFC1471 || F. Kastenholz || kasten@ftp.com +# RFC1472 || F. Kastenholz || kasten@ftp.com +# RFC1473 || F. Kastenholz || kasten@ftp.com +# RFC1474 || F. Kastenholz || kasten@ftp.com +# RFC1475 || R. Ullmann || +# RFC1476 || R. Ullmann || +# RFC1477 || M. Steenstrup || +# RFC1478 || M. Steenstrup || +# RFC1479 || M. Steenstrup || +# RFC1480 || A. Cooper, J. Postel || +# RFC1481 || C. Huitema || Christian.Huitema@MIRSA.INRIA.FR +# RFC1482 || M. Knopper, S. Richardson || +# RFC1483 || Juha Heinanen || +# RFC1484 || S. Hardcastle-Kille || S.Kille@ISODE.COM +# RFC1485 || S. Hardcastle-Kille || S.Kille@ISODE.COM +# RFC1486 || M. Rose, C. Malamud || mrose17@gmail.com, carl@malamud.com +# RFC1487 || W. Yeong, T. Howes, S. Kille || yeongw@psilink.com, tim@umich.edu, S.Kille@isode.com +# RFC1488 || T. Howes, S. Kille, W. Yeong, C. Robbins || tim@umich.edu, S.Kille@isode.com, yeongw@psilink.com +# RFC1489 || A. Chernov || ache@astral.msk.su +# RFC1490 || T. Bradley, C. Brown, A. Malis || +# RFC1491 || C. Weider, R. Wright || clw@merit.edu, wright@lbl.gov +# RFC1492 || C. Finseth || Craig.A.Finseth-1@umn.edu +# RFC1493 || E. Decker, P. Langille, A. Rijsinghani, K. McCloghrie || langille@edwin.enet.dec.com, anil@levers.enet.dec.com, kzm@hls.com +# RFC1494 || H. Alvestrand, S. Thompson || Harald.Alvestrand@delab.sintef.no, sjt@gateway.ssw.com +# RFC1495 || H. Alvestrand, S. Kille, R. Miles, M. Rose, S. Thompson || Harald.Alvestrand@delab.sintef.no, S.Kille@ISODE.COM, rsm@spyder.ssw.com, mrose17@gmail.com, sjt@gateway.ssw.com +# RFC1496 || H. Alvestrand, J. Romaguera, K. Jordan || Harald.T.Alvestrand@delab.sintef.no, Kevin.E.Jordan@mercury.oss.arh.cpg.cdc.com, Romaguera@netconsult.ch +# RFC1497 || J. Reynolds || jkrey@isi.edu +# RFC1498 || J. Saltzer || Saltzer@MIT.EDU +# RFC1499 || J. Elliott || elliott@isi.edu +# RFC1500 || J. Postel || +# RFC1501 || E. Brunsen || BRUNSENE@EMAIL.ENMU.EDU +# RFC1502 || H. Alvestrand || Harald.Alvestrand@delab.sintef.no +# RFC1503 || K. McCloghrie, M. Rose || kzm@hls.com, mrose17@gmail.com +# RFC1504 || A. Oppenheimer || Oppenheime1@applelink.apple.com +# RFC1505 || A. Costanzo, D. Robinson, R. Ullmann || +# RFC1506 || J. Houttuin || +# RFC1507 || C. Kaufman || +# RFC1508 || J. Linn || +# RFC1509 || J. Wray || Wray@tuxedo.enet.dec.com +# RFC1510 || J. Kohl, C. Neuman || jtkohl@zk3.dec.com, bcn@isi.edu +# RFC1511 || J. Linn || +# RFC1512 || J. Case, A. Rijsinghani || case@CS.UTK.EDU, anil@levers.enet.dec.com +# RFC1513 || S. Waldbusser || waldbusser@cmu.edu +# RFC1514 || P. Grillo, S. Waldbusser || pl0143@mail.psi.net, waldbusser@cmu.edu +# RFC1515 || D. McMaster, K. McCloghrie, S. Roberts || mcmaster@synoptics.com, kzm@hls.com, sroberts@farallon.com +# RFC1516 || D. McMaster, K. McCloghrie || mcmaster@synoptics.com, kzm@hls.com +# RFC1517 || Internet Engineering Steering Group, R. Hinden || bob.hinden@gmail.com +# RFC1518 || Y. Rekhter, T. Li || yakov@watson.ibm.com, tli@cisco.com +# RFC1519 || V. Fuller, T. Li, J. Yu, K. Varadhan || vaf@Stanford.EDU, tli@cisco.com, jyy@merit.edu, kannan@oar.net +# RFC1520 || Y. Rekhter, C. Topolcic || yakov@watson.ibm.com, topolcic@CNRI.Reston.VA.US +# RFC1521 || N. Borenstein, N. Freed || gvaudre@cnri.reston.va.us +# RFC1522 || K. Moore || moore@cs.utk.edu +# RFC1523 || N. Borenstein || nsb@bellcore.com +# RFC1524 || N. Borenstein || nsb@bellcore.com +# RFC1525 || E. Decker, K. McCloghrie, P. Langille, A. Rijsinghani || kzm@hls.com, langille@edwin.enet.dec.com, anil@levers.enet.dec.com +# RFC1526 || D. Piscitello || dave@mail.bellcore.com +# RFC1527 || G. Cook || cook@path.net +# RFC1528 || C. Malamud, M. Rose || +# RFC1529 || C. Malamud, M. Rose || +# RFC1530 || C. Malamud, M. Rose || +# RFC1531 || R. Droms || droms@bucknell.edu +# RFC1532 || W. Wimer || Walter.Wimer@CMU.EDU +# RFC1533 || S. Alexander, R. Droms || stevea@lachman.com, droms@bucknell.edu +# RFC1534 || R. Droms || droms@bucknell.edu +# RFC1535 || E. Gavron || gavron@aces.com +# RFC1536 || A. Kumar, J. Postel, C. Neuman, P. Danzig, S. Miller || anant@isi.edu, postel@isi.edu, bcn@isi.edu, danzig@caldera.usc.edu, smiller@caldera.usc.edu +# RFC1537 || P. Beertema || Piet.Beertema@cwi.nl, anant@isi.edu +# RFC1538 || W. Behl, B. Sterling, W. Teskey || +# RFC1539 || G. Malkin || gmalkin@Xylogics.COM +# RFC1540 || J. Postel || +# RFC1541 || R. Droms || droms@bucknell.edu +# RFC1542 || W. Wimer || Walter.Wimer@CMU.EDU +# RFC1543 || J. Postel || Postel@ISI.EDU, dwaitzman@BBN.COM +# RFC1544 || M. Rose || mrose17@gmail.com +# RFC1545 || D. Piscitello || dave@mail.bellcore.com +# RFC1546 || C. Partridge, T. Mendez, W. Milliken || craig@bbn.com, tmendez@bbn.com, milliken@bbn.com +# RFC1547 || D. Perkins || Bill.Simpson@um.cc.umich.edu +# RFC1548 || W. Simpson || +# RFC1549 || W. Simpson, Ed. || +# RFC1550 || S. Bradner, A. Mankin || sob@harvard.edu, mankin@cmf.nrl.navy.mil +# RFC1551 || M. Allen || mallen@novell.com, fbaker@acc.com +# RFC1552 || W. Simpson || Bill.Simpson@um.cc.umich.edu +# RFC1553 || S. Mathur, M. Lewis || mathur@telebit.com, Mark.S.Lewis@telebit.com +# RFC1554 || M. Ohta, K. Handa || mohta@cc.titech.ac.jp, handa@etl.go.jp +# RFC1555 || H. Nussbacher, Y. Bourvine || hank@vm.tau.ac.il, yehavi@vms.huji.ac.il +# RFC1556 || H. Nussbacher || hank@vm.tau.ac.il +# RFC1557 || U. Choi, K. Chon, H. Park || uhhyung@kaist.ac.kr, chon@cosmos.kaist.ac.kr, hjpark@dino.media.co.kr +# RFC1558 || T. Howes || tim@umich.edu +# RFC1559 || J. Saperia || saperia@tay.dec.com +# RFC1560 || B. Leiner, Y. Rekhter || leiner@nsipo.nasa.gov, yakov@watson.ibm.com +# RFC1561 || D. Piscitello || wk04464@worldlink.com +# RFC1562 || G. Michaelson, M. Prior || G.Michaelson@cc.uq.oz.au, mrp@itd.adelaide.edu.au +# RFC1563 || N. Borenstein || nsb@bellcore.com +# RFC1564 || P. Barker, R. Hedberg || P.Barker@cs.ucl.ac.uk, Roland.Hedberg@rc.tudelft.nl, Roland.Hedberg@umdac.umu.se +# RFC1565 || S. Kille, N. Freed || S.Kille@isode.com, ned@innosoft.com +# RFC1566 || S. Kille, N. Freed || S.Kille@isode.com, ned@innosoft.com +# RFC1567 || G. Mansfield, S. Kille || glenn@aic.co.jp, S.Kille@isode.com +# RFC1568 || A. Gwinn || allen@mail.cox.smu.edu +# RFC1569 || M. Rose || mrose17@gmail.com +# RFC1570 || W. Simpson, Ed. || +# RFC1571 || D. Borman || dab@CRAY.COM +# RFC1572 || S. Alexander, Ed. || +# RFC1573 || K. McCloghrie, F. Kastenholz || kzm@hls.com, kasten@ftp.com +# RFC1574 || S. Hares, C. Wittbrodt || skh@merit.edu, cjw@magnolia.Stanford.EDU +# RFC1575 || S. Hares, C. Wittbrodt || skh@merit.edu, cjw@magnolia.Stanford.EDU +# RFC1576 || J. Penner || jjp@bscs.com +# RFC1577 || M. Laubach || laubach@hpl.hp.com +# RFC1578 || J. Sellers || sellers@quest.arc.nasa.gov +# RFC1579 || S. Bellovin || smb@research.att.com +# RFC1580 || EARN Staff || earndoc@earncc.earn.net +# RFC1581 || G. Meyer || gerry@spider.co.uk +# RFC1582 || G. Meyer || gerry@spider.co.uk +# RFC1583 || J. Moy || +# RFC1584 || J. Moy || +# RFC1585 || J. Moy || jmoy@proteon.com +# RFC1586 || O. deSouza, M. Rodrigues || osmund.desouza@att.com, manoel.rodrigues@att.com +# RFC1587 || R. Coltun, V. Fuller || rcoltun@rainbow-bridge.com, vaf@Valinor.Stanford.EDU +# RFC1588 || J. Postel, C. Anderson || +# RFC1589 || D. Mills || mills@udel.edu +# RFC1590 || J. Postel || Postel@ISI.EDU +# RFC1591 || J. Postel || Postel@ISI.EDU +# RFC1592 || B. Wijnen, G. Carpenter, K. Curran, A. Sehgal, G. Waters || +# RFC1593 || W. McKenzie, J. Cheng || mckenzie@ralvma.vnet.ibm.com, cheng@ralvm6.vnet.ibm.com +# RFC1594 || A. Marine, J. Reynolds, G. Malkin || amarine@atlas.arc.nasa.gov, jkrey@isi.edu, gmalkin@Xylogics.COM +# RFC1595 || T. Brown, K. Tesink || tacox@mail.bellcore.com, kaj@cc.bellcore.com +# RFC1596 || T. Brown, Ed. || tacox@mail.bellcore.com +# RFC1597 || Y. Rekhter, B. Moskowitz, D. Karrenberg, G. de Groot || yakov@watson.ibm.com, 3858921@mcimail.com, Daniel.Karrenberg@ripe.net, GeertJan.deGroot@ripe.net +# RFC1598 || W. Simpson || Bill.Simpson@um.cc.umich.edu +# RFC1599 || M. Kennedy || MKENNEDY@ISI.EDU +# RFC1600 || J. Postel || +# RFC1601 || C. Huitema || Christian.Huitema@sophia.inria.fr +# RFC1602 || Internet Architecture Board, Internet Engineering Steering Group || Christian.Huitema@MIRSA.INRIA.FR, 0006423401@mcimail.com +# RFC1603 || E. Huizer, D. Crocker || +# RFC1604 || T. Brown, Ed. || tacox@mail.bellcore.com +# RFC1605 || W. Shakespeare || +# RFC1606 || J. Onions || j.onions@nexor.co.uk +# RFC1607 || V. Cerf || vcerf@isoc.org, vinton_cerf@mcimail.com +# RFC1608 || T. Johannsen, G. Mansfield, M. Kosters, S. Sataluri || Thomas.Johannsen@ifn.et.tu-dresden.de, glenn@aic.co.jp, markk@internic.net, sri@qsun.att.com +# RFC1609 || G. Mansfield, T. Johannsen, M. Knopper || glenn@aic.co.jp, Thomas.Johannsen@ifn.et.tu-dresden.de, mak@merit.edu +# RFC1610 || J. Postel || +# RFC1611 || R. Austein, J. Saperia || sra@epilogue.com, saperia@zko.dec.com +# RFC1612 || R. Austein, J. Saperia || sra@epilogue.com, saperia@zko.dec.com +# RFC1613 || J. Forster, G. Satz, G. Glick, R. Day || forster@cisco.com, satz@cisco.com, gglick@cisco.com, R.Day@jnt.ac.uk +# RFC1614 || C. Adie || C.J.Adie@edinburgh.ac.uk +# RFC1615 || J. Houttuin, J. Craigie || +# RFC1616 || RARE WG-MSG Task Force 88, E. Huizer, Ed., J. Romaguera, Ed. || +# RFC1617 || P. Barker, S. Kille, T. Lenggenhager || p.barker@cs.ucl.ac.uk, s.kille@isode.com, lenggenhager@switch.ch +# RFC1618 || W. Simpson || Bill.Simpson@um.cc.umich.edu +# RFC1619 || W. Simpson || Bill.Simpson@um.cc.umich.edu +# RFC1620 || B. Braden, J. Postel, Y. Rekhter || Braden@ISI.EDU, Postel@ISI.EDU, Yakov@WATSON.IBM.COM +# RFC1621 || P. Francis || francis@cactus.ntt.jp +# RFC1622 || P. Francis || francis@cactus.ntt.jp +# RFC1623 || F. Kastenholz || kasten@ftp.com +# RFC1624 || A. Rijsinghani, Ed. || anil@levers.enet.dec.com +# RFC1625 || M. St. Pierre, J. Fullton, K. Gamiel, J. Goldman, B. Kahle, J. Kunze, H. Morris, F. Schiettecatte || saint@wais.com, jim.fullton@cnidr.org, kevin.gamiel@cnidr.org, jonathan@think.com, brewster@wais.com, jak@violet.berkeley.edu, morris@wais.com, francois@wais.com +# RFC1626 || R. Atkinson || atkinson@itd.nrl.navy.mil +# RFC1627 || E. Lear, E. Fair, D. Crocker, T. Kessler || +# RFC1628 || J. Case, Ed. || case@SNMP.COM +# RFC1629 || R. Colella, R. Callon, E. Gardner, Y. Rekhter || colella@nist.gov, callon@wellfleet.com, epg@gateway.mitre.org, yakov@watson.ibm.com +# RFC1630 || T. Berners-Lee || timbl@info.cern.ch +# RFC1631 || K. Egevang, P. Francis || kbe@craycom.dk, francis@cactus.ntt.jp +# RFC1632 || A. Getchell, Ed., S. Sataluri, Ed. || +# RFC1633 || R. Braden, D. Clark, S. Shenker || Braden@ISI.EDU, ddc@LCS.MIT.EDU, Shenker@PARC.XEROX.COM +# RFC1634 || M. Allen || mallen@novell.com, fbaker@acc.com +# RFC1635 || P. Deutsch, A. Emtage, A. Marine || peterd@bunyip.com, bajan@bunyip.com, amarine@atlas.arc.nasa.gov +# RFC1636 || R. Braden, D. Clark, S. Crocker, C. Huitema || Braden@ISI.EDU, ddc@lcs.mit.edu, crocker@tis.com, Christian.Huitema@MIRSA.INRIA.FR +# RFC1637 || B. Manning, R. Colella || bmanning@rice.edu, colella@nist.gov +# RFC1638 || F. Baker, R. Bowen || Rich_Bowen@vnet.ibm.com +# RFC1639 || D. Piscitello || dave@corecom.com +# RFC1640 || S. Crocker || crocker@TIS.COM +# RFC1641 || D. Goldsmith, M. Davis || david_goldsmith@taligent.com, mark_davis@taligent.com +# RFC1642 || D. Goldsmith, M. Davis || david_goldsmith@taligent.com, mark_davis@taligent.com +# RFC1643 || F. Kastenholz || kasten@ftp.com +# RFC1644 || R. Braden || Braden@ISI.EDU +# RFC1645 || A. Gwinn || allen@mail.cox.smu.edu +# RFC1646 || C. Graves, T. Butts, M. Angel || cvg@oc.com, tom@oc.com, angel@oc.com +# RFC1647 || B. Kelly || kellywh@mail.auburn.edu +# RFC1648 || A. Cargille || +# RFC1649 || R. Hagens, A. Hansen || hagens@ans.net, Alf.Hansen@uninett.no +# RFC1650 || F. Kastenholz || kasten@ftp.com +# RFC1651 || J. Klensin, N. Freed, M. Rose, E. Stefferud, D. Crocker || klensin@mci.net, ned@innosoft.com, mrose17@gmail.com, stef@nma.com, dcrocker@sgi.com +# RFC1652 || J. Klensin, N. Freed, M. Rose, E. Stefferud, D. Crocker || klensin@mci.net, ned@innosoft.com, mrose17@gmail.com, stef@nma.com, dcrocker@sgi.com +# RFC1653 || J. Klensin, N. Freed, K. Moore || klensin@mci.net, ned@innosoft.com, moore@cs.utk.edu +# RFC1654 || Y. Rekhter, Ed., T. Li, Ed. || +# RFC1655 || Y. Rekhter, Ed., P. Gross, Ed. || yakov@watson.ibm.com, 0006423401@mcimail.com +# RFC1656 || P. Traina || pst@cisco.com +# RFC1657 || S. Willis, J. Burruss, J. Chu, Ed. || swillis@wellfleet.com, jburruss@wellfleet.com, jychu@watson.ibm.com +# RFC1658 || B. Stewart || rlstewart@eng.xyplex.com +# RFC1659 || B. Stewart || rlstewart@eng.xyplex.com +# RFC1660 || B. Stewart || rlstewart@eng.xyplex.com +# RFC1661 || W. Simpson, Ed. || +# RFC1662 || W. Simpson, Ed. || +# RFC1663 || D. Rand || dave_rand@novell.com +# RFC1664 || C. Allocchio, A. Bonito, B. Cole, S. Giordano, R. Hagens || +# RFC1665 || Z. Kielczewski, Ed., D. Kostick, Ed., K. Shih, Ed. || zbig@eicon.qc.ca, dck2@mail.bellcore.com, kmshih@novell.com +# RFC1666 || Z. Kielczewski, Ed., D. Kostick, Ed., K. Shih, Ed. || zbig@eicon.qc.ca, dck2@mail.bellcore.com, kmshih@novell.com +# RFC1667 || S. Symington, D. Wood, M. Pullen || susan@gateway.mitre.org, wood@mitre.org, mpullen@cs.gmu.edu +# RFC1668 || D. Estrin, T. Li, Y. Rekhter || estrin@usc.edu, tli@cisco.com, yakov@watson.ibm.com +# RFC1669 || J. Curran || jcurran@near.net +# RFC1670 || D. Heagerty || denise@dxcoms.cern.ch +# RFC1671 || B. Carpenter || brian@dxcoms.cern.ch +# RFC1672 || N. Brownlee || n.brownlee@auckland.ac.nz +# RFC1673 || R. Skelton || RSKELTON@msm.epri.com +# RFC1674 || M. Taylor || mark.s.taylor@airdata.com +# RFC1675 || S. Bellovin || smb@research.att.com +# RFC1676 || A. Ghiselli, D. Salomoni, C. Vistoli || Salomoni@infn.it, Vistoli@infn.it, Ghiselli@infn.it +# RFC1677 || B. Adamson || adamson@itd.nrl.navy.mil +# RFC1678 || E. Britton, J. Tavs || brittone@vnet.ibm.com, tavs@vnet.ibm.com +# RFC1679 || D. Green, P. Irey, D. Marlow, K. O'Donoghue || dtgreen@relay.nswc.navy.mil, pirey@relay.nswc.navy.mil, dmarlow@relay.nswc.navy.mil, kodonog@relay.nswc.navy.mil +# RFC1680 || C. Brazdziunas || crb@faline.bellcore.com +# RFC1681 || S. Bellovin || smb@research.att.com +# RFC1682 || J. Bound || bound@zk3.dec.com +# RFC1683 || R. Clark, M. Ammar, K. Calvert || rjc@cc.gatech.edu, ammar@cc.gatech.edu, calvert@cc.gatech.edu +# RFC1684 || P. Jurg || +# RFC1685 || H. Alvestrand || +# RFC1686 || M. Vecchi || mpvecchi@twcable.com +# RFC1687 || E. Fleischman || ericf@atc.boeing.com +# RFC1688 || W. Simpson || Bill.Simpson@um.cc.umich.edu +# RFC1689 || J. Foster, Ed. || +# RFC1690 || G. Huston || Geoff.Huston@aarnet.edu.au +# RFC1691 || W. Turner || wrt1@cornell.edu +# RFC1692 || P. Cameron, D. Crocker, D. Cohen, J. Postel || cameron@xylint.co.uk, dcrocker@sgi.com, Cohen@myricom.com, Postel@ISI.EDU +# RFC1693 || T. Connolly, P. Amer, P. Conrad || connolly@udel.edu, amer@udel.edu, pconrad@udel.edu +# RFC1694 || T. Brown, Ed., K. Tesink, Ed. || tacox@mail.bellcore.com, kaj@cc.bellcore.com +# RFC1695 || M. Ahmed, Ed., K. Tesink, Ed. || mxa@mail.bellcore.com, kaj@cc.bellcore.com +# RFC1696 || J. Barnes, L. Brown, R. Royston, S. Waldbusser || barnes@xylogics.com, brown_l@msm.cdx.mot.com, rroyston@usr.com, swol@andrew.cmu.edu +# RFC1697 || D. Brower, Ed., B. Purvy, A. Daniel, M. Sinykin, J. Smith || daveb@ingres.com, bpurvy@us.oracle.com, anthony@informix.com, msinykin@us.oracle.com, jaysmith@us.oracle.com +# RFC1698 || P. Furniss || P.Furniss@ulcc.ac.uk +# RFC1699 || J. Elliott || elliott@isi.edu +# RFC1700 || J. Reynolds, J. Postel || jkrey@isi.edu, postel@isi.edu +# RFC1701 || S. Hanks, T. Li, D. Farinacci, P. Traina || stan@netsmiths.com, tli@cisco.com, dino@cisco.com, pst@cisco.com +# RFC1702 || S. Hanks, T. Li, D. Farinacci, P. Traina || stan@netsmiths.com, tli@cisco.com, dino@cisco.com, pst@cisco.com +# RFC1703 || M. Rose || mrose17@gmail.com +# RFC1704 || N. Haller, R. Atkinson || +# RFC1705 || R. Carlson, D. Ficarella || RACarlson@anl.gov, ficarell@cpdmfg.cig.mot.com +# RFC1706 || B. Manning, R. Colella || bmanning@isi.edu, colella@nist.gov +# RFC1707 || M. McGovern, R. Ullmann || scrivner@world.std.com, rullmann@crd.lotus.com +# RFC1708 || D. Gowin || drg508@crane-ns.nwscc.sea06.navy.MIL +# RFC1709 || J. Gargano, D. Wasley || jcgargano@ucdavis.edu, dlw@berkeley.edu +# RFC1710 || R. Hinden || bob.hinden@gmail.com +# RFC1711 || J. Houttuin || houttuin@rare.nl +# RFC1712 || C. Farrell, M. Schulze, S. Pleitner, D. Baldoni || craig@cs.curtin.edu.au, mike@cs.curtin.edu.au, pleitner@cs.curtin.edu.au, flint@cs.curtin.edu.au +# RFC1713 || A. Romao || artur@fct.unl.pt +# RFC1714 || S. Williamson, M. Kosters || scottw@internic.net, markk@internic.net +# RFC1715 || C. Huitema || Christian.Huitema@MIRSA.INRIA.FR +# RFC1716 || P. Almquist, F. Kastenholz || +# RFC1717 || K. Sklower, B. Lloyd, G. McGregor, D. Carr || sklower@CS.Berkeley.EDU, brian@lloyd.com, glenn@lloyd.com, dcarr@Newbridge.COM +# RFC1718 || IETF Secretariat, G. Malkin || ietf-info@cnri.reston.va.us, gmalkin@Xylogics.COM +# RFC1719 || P. Gross || phill_gross@mcimail.com +# RFC1720 || J. Postel || +# RFC1721 || G. Malkin || gmalkin@Xylogics.COM +# RFC1722 || G. Malkin || gmalkin@Xylogics.COM +# RFC1723 || G. Malkin || gmalkin@Xylogics.COM +# RFC1724 || G. Malkin, F. Baker || gmalkin@Xylogics.COM, fred@cisco.com +# RFC1725 || J. Myers, M. Rose || mrose17@gmail.com +# RFC1726 || C. Partridge, F. Kastenholz || craig@aland.bbn.com, kasten@ftp.com +# RFC1727 || C. Weider, P. Deutsch || clw@bunyip.com, peterd@bunyip.com +# RFC1728 || C. Weider || clw@bunyip.com +# RFC1729 || C. Lynch || clifford.lynch@ucop.edu +# RFC1730 || M. Crispin || MRC@CAC.Washington.EDU +# RFC1731 || J. Myers || +# RFC1732 || M. Crispin || MRC@CAC.Washington.EDU +# RFC1733 || M. Crispin || MRC@CAC.Washington.EDU +# RFC1734 || J. Myers || +# RFC1735 || J. Heinanen, R. Govindan || Juha.Heinanen@datanet.tele.fi, govindan@isi.edu +# RFC1736 || J. Kunze || jak@violet.berkeley.edu +# RFC1737 || K. Sollins, L. Masinter || masinter@parc.xerox.com, sollins@lcs.mit.edu +# RFC1738 || T. Berners-Lee, L. Masinter, M. McCahill || +# RFC1739 || G. Kessler, S. Shepard || kumquat@hill.com, sds@hill.com +# RFC1740 || P. Faltstrom, D. Crocker, E. Fair || paf@nada.kth.se, dcrocker@mordor.stanford.edu, fair@apple.com +# RFC1741 || P. Faltstrom, D. Crocker, E. Fair || paf@nada.kth.se, dcrocker@mordor.stanford.edu, fair@apple.com +# RFC1742 || S. Waldbusser, K. Frisa || waldbusser@cmu.edu, kfrisa@fore.com +# RFC1743 || K. McCloghrie, E. Decker || kzm@cisco.com, cire@cisco.com +# RFC1744 || G. Huston || Geoff.Huston@aarnet.edu.au +# RFC1745 || K. Varadhan, S. Hares, Y. Rekhter || kannan@isi.edu, skh@merit.edu, yakov@watson.ibm.com +# RFC1746 || B. Manning, D. Perkins || bmanning@isi.edu, dperkins@tenet.edu +# RFC1747 || J. Hilgeman, Chair, S. Nix, A. Bartky, W. Clark, Ed. || jeffh@apertus.com, snix@metaplex.com, alan@sync.com, wclark@cisco.com +# RFC1748 || K. McCloghrie, E. Decker || kzm@cisco.com, cire@cisco.com +# RFC1749 || K. McCloghrie, F. Baker, E. Decker || kzm@cisco.com, fred@cisco.com, cire@cisco.com +# RFC1750 || D. Eastlake 3rd, S. Crocker, J. Schiller || dee@lkg.dec.com, crocker@cybercash.com, jis@mit.edu +# RFC1751 || D. McDonald || danmcd@itd.nrl.navy.mil +# RFC1752 || S. Bradner, A. Mankin || sob@harvard.edu, mankin@isi.edu +# RFC1753 || N. Chiappa || jnc@lcs.mit.edu +# RFC1754 || M. Laubach || laubach@com21.com +# RFC1755 || M. Perez, F. Liaw, A. Mankin, E. Hoffman, D. Grossman, A. Malis || perez@isi.edu, fong@fore.com, mankin@isi.edu, hoffman@isi.edu, dan@merlin.dev.cdx.mot.com, malis@maelstrom.timeplex.com +# RFC1756 || T. Rinne || Timo.Rinne@hut.fi +# RFC1757 || S. Waldbusser || waldbusser@cmu.edu +# RFC1758 || The North American Directory Forum || 0004454742@mcimail.com +# RFC1759 || R. Smith, F. Wright, T. Hastings, S. Zilles, J. Gyllenskog || rlsmith@nb.ppd.ti.com, don@lexmark.com, tom.hastings@alum.mit.edu, szilles@mv.us.adobe.com, jgyllens@hpdmd48.boi.hp.com +# RFC1760 || N. Haller || nmh@bellcore.com +# RFC1761 || B. Callaghan, R. Gilligan || brent.callaghan@eng.sun.com, bob.gilligan@eng.sun.com +# RFC1762 || S. Senum || sjs@digibd.com +# RFC1763 || S. Senum || sjs@digibd.com +# RFC1764 || S. Senum || sjs@digibd.com +# RFC1765 || J. Moy || jmoy@casc.com +# RFC1766 || H. Alvestrand || Harald.T.Alvestrand@uninett.no +# RFC1767 || D. Crocker || +# RFC1768 || D. Marlow || dmarlow@relay.nswc.navy.mil +# RFC1769 || D. Mills || mills@udel.edu +# RFC1770 || C. Graff || bud@fotlan5.fotlan.army.mil +# RFC1771 || Y. Rekhter, T. Li || +# RFC1772 || Y. Rekhter, P. Gross || yakov@watson.ibm.com, 0006423401@mcimail.com +# RFC1773 || P. Traina || pst@cisco.com +# RFC1774 || P. Traina, Ed. || +# RFC1775 || D. Crocker || dcrocker@mordor.stanford.edu +# RFC1776 || S. Crocker || crocker@cybercash.com +# RFC1777 || W. Yeong, T. Howes, S. Kille || yeongw@psilink.com, tim@umich.edu, S.Kille@isode.com +# RFC1778 || T. Howes, S. Kille, W. Yeong, C. Robbins || tim@umich.edu, S.Kille@isode.com, yeongw@psilink.com +# RFC1779 || S. Kille || S.Kille@ISODE.COM +# RFC1780 || J. Postel, Ed. || +# RFC1781 || S. Kille || S.Kille@ISODE.COM +# RFC1782 || G. Malkin, A. Harkin || gmalkin@xylogics.com, ash@cup.hp.com +# RFC1783 || G. Malkin, A. Harkin || gmalkin@xylogics.com, ash@cup.hp.com +# RFC1784 || G. Malkin, A. Harkin || gmalkin@xylogics.com, ash@cup.hp.com +# RFC1785 || G. Malkin, A. Harkin || gmalkin@xylogics.com, ash@cup.hp.com +# RFC1786 || T. Bates, E. Gerich, L. Joncheray, J-M. Jouanigot, D. Karrenberg, M. Terpstra, J. Yu || +# RFC1787 || Y. Rekhter || +# RFC1788 || W. Simpson || +# RFC1789 || C. Yang || cqyang@cs.unt.edu +# RFC1790 || V. Cerf || vcerf@isoc.org +# RFC1791 || T. Sung || tae@novell.Com +# RFC1792 || T. Sung || tae@novell.Com +# RFC1793 || J. Moy || jmoy@casc.com +# RFC1794 || T. Brisco || brisco@rutgers.edu +# RFC1795 || L. Wells, Chair, A. Bartky, Ed. || +# RFC1796 || C. Huitema, J. Postel, S. Crocker || Christian.Huitema@MIRSA.INRIA.FR, Postel@ISI.EDU, crocker@cybercash.com +# RFC1797 || Internet Assigned Numbers Authority (IANA) || iana@isi.edu +# RFC1798 || A. Young || A.Young@isode.com +# RFC1799 || M. Kennedy || MKENNEDY@ISI.EDU +# RFC1800 || J. Postel, Ed. || +# RFC1801 || S. Kille || S.Kille@ISODE.COM +# RFC1802 || H. Alvestrand, K. Jordan, S. Langlois, J. Romaguera || Harald.T.Alvestrand@uninett.no, Kevin.E.Jordan@cdc.com, Sylvain.Langlois@der.edf.fr, Romaguera@NetConsult.ch +# RFC1803 || R. Wright, A. Getchell, T. Howes, S. Sataluri, P. Yee, W. Yeong || +# RFC1804 || G. Mansfield, P. Rajeev, S. Raghavan, T. Howes || glenn@aic.co.jp, rajeev%hss@lando.hns.com, svr@iitm.ernet.in, tim@umich.edu +# RFC1805 || A. Rubin || rubin@bellcore.com +# RFC1806 || R. Troost, S. Dorner || rens@century.com, sdorner@qualcomm.com +# RFC1807 || R. Lasher, D. Cohen || rlasher@forsythe.stanford.edu, Cohen@myri.com +# RFC1808 || R. Fielding || fielding@ics.uci.edu +# RFC1809 || C. Partridge || craig@aland.bbn.com +# RFC1810 || J. Touch || touch@isi.edu +# RFC1811 || Federal Networking Council || execdir@fnc.gov +# RFC1812 || F. Baker, Ed. || +# RFC1813 || B. Callaghan, B. Pawlowski, P. Staubach || brent.callaghan@eng.sun.com, beepy@netapp.com, peter.staubach@eng.sun.com +# RFC1814 || E. Gerich || epg@merit.edu +# RFC1815 || M. Ohta || mohta@cc.titech.ac.jp +# RFC1816 || Federal Networking Council || execdir@fnc.gov +# RFC1817 || Y. Rekhter || yakov@cisco.com +# RFC1818 || J. Postel, T. Li, Y. Rekhter || postel@isi.edu, yakov@cisco.com, tli@cisco.com +# RFC1819 || L. Delgrossi, Ed., L. Berger, Ed. || lberger@bbn.com, luca@andersen.fr, dat@bbn.com, stevej@syzygycomm.com, schaller@heidelbg.ibm.com +# RFC1820 || E. Huizer || Erik.Huizer@SURFnet.nl +# RFC1821 || M. Borden, E. Crawley, B. Davie, S. Batsell || +# RFC1822 || J. Lowe || +# RFC1823 || T. Howes, M. Smith || tim@umich.edu, mcs@umich.edu +# RFC1824 || H. Danisch || danisch@ira.uka.de +# RFC1825 || R. Atkinson || +# RFC1826 || R. Atkinson || +# RFC1827 || R. Atkinson || +# RFC1828 || P. Metzger, W. Simpson || +# RFC1829 || P. Karn, P. Metzger, W. Simpson || +# RFC1830 || G. Vaudreuil || Greg.Vaudreuil@Octel.com +# RFC1831 || R. Srinivasan || raj@eng.sun.com +# RFC1832 || R. Srinivasan || raj@eng.sun.com +# RFC1833 || R. Srinivasan || raj@eng.sun.com +# RFC1834 || J. Gargano, K. Weiss || jcgargano@ucdavis.edu, krweiss@ucdavis.edu +# RFC1835 || P. Deutsch, R. Schoultz, P. Faltstrom, C. Weider || peterd@bunyip.com, schoultz@sunet.se, paf@bunyip.com, clw@bunyip.com +# RFC1836 || S. Kille || S.Kille@ISODE.COM +# RFC1837 || S. Kille || S.Kille@ISODE.COM +# RFC1838 || S. Kille || S.Kille@ISODE.COM +# RFC1839 || || +# RFC1840 || || +# RFC1841 || J. Chapman, D. Coli, A. Harvey, B. Jensen, K. Rowett || joelle@cisco.com, dcoli@cisco.com, agh@cisco.com, bent@cisco.com, krowett@cisco.com +# RFC1842 || Y. Wei, Y. Zhang, J. Li, J. Ding, Y. Jiang || HZRFC@usai.asiainfo.com, zhang@orion.harvard.edu, jian@is.rice.edu, ding@Beijing.AsiaInfo.com, yjj@eng.umd.edu +# RFC1843 || F. Lee || lee@csl.stanford.edu +# RFC1844 || E. Huizer || Erik.Huizer@SURFnet.nl +# RFC1845 || D. Crocker, N. Freed, A. Cargille || dcrocker@mordor.stanford.edu, ned@innosoft.com +# RFC1846 || A. Durand, F. Dupont || Alain.Durand@imag.fr, Francis.Dupont@inria.fr +# RFC1847 || J. Galvin, S. Murphy, S. Crocker, N. Freed || galvin@tis.com, sandy@tis.com, crocker@cybercash.com, ned@innosoft.com +# RFC1848 || S. Crocker, N. Freed, J. Galvin, S. Murphy || crocker@cybercash.com, galvin@tis.com, murphy@tis.com, ned@innosoft.com +# RFC1849 || H. Spencer || henry@zoo.utoronto.ca +# RFC1850 || F. Baker, R. Coltun || fred@cisco.com, rcoltun@rainbow-bridge.com +# RFC1851 || P. Karn, P. Metzger, W. Simpson || +# RFC1852 || P. Metzger, W. Simpson || +# RFC1853 || W. Simpson || +# RFC1854 || N. Freed || ned@innosoft.com +# RFC1855 || S. Hambridge || sallyh@ludwig.sc.intel.com +# RFC1856 || H. Clark || henryc@bbnplanet.com +# RFC1857 || M. Lambert || lambert@psc.edu +# RFC1858 || G. Ziemba, D. Reed, P. Traina || paul@alantec.com, darrenr@cyber.com.au, pst@cisco.com +# RFC1859 || Y. Pouffary || pouffary@taec.enet.dec.com +# RFC1860 || T. Pummill, B. Manning || trop@alantec.com, bmanning@isi.edu +# RFC1861 || A. Gwinn || allen@mail.cox.smu.edu +# RFC1862 || M. McCahill, J. Romkey, M. Schwartz, K. Sollins, T. Verschuren, C. Weider || mpm@boombox.micro.umn.edu, romkey@apocalypse.org, schwartz@cs.colorado.edu, sollins@lcs.mit.edu, Ton.Verschuren@surfnet.nl, clw@bunyip.com +# RFC1863 || D. Haskin || dhaskin@baynetworks.com +# RFC1864 || J. Myers, M. Rose || mrose17@gmail.com +# RFC1865 || W. Houser, J. Griffin, C. Hage || houser.walt@forum.va.gov, agriffin@cpcug.org, carl@chage.com +# RFC1866 || T. Berners-Lee, D. Connolly || timbl@w3.org, connolly@w3.org +# RFC1867 || E. Nebel, L. Masinter || masinter@parc.xerox.com, nebel@xsoft.sd.xerox.com +# RFC1868 || G. Malkin || gmalkin@xylogics.com +# RFC1869 || J. Klensin, N. Freed, M. Rose, E. Stefferud, D. Crocker || klensin@mci.net, ned@innosoft.com, mrose17@gmail.com, stef@nma.com, dcrocker@mordor.stanford.edu +# RFC1870 || J. Klensin, N. Freed, K. Moore || klensin@mci.net, ned@innosoft.com, moore@cs.utk.edu +# RFC1871 || J. Postel || postel@isi.edu +# RFC1872 || E. Levinson || ELevinson@Accurate.com +# RFC1873 || E. Levinson || +# RFC1874 || E. Levinson || ELevinson@Accurate.com +# RFC1875 || N. Berge || Nils.Harald.Berge@nr.no +# RFC1876 || C. Davis, P. Vixie, T. Goodwin, I. Dickinson || ckd@kei.com, paul@vix.com, tim@pipex.net, idickins@fore.co.uk +# RFC1877 || S. Cobb || stevec@microsoft.com +# RFC1878 || T. Pummill, B. Manning || trop@alantec.com, bmanning@isi.edu +# RFC1879 || B. Manning, Ed. || +# RFC1880 || J. Postel, Ed. || +# RFC1881 || IAB, IESG || +# RFC1882 || B. Hancock || hancock@network-1.com +# RFC1883 || S. Deering, R. Hinden || bob.hinden@gmail.com +# RFC1884 || R. Hinden, Ed., S. Deering, Ed. || bob.hinden@gmail.com +# RFC1885 || A. Conta, S. Deering || deering@parc.xerox.com +# RFC1886 || S. Thomson, C. Huitema || set@thumper.bellcore.com, Christian.Huitema@MIRSA.INRIA.FR +# RFC1887 || Y. Rekhter, Ed., T. Li, Ed. || +# RFC1888 || J. Bound, B. Carpenter, D. Harrington, J. Houldsworth, A. Lloyd || +# RFC1889 || Audio-Video Transport Working Group, H. Schulzrinne, S. Casner, R. Frederick, V. Jacobson || schulzrinne@fokus.gmd.de, casner@precept.com, frederic@parc.xerox.com, van@ee.lbl.gov +# RFC1890 || Audio-Video Transport Working Group, H. Schulzrinne || schulzrinne@fokus.gmd.de +# RFC1891 || K. Moore || moore@cs.utk.edu +# RFC1892 || G. Vaudreuil || Greg.Vaudreuil@Octel.com +# RFC1893 || G. Vaudreuil || Greg.Vaudreuil@Octel.com +# RFC1894 || K. Moore, G. Vaudreuil || moore@cs.utk.edu, Greg.Vaudreuil@Octel.Com +# RFC1895 || E. Levinson || ELevinson@Accurate.com +# RFC1896 || P. Resnick, A. Walker || presnick@qti.qualcomm.com, amanda@intercon.com +# RFC1897 || R. Hinden, J. Postel || bob.hinden@gmail.com, postel@isi.edu +# RFC1898 || D. Eastlake 3rd, B. Boesch, S. Crocker, M. Yesil || dee@cybercash.com, boesch@cybercash.com, crocker@cybercash.com, magdalen@cybercash.com +# RFC1899 || J. Elliott || elliott@isi.edu +# RFC1900 || B. Carpenter, Y. Rekhter || brian@dxcoms.cern.ch, yakov@cisco.com +# RFC1901 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1902 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1903 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1904 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1905 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1906 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1907 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1908 || J. Case, K. McCloghrie, M. Rose, S. Waldbusser || +# RFC1909 || K. McCloghrie, Ed. || +# RFC1910 || G. Waters, Ed. || +# RFC1911 || G. Vaudreuil || Greg.Vaudreuil@Octel.Com +# RFC1912 || D. Barr || barr@math.psu.edu +# RFC1913 || C. Weider, J. Fullton, S. Spero || clw@bunyip.com, fullton@cnidr.org, ses@eit.com +# RFC1914 || P. Faltstrom, R. Schoultz, C. Weider || paf@bunyip.com, schoultz@sunet.se, clw@bunyip.com +# RFC1915 || F. Kastenholz || kasten@ftp.com +# RFC1916 || H. Berkowitz, P. Ferguson, W. Leland, P. Nesser || hcb@clark.net, pferguso@cisco.com, wel@bellcore.com, pjnesser@rocket.com +# RFC1917 || P. Nesser II || pjnesser@martigny.ai.mit.edu +# RFC1918 || Y. Rekhter, B. Moskowitz, D. Karrenberg, G. J. de Groot, E. Lear || yakov@cisco.com, rgm3@is.chrysler.com, Daniel.Karrenberg@ripe.net, GeertJan.deGroot@ripe.net, lear@sgi.com +# RFC1919 || M. Chatel || mchatel@pax.eunet.ch +# RFC1920 || J. Postel || +# RFC1921 || J. Dujonc || J.Y.Dujonc@frcl.bull.fr +# RFC1922 || HF. Zhu, DY. Hu, ZG. Wang, TC. Kao, WCH. Chang, M. Crispin || zhf@net.tsinghua.edu.cn, hdy@tsinghua.edu.cn, tckao@iiidns.iii.org.tw, chung@iiidns.iii.org.tw, MRC@CAC.Washington.EDU +# RFC1923 || J. Halpern, S. Bradner || jhalpern@newbridge.com, sob@harvard.edu +# RFC1924 || R. Elz || kre@munnari.OZ.AU +# RFC1925 || R. Callon || rcallon@baynetworks.com +# RFC1926 || J. Eriksson || bygg@sunet.se +# RFC1927 || C. Rogers || rogers@isi.edu +# RFC1928 || M. Leech, M. Ganis, Y. Lee, R. Kuris, D. Koblas, L. Jones || mleech@bnr.ca +# RFC1929 || M. Leech || mleech@bnr.ca +# RFC1930 || J. Hawkinson, T. Bates || jhawk@bbnplanet.com, Tony.Bates@mci.net +# RFC1931 || D. Brownell || dbrownell@sun.com +# RFC1932 || R. Cole, D. Shur, C. Villamizar || rgc@qsun.att.com, d.shur@att.com, curtis@ans.net +# RFC1933 || R. Gilligan, E. Nordmark || Bob.Gilligan@Eng.Sun.COM, Erik.Nordmark@Eng.Sun.COM +# RFC1934 || K. Smith || ksmith@ascend.com +# RFC1935 || J. Quarterman, S. Carl-Mitchell || tic@tic.com +# RFC1936 || J. Touch, B. Parham || touch@isi.edu, bparham@isi.edu +# RFC1937 || Y. Rekhter, D. Kandlur || yakov@cisco.com, kandlur@watson.ibm.com +# RFC1938 || N. Haller, C. Metz || +# RFC1939 || J. Myers, M. Rose || mrose17@gmail.com +# RFC1940 || D. Estrin, T. Li, Y. Rekhter, K. Varadhan, D. Zappala || estrin@isi.edu, tli@cisco.com, yakov@cisco.com, kannan@isi.edu, daniel@isi.edu +# RFC1941 || J. Sellers, J. Robichaux || julier@internic.net, sellers@quest.arc.nasa.gov +# RFC1942 || D. Raggett || dsr@w3.org +# RFC1943 || B. Jennings || jennings@sandia.gov +# RFC1944 || S. Bradner, J. McQuaid || +# RFC1945 || T. Berners-Lee, R. Fielding, H. Frystyk || timbl@w3.org, fielding@ics.uci.edu, frystyk@w3.org +# RFC1946 || S. Jackowski || Stevej@NetManage.com +# RFC1947 || D. Spinellis || D.Spinellis@senanet.com +# RFC1948 || S. Bellovin || smb@research.att.com +# RFC1949 || A. Ballardie || A.Ballardie@cs.ucl.ac.uk +# RFC1950 || P. Deutsch, J-L. Gailly || +# RFC1951 || P. Deutsch || +# RFC1952 || P. Deutsch || +# RFC1953 || P. Newman, W. Edwards, R. Hinden, E. Hoffman, F. Ching Liaw, T. Lyon, G. Minshall || bob.hinden@gmail.com +# RFC1954 || P. Newman, W. Edwards, R. Hinden, E. Hoffman, F. Ching Liaw, T. Lyon, G. Minshall || bob.hinden@gmail.com +# RFC1955 || R. Hinden || bob.hinden@gmail.com +# RFC1956 || D. Engebretson, R. Plzak || engebred@ncr.disa.mil, plzak@nic.ddn.mil +# RFC1957 || R. Nelson || nelson@crynwr.com +# RFC1958 || B. Carpenter, Ed. || +# RFC1959 || T. Howes, M. Smith || tim@umich.edu, mcs@umich.edu +# RFC1960 || T. Howes || tim@umich.edu +# RFC1961 || P. McMahon || p.v.mcmahon@rea0803.wins.icl.co.uk +# RFC1962 || D. Rand || dlr@daver.bungi.com +# RFC1963 || K. Schneider, S. Venters || kevin@adtran.com, sventers@adtran.com +# RFC1964 || J. Linn || +# RFC1965 || P. Traina || pst@cisco.com +# RFC1966 || T. Bates, R. Chandra || tbates@cisco.com, rchandra@cisco.com +# RFC1967 || K. Schneider, R. Friend || kschneider@adtran.com, rfriend@stac.com +# RFC1968 || G. Meyer || gerry@spider.co.uk +# RFC1969 || K. Sklower, G. Meyer || sklower@CS.Berkeley.EDU, gerry@spider.co.uk +# RFC1970 || T. Narten, E. Nordmark, W. Simpson || +# RFC1971 || S. Thomson, T. Narten || +# RFC1972 || M. Crawford || crawdad@fnal.gov +# RFC1973 || W. Simpson || +# RFC1974 || R. Friend, W. Simpson || rfriend@stac.com +# RFC1975 || D. Schremp, J. Black, J. Weiss || dhs@magna.telco.com, jtb@magna.telco.com, jaw@magna.telco.com +# RFC1976 || K. Schneider, S. Venters || kevin@adtran.com, sventers@adtran.com +# RFC1977 || V. Schryver || vjs@rhyolite.com +# RFC1978 || D. Rand || dave_rand@novell.com +# RFC1979 || J. Woods || jfw@funhouse.com +# RFC1980 || J. Seidman || jim@spyglass.com +# RFC1981 || J. McCann, S. Deering, J. Mogul || deering@parc.xerox.com, mogul@pa.dec.com +# RFC1982 || R. Elz, R. Bush || randy@psg.com +# RFC1983 || G. Malkin, Ed. || +# RFC1984 || IAB, IESG || brian@dxcoms.cern.ch, fred@cisco.com +# RFC1985 || J. De Winter || jack@wildbear.on.ca +# RFC1986 || W. Polites, W. Wollman, D. Woo, R. Langan || +# RFC1987 || P. Newman, W. Edwards, R. Hinden, E. Hoffman, F. Ching Liaw, T. Lyon, G. Minshall || bob.hinden@gmail.com +# RFC1988 || G. McAnally, D. Gilbert, J. Flick || johnf@hprnd.rose.hp.com +# RFC1989 || W. Simpson || +# RFC1990 || K. Sklower, B. Lloyd, G. McGregor, D. Carr, T. Coradetti || sklower@CS.Berkeley.EDU, brian@lloyd.com, glenn@lloyd.com, dcarr@Newbridge.COM, 70761.1664@compuserve.com +# RFC1991 || D. Atkins, W. Stallings, P. Zimmermann || warlord@MIT.EDU, stallings@ACM.org, prz@acm.org +# RFC1992 || I. Castineyra, N. Chiappa, M. Steenstrup || isidro@bbn.com, gnc@ginger.lcs.mit.edu, msteenst@bbn.com +# RFC1993 || A. Barbir, D. Carr, W. Simpson || +# RFC1994 || W. Simpson || +# RFC1995 || M. Ohta || mohta@necom830.hpcl.titech.ac.jp +# RFC1996 || P. Vixie || paul@vix.com +# RFC1997 || R. Chandra, P. Traina, T. Li || pst@cisco.com, rchandra@cisco.com, tli@skat.usc.edu +# RFC1998 || E. Chen, T. Bates || enke@mci.net, tbates@cisco.com +# RFC1999 || J. Elliott || elliott@isi.edu +# RFC2000 || J. Postel, Ed. || +# RFC2001 || W. Stevens || rstevens@noao.edu +# RFC2002 || C. Perkins, Ed. || +# RFC2003 || C. Perkins || perk@watson.ibm.com, solomon@comm.mot.com +# RFC2004 || C. Perkins || perk@watson.ibm.com, solomon@comm.mot.com +# RFC2005 || J. Solomon || solomon@comm.mot.com +# RFC2006 || D. Cong, M. Hamlen, C. Perkins || +# RFC2007 || J. Foster, M. Isaacs, M. Prior || Jill.Foster@newcastle.ac.uk, mmi@dcs.gla.ac.uk, mrp@connect.com.au +# RFC2008 || Y. Rekhter, T. Li || yakov@cisco.com, tli@cisco.com +# RFC2009 || T. Imielinski, J. Navas || +# RFC2010 || B. Manning, P. Vixie || bmanning@isi.edu, paul@vix.com +# RFC2011 || K. McCloghrie, Ed. || +# RFC2012 || K. McCloghrie, Ed. || +# RFC2013 || K. McCloghrie, Ed. || +# RFC2014 || A. Weinrib, J. Postel || +# RFC2015 || M. Elkins || +# RFC2016 || L. Daigle, P. Deutsch, B. Heelan, C. Alpaugh, M. Maclachlan || ura-bunyip@bunyip.com +# RFC2017 || N. Freed, K. Moore, A. Cargille || ned@innosoft.com, moore@cs.utk.edu +# RFC2018 || M. Mathis, J. Mahdavi, S. Floyd, A. Romanow || +# RFC2019 || M. Crawford || crawdad@fnal.gov +# RFC2020 || J. Flick || +# RFC2021 || S. Waldbusser || waldbusser@ins.com +# RFC2022 || G. Armitage || gja@thumper.bellcore.com +# RFC2023 || D. Haskin, E. Allen || +# RFC2024 || D. Chen, Ed., P. Gayek, S. Nix || dchen@vnet.ibm.com, gayek@vnet.ibm.com, snix@metaplex.com +# RFC2025 || C. Adams || cadams@bnr.ca +# RFC2026 || S. Bradner || +# RFC2027 || J. Galvin || +# RFC2028 || R. Hovey, S. Bradner || hovey@wnpv01.enet.dec.com, sob@harvard.edu +# RFC2029 || M. Speer, D. Hoffman || michael.speer@eng.sun.com, don.hoffman@eng.sun.com +# RFC2030 || D. Mills || +# RFC2031 || E. Huizer || +# RFC2032 || T. Turletti, C. Huitema || turletti@sophia.inria.fr, huitema@bellcore.com +# RFC2033 || J. Myers || +# RFC2034 || N. Freed || +# RFC2035 || L. Berc, W. Fenner, R. Frederick, S. McCanne || berc@pa.dec.com, fenner@cmf.nrl.navy.mil, frederick@parc.xerox.com, mccanne@ee.lbl.gov +# RFC2036 || G. Huston || +# RFC2037 || K. McCloghrie, A. Bierman || kzm@cisco.com, andy@yumaworks.com +# RFC2038 || D. Hoffman, G. Fernando, V. Goyal || gerard.fernando@eng.sun.com, goyal@precept.com, don.hoffman@eng.sun.com +# RFC2039 || C. Kalbfleisch || +# RFC2040 || R. Baldwin, R. Rivest || baldwin@rsa.com, rivest@theory.lcs.mit.edu +# RFC2041 || B. Noble, G. Nguyen, M. Satyanarayanan, R. Katz || bnoble@cs.cmu.edu, gnguyen@cs.berkeley.edu, satya@cs.cmu.edu, randy@cs.berkeley.edu +# RFC2042 || B. Manning || bmanning@isi.edu +# RFC2043 || A. Fuqua || fuqua@vnet.ibm.com +# RFC2044 || F. Yergeau || fyergeau@alis.com +# RFC2045 || N. Freed, N. Borenstein || ned@innosoft.com, nsb@nsb.fv.com, Greg.Vaudreuil@Octel.Com +# RFC2046 || N. Freed, N. Borenstein || ned@innosoft.com, nsb@nsb.fv.com, Greg.Vaudreuil@Octel.Com +# RFC2047 || K. Moore || moore@cs.utk.edu +# RFC2048 || N. Freed, J. Klensin, J. Postel || ned@innosoft.com, klensin@mci.net, Postel@ISI.EDU +# RFC2049 || N. Freed, N. Borenstein || ned@innosoft.com, nsb@nsb.fv.com, Greg.Vaudreuil@Octel.Com +# RFC2050 || K. Hubbard, M. Kosters, D. Conrad, D. Karrenberg, J. Postel || kimh@internic.net, markk@internic.net, davidc@APNIC.NET, dfk@RIPE.NET, Postel@ISI.EDU +# RFC2051 || M. Allen, B. Clouston, Z. Kielczewski, W. Kwan, B. Moore || mallen@hq.walldata.com, clouston@cisco.com, zbig@cisco.com, billk@jti.com, remoore@ralvm6.vnet.ibm.com +# RFC2052 || A. Gulbrandsen, P. Vixie || agulbra@troll.no, paul@vix.com +# RFC2053 || E. Der-Danieliantz || edd@acm.org +# RFC2054 || B. Callaghan || brent.callaghan@eng.sun.com +# RFC2055 || B. Callaghan || brent.callaghan@eng.sun.com +# RFC2056 || R. Denenberg, J. Kunze, D. Lynch || +# RFC2057 || S. Bradner || sob@harvard.edu +# RFC2058 || C. Rigney, A. Rubens, W. Simpson, S. Willens || cdr@livingston.com, acr@merit.edu, wsimpson@greendragon.com, steve@livingston.com +# RFC2059 || C. Rigney || cdr@livingston.com +# RFC2060 || M. Crispin || MRC@CAC.Washington.EDU +# RFC2061 || M. Crispin || MRC@CAC.Washington.EDU +# RFC2062 || M. Crispin || MRC@CAC.Washington.EDU +# RFC2063 || N. Brownlee, C. Mills, G. Ruth || cmills@bbn.com, gruth@gte.com +# RFC2064 || N. Brownlee || +# RFC2065 || D. Eastlake 3rd, C. Kaufman || dee@cybercash.com, charlie_kaufman@iris.com +# RFC2066 || R. Gellens || Randy@MV.Unisys.Com +# RFC2067 || J. Renwick || jkr@NetStar.com +# RFC2068 || R. Fielding, J. Gettys, J. Mogul, H. Frystyk, T. Berners-Lee || fielding@ics.uci.edu, jg@w3.org, mogul@wrl.dec.com, frystyk@w3.org, timbl@w3.org +# RFC2069 || J. Franks, P. Hallam-Baker, J. Hostetler, P. Leach, A. Luotonen, E. Sink, L. Stewart || john@math.nwu.edu, hallam@w3.org, jeff@spyglass.com, paulle@microsoft.com, luotonen@netscape.com, eric@spyglass.com, stewart@OpenMarket.com +# RFC2070 || F. Yergeau, G. Nicol, G. Adams, M. Duerst || fyergeau@alis.com, gtn@ebt.com, glenn@spyglass.com, mduerst@ifi.unizh.ch +# RFC2071 || P. Ferguson, H. Berkowitz || pferguso@cisco.com, hcb@clark.net +# RFC2072 || H. Berkowitz || hcb@clark.net +# RFC2073 || Y. Rekhter, P. Lothberg, R. Hinden, S. Deering, J. Postel || bob.hinden@gmail.com +# RFC2074 || A. Bierman, R. Iddon || andy@yumaworks.com, robin_iddon@3mail.3com.com +# RFC2075 || C. Partridge || craig@bbn.com +# RFC2076 || J. Palme || +# RFC2077 || S. Nelson, C. Parks, Mitra || +# RFC2078 || J. Linn || John.Linn@ov.com +# RFC2079 || M. Smith || mcs@netscape.com +# RFC2080 || G. Malkin, R. Minnear || gmalkin@Xylogics.COM, minnear@ipsilon.com +# RFC2081 || G. Malkin || gmalkin@xylogics.com +# RFC2082 || F. Baker, R. Atkinson || rja@cisco.com +# RFC2083 || T. Boutell || boutell@boutell.com +# RFC2084 || G. Bossert, S. Cooper, W. Drummond || bossert@corp.sgi.com, sc@corp.sgi.com, drummond@ieee.org +# RFC2085 || M. Oehler, R. Glenn || mjo@tycho.ncsc.mil, rob.glenn@nist.gov +# RFC2086 || J. Myers || +# RFC2087 || J. Myers || +# RFC2088 || J. Myers || +# RFC2089 || B. Wijnen, D. Levi || +# RFC2090 || A. Emberson || tom@lanworks.com +# RFC2091 || G. Meyer, S. Sherry || +# RFC2092 || S. Sherry, G. Meyer || +# RFC2093 || H. Harney, C. Muckenhirn || +# RFC2094 || H. Harney, C. Muckenhirn || +# RFC2095 || J. Klensin, R. Catoe, P. Krumviede || klensin@mci.net, randy@mci.net, paul@mci.net +# RFC2096 || F. Baker || fred@cisco.com +# RFC2097 || G. Pall || gurdeep@microsoft.com +# RFC2098 || Y. Katsube, K. Nagami, H. Esaki || +# RFC2099 || J. Elliott || elliott@isi.edu +# RFC2100 || J. Ashworth || jra@scfn.thpl.lib.fl.us +# RFC2101 || B. Carpenter, J. Crowcroft, Y. Rekhter || brian@dxcoms.cern.ch, j.crowcroft@cs.ucl.ac.uk, yakov@cisco.com +# RFC2102 || R. Ramanathan || ramanath@bbn.com +# RFC2103 || R. Ramanathan || +# RFC2104 || H. Krawczyk, M. Bellare, R. Canetti || hugo@watson.ibm.com, mihir@cs.ucsd.edu, canetti@watson.ibm.com +# RFC2105 || Y. Rekhter, B. Davie, D. Katz, E. Rosen, G. Swallow || yakov@cisco.com, bsd@cisco.com, dkatz@cisco.com, erosen@cisco.com, swallow@cisco.com +# RFC2106 || S. Chiang, J. Lee, H. Yasuda || schiang@cisco.com, jolee@cisco.com, yasuda@eme068.cow.melco.co.jp +# RFC2107 || K. Hamzeh || kory@ascend.com +# RFC2108 || K. de Graaf, D. Romascanu, D. McMaster, K. McCloghrie || kdegraaf@isd.3com.com, dromasca@gmail.com , mcmaster@cisco.com, kzm@cisco.com +# RFC2109 || D. Kristol, L. Montulli || +# RFC2110 || J. Palme, A. Hopmann || +# RFC2111 || E. Levinson || +# RFC2112 || E. Levinson || +# RFC2113 || D. Katz || +# RFC2114 || S. Chiang, J. Lee, H. Yasuda || schiang@cisco.com, jolee@cisco.com, yasuda@eme068.cow.melco.co.jp +# RFC2115 || C. Brown, F. Baker || +# RFC2116 || C. Apple, K. Rossen || +# RFC2117 || D. Estrin, D. Farinacci, A. Helmy, D. Thaler, S. Deering, M. Handley, V. Jacobson, C. Liu, P. Sharma, L. Wei || +# RFC2118 || G. Pall || +# RFC2119 || S. Bradner || +# RFC2120 || D. Chadwick || +# RFC2121 || G. Armitage || gja@thumper.bellcore.com +# RFC2122 || D. Mavrakis, H. Layec, K. Kartmann || +# RFC2123 || N. Brownlee || +# RFC2124 || P. Amsden, J. Amweg, P. Calato, S. Bensley, G. Lyons || amsden@ctron.com, amsden@ctron.com, amsden@ctron.com, amsden@ctron.com, amsden@ctron.com +# RFC2125 || C. Richards, K. Smith || +# RFC2126 || Y. Pouffary, A. Young || pouffary@taec.enet.dec.com, A.Young@isode.com +# RFC2127 || G. Roeck, Ed. || groeck@cisco.com +# RFC2128 || G. Roeck, Ed. || groeck@cisco.com +# RFC2129 || K. Nagami, Y. Katsube, Y. Shobatake, A. Mogi, S. Matsuzawa, T. Jinmei, H. Esaki || +# RFC2130 || C. Weider, C. Preston, K. Simonsen, H. Alvestrand, R. Atkinson, M. Crispin, P. Svanberg || cweider@microsoft.com, cecilia@well.com, Keld@dkuug.dk, Harald.T.Alvestrand@uninett.no, rja@cisco.com, mrc@cac.washington.edu, psv@nada.kth.se +# RFC2131 || R. Droms || droms@bucknell.edu +# RFC2132 || S. Alexander, R. Droms || sca@engr.sgi.com, droms@bucknell.edu +# RFC2133 || R. Gilligan, S. Thomson, J. Bound, W. Stevens || gilligan@freegate.net, set@thumper.bellcore.com, rstevens@kohala.com +# RFC2134 || ISOC Board of Trustees || +# RFC2135 || ISOC Board of Trustees || +# RFC2136 || P. Vixie, Ed., S. Thomson, Y. Rekhter, J. Bound || yakov@cisco.com, set@thumper.bellcore.com, bound@zk3.dec.com, paul@vix.com +# RFC2137 || D. Eastlake 3rd || dee@cybercash.com +# RFC2138 || C. Rigney, A. Rubens, W. Simpson, S. Willens || cdr@livingston.com, acr@merit.edu, wsimpson@greendragon.com, steve@livingston.com +# RFC2139 || C. Rigney || cdr@livingston.com +# RFC2140 || J. Touch || +# RFC2141 || R. Moats || +# RFC2142 || D. Crocker || +# RFC2143 || B. Elliston || +# RFC2144 || C. Adams || +# RFC2145 || J. C. Mogul, R. Fielding, J. Gettys, H. Frystyk || +# RFC2146 || Federal Networking Council || execdir@fnc.gov +# RFC2147 || D. Borman || +# RFC2148 || H. Alvestrand, P. Jurg || +# RFC2149 || R. Talpade, M. Ammar || +# RFC2150 || J. Max, W. Stickle || jlm@rainfarm.com, wls@rainfarm.com +# RFC2151 || G. Kessler, S. Shepard || +# RFC2152 || D. Goldsmith, M. Davis || goldsmith@apple.com, mark_davis@taligent.com +# RFC2153 || W. Simpson || +# RFC2154 || S. Murphy, M. Badger, B. Wellington || +# RFC2155 || B. Clouston, B. Moore || +# RFC2156 || S. Kille || +# RFC2157 || H. Alvestrand || Harald.T.Alvestrand@uninett.no +# RFC2158 || H. Alvestrand || Harald.T.Alvestrand@uninett.no +# RFC2159 || H. Alvestrand || Harald.T.Alvestrand@uninett.no +# RFC2160 || H. Alvestrand || Harald.T.Alvestrand@uninett.no +# RFC2161 || H. Alvestrand || Harald.T.Alvestrand@uninett.no +# RFC2162 || C. Allocchio || Claudio.Allocchio@elettra.Trieste.it +# RFC2163 || C. Allocchio || +# RFC2164 || S. Kille || S.Kille@ISODE.COM +# RFC2165 || J. Veizades, E. Guttman, C. Perkins, S. Kaplan || cperkins@Corp.sun.com +# RFC2166 || D. Bryant, P. Brittain || +# RFC2167 || S. Williamson, M. Kosters, D. Blacka, J. Singh, K. Zeilstra || +# RFC2168 || R. Daniel, M. Mealling || +# RFC2169 || R. Daniel || +# RFC2170 || W. Almesberger, J. Le Boudec, P. Oechslin || +# RFC2171 || K. Murakami, M. Maruyama || +# RFC2172 || M. Maruyama, K. Murakami || +# RFC2173 || K. Murakami, M. Maruyama || +# RFC2174 || K. Murakami, M. Maruyama || +# RFC2175 || K. Murakami, M. Maruyama || +# RFC2176 || K. Murakami, M. Maruyama || +# RFC2177 || B. Leiba || +# RFC2178 || J. Moy || jmoy@casc.com +# RFC2179 || A. Gwinn || allen@mail.cox.smu.edu, ssh@wwsi.com +# RFC2180 || M. Gahrns || mikega@microsoft.com +# RFC2181 || R. Elz, R. Bush || kre@munnari.OZ.AU, randy@psg.com +# RFC2182 || R. Elz, R. Bush, S. Bradner, M. Patton || kre@munnari.OZ.AU, randy@psg.com, sob@harvard.edu, MAP@POBOX.COM +# RFC2183 || R. Troost, S. Dorner, K. Moore, Ed. || rens@century.com, sdorner@qualcomm.com +# RFC2184 || N. Freed, K. Moore || +# RFC2185 || R. Callon, D. Haskin || +# RFC2186 || D. Wessels, K. Claffy || wessels@nlanr.net, kc@nlanr.net +# RFC2187 || D. Wessels, K. Claffy || wessels@nlanr.net, kc@nlanr.net +# RFC2188 || M. Banan, M. Taylor, J. Cheng || +# RFC2189 || A. Ballardie || +# RFC2190 || C. Zhu || czhu@ibeam.intel.com +# RFC2191 || G. Armitage || gja@dnrc.bell-labs.com +# RFC2192 || C. Newman || chris.newman@innosoft.com +# RFC2193 || M. Gahrns || mikega@microsoft.com +# RFC2194 || B. Aboba, J. Lu, J. Alsop, J. Ding, W. Wang || bernarda@microsoft.com, juanlu@aimnet.net, jalsop@ipass.com, ding@bjai.asiainfo.com, weiwang@merit.edu +# RFC2195 || J. Klensin, R. Catoe, P. Krumviede || klensin@mci.net, randy@mci.net, paul@mci.net +# RFC2196 || B. Fraser || +# RFC2197 || N. Freed || ned.freed@innosoft.com +# RFC2198 || C. Perkins, I. Kouvelas, O. Hodson, V. Hardman, M. Handley, J.C. Bolot, A. Vega-Garcia, S. Fosse-Parisis || mjh@isi.edu +# RFC2199 || A. Ramos || ramos@isi.edu +# RFC2200 || J. Postel || +# RFC2201 || A. Ballardie || +# RFC2202 || P. Cheng, R. Glenn || pau@watson.ibm.com, rob.glenn@nist.gov +# RFC2203 || M. Eisler, A. Chiu, L. Ling || mre@eng.sun.com, hacker@eng.sun.com, lling@eng.sun.com +# RFC2204 || D. Nash || dnash@ford.com +# RFC2205 || R. Braden, Ed., L. Zhang, S. Berson, S. Herzog, S. Jamin || Braden@ISI.EDU, lixia@cs.ucla.edu, Berson@ISI.EDU, Herzog@WATSON.IBM.COM, jamin@EECS.UMICH.EDU +# RFC2206 || F. Baker, J. Krawczyk, A. Sastry || fred@cisco.com, jjk@tiac.net, arun@cisco.com +# RFC2207 || L. Berger, T. O'Malley || timo@bbn.com +# RFC2208 || A. Mankin, Ed., F. Baker, B. Braden, S. Bradner, M. O'Dell, A. Romanow, A. Weinrib, L. Zhang || aweinrib@ibeam.intel.com, braden@isi.edu, lixia@cs.ucla.edu, allyn@eng.sun.com, mo@uu.net +# RFC2209 || R. Braden, L. Zhang || Braden@ISI.EDU, lixia@cs.ucla.edu +# RFC2210 || J. Wroclawski || jtw@lcs.mit.edu +# RFC2211 || J. Wroclawski || jtw@lcs.mit.edu +# RFC2212 || S. Shenker, C. Partridge, R. Guerin || shenker@parc.xerox.com, craig@bbn.com, guerin@watson.ibm.com +# RFC2213 || F. Baker, J. Krawczyk, A. Sastry || fred@cisco.com, jjk@tiac.net, arun@cisco.com +# RFC2214 || F. Baker, J. Krawczyk, A. Sastry || fred@cisco.com, jjk@tiac.net, arun@cisco.com +# RFC2215 || S. Shenker, J. Wroclawski || shenker@parc.xerox.com, jtw@lcs.mit.edu +# RFC2216 || S. Shenker, J. Wroclawski || shenker@parc.xerox.com, jtw@lcs.mit.edu +# RFC2217 || G. Clark || glenc@cisco.com +# RFC2218 || T. Genovese, B. Jennings || TonyG@Microsoft.com, jennings@sandia.gov +# RFC2219 || M. Hamilton, R. Wright || m.t.hamilton@lut.ac.uk, wright@lbl.gov +# RFC2220 || R. Guenther || rgue@loc.gov +# RFC2221 || M. Gahrns || mikega@microsoft.com +# RFC2222 || J. Myers || jgmyers@netscape.com +# RFC2223 || J. Postel, J. Reynolds || Postel@ISI.EDU, jkrey@isi.edu, dwaitzman@BBN.COM +# RFC2224 || B. Callaghan || brent.callaghan@eng.sun.com +# RFC2225 || M. Laubach, J. Halpern || +# RFC2226 || T. Smith, G. Armitage || tjsmith@vnet.ibm.com, gja@lucent.com +# RFC2227 || J. Mogul, P. Leach || mogul@wrl.dec.com, paulle@microsoft.com +# RFC2228 || M. Horowitz, S. Lunt || marc@cygnus.com +# RFC2229 || R. Faith, B. Martin || faith@cs.unc.edu, bamartin@miranda.org +# RFC2230 || R. Atkinson || +# RFC2231 || N. Freed, K. Moore || ned.freed@innosoft.com, moore@cs.utk.edu +# RFC2232 || B. Clouston, Ed., B. Moore, Ed. || clouston@cisco.com, remoore@ralvm6.vnet.ibm.com +# RFC2233 || K. McCloghrie, F. Kastenholz || kzm@cisco.com, kasten@ftp.com +# RFC2234 || D. Crocker, Ed., P. Overell || dcrocker@bbiw.net, paul@bayleaf.org.uk +# RFC2235 || R. Zakon || zakon@info.isoc.org +# RFC2236 || W. Fenner || fenner@parc.xerox.com +# RFC2237 || K. Tamaru || kenzat@microsoft.com +# RFC2238 || B. Clouston, Ed., B. Moore, Ed. || clouston@cisco.com, remoore@ralvm6.vnet.ibm.com +# RFC2239 || K. de Graaf, D. Romascanu, D. McMaster, K. McCloghrie, S. Roberts || kdegraaf@isd.3com.com, dromasca@gmail.com , mcmaster@cisco.com, kzm@cisco.com, sroberts@farallon.com +# RFC2240 || O. Vaughan || owain@vaughan.com +# RFC2241 || D. Provan || donp@Novell.Com +# RFC2242 || R. Droms, K. Fong || +# RFC2243 || C. Metz || +# RFC2244 || C. Newman, J. G. Myers || +# RFC2245 || C. Newman || +# RFC2246 || T. Dierks, C. Allen || tdierks@certicom.com, pck@netcom.com, relyea@netscape.com, jar@netscape.com, msabin@netcom.com, dansimon@microsoft.com, tomw@netscape.com, hugo@watson.ibm.com +# RFC2247 || S. Kille, M. Wahl, A. Grimstad, R. Huber, S. Sataluri || S.Kille@ISODE.COM, M.Wahl@critical-angle.com, alg@att.com, rvh@att.com, sri@att.com +# RFC2248 || N. Freed, S. Kille || ned.freed@innosoft.com, S.Kille@isode.com +# RFC2249 || N. Freed, S. Kille || ned.freed@innosoft.com, S.Kille@isode.com +# RFC2250 || D. Hoffman, G. Fernando, V. Goyal, M. Civanlar || gerard.fernando@eng.sun.com, goyal@precept.com, don.hoffman@eng.sun.com, civanlar@research.att.com +# RFC2251 || M. Wahl, T. Howes, S. Kille || M.Wahl@critical-angle.com, howes@netscape.com, S.Kille@isode.com +# RFC2252 || M. Wahl, A. Coulbeck, T. Howes, S. Kille || M.Wahl@critical-angle.com, A.Coulbeck@isode.com, howes@netscape.com, S.Kille@isode.com +# RFC2253 || M. Wahl, S. Kille, T. Howes || M.Wahl@critical-angle.com, S.Kille@ISODE.COM, howes@netscape.com +# RFC2254 || T. Howes || howes@netscape.com +# RFC2255 || T. Howes, M. Smith || howes@netscape.com, mcs@netscape.com +# RFC2256 || M. Wahl || M.Wahl@critical-angle.com +# RFC2257 || M. Daniele, B. Wijnen, D. Francisco || daniele@zk3.dec.com, wijnen@vnet.ibm.com, dfrancis@cisco.com +# RFC2258 || J. Ordille || joann@bell-labs.com +# RFC2259 || J. Elliott, J. Ordille || jim@apocalypse.org, joann@bell-labs.com +# RFC2260 || T. Bates, Y. Rekhter || tbates@cisco.com, yakov@cisco.com +# RFC2261 || D. Harrington, R. Presuhn, B. Wijnen || +# RFC2262 || J. Case, D. Harrington, R. Presuhn, B. Wijnen || +# RFC2263 || D. Levi, P. Meyer, B. Stewart || +# RFC2264 || U. Blumenthal, B. Wijnen || +# RFC2265 || B. Wijnen, R. Presuhn, K. McCloghrie || +# RFC2266 || J. Flick || +# RFC2267 || P. Ferguson, D. Senie || ferguson@cisco.com, dts@senie.com +# RFC2268 || R. Rivest || rsa-labs@rsa.com +# RFC2269 || G. Armitage || gja@lucent.com +# RFC2270 || J. Stewart, T. Bates, R. Chandra, E. Chen || jstewart@isi.edu, tbates@cisco.com, rchandra@cisco.com, enkechen@cisco.com +# RFC2271 || D. Harrington, R. Presuhn, B. Wijnen || +# RFC2272 || J. Case, D. Harrington, R. Presuhn, B. Wijnen || +# RFC2273 || D. Levi, P. Meyer, B. Stewart || +# RFC2274 || U. Blumenthal, B. Wijnen || +# RFC2275 || B. Wijnen, R. Presuhn, K. McCloghrie || +# RFC2276 || K. Sollins || sollins@lcs.mit.edu +# RFC2277 || H. Alvestrand || Harald.T.Alvestrand@uninett.no +# RFC2278 || N. Freed, J. Postel || ned.freed@innosoft.com, Postel@ISI.EDU +# RFC2279 || F. Yergeau || fyergeau@alis.com +# RFC2280 || C. Alaettinoglu, T. Bates, E. Gerich, D. Karrenberg, D. Meyer, M. Terpstra, C. Villamizar || cengiz@isi.edu, tbates@cisco.com, epg@home.net, dfk@ripe.net, meyer@antc.uoregon.edu, marten@BayNetworks.com, curtis@ans.net +# RFC2281 || T. Li, B. Cole, P. Morton, D. Li || tli@juniper.net, cole@juniper.net, pmorton@cisco.com, dawnli@cisco.com +# RFC2282 || J. Galvin || +# RFC2283 || T. Bates, R. Chandra, D. Katz, Y. Rekhter || +# RFC2284 || L. Blunk, J. Vollbrecht || ljb@merit.edu, jrv@merit.edu +# RFC2285 || R. Mandeville || bob.mandeville@eunet.fr +# RFC2286 || J. Kapp || skapp@reapertech.com +# RFC2287 || C. Krupczak, J. Saperia || cheryl@empiretech.com +# RFC2288 || C. Lynch, C. Preston, R. Daniel || cliff@cni.org, cecilia@well.com, rdaniel@acl.lanl.gov +# RFC2289 || N. Haller, C. Metz, P. Nesser, M. Straw || +# RFC2290 || J. Solomon, S. Glass || solomon@comm.mot.com, glass@ftp.com +# RFC2291 || J. Slein, F. Vitali, E. Whitehead, D. Durand || slein@wrc.xerox.com, fabio@cs.unibo.it, ejw@ics.uci.edu, dgd@cs.bu.edu +# RFC2292 || W. Stevens, M. Thomas || rstevens@kohala.com, matt.thomas@altavista-software.com +# RFC2293 || S. Kille || S.Kille@ISODE.COM +# RFC2294 || S. Kille || S.Kille@ISODE.COM +# RFC2295 || K. Holtman, A. Mutz || koen@win.tue.nl, mutz@hpl.hp.com +# RFC2296 || K. Holtman, A. Mutz || koen@win.tue.nl, mutz@hpl.hp.com +# RFC2297 || P. Newman, W. Edwards, R. Hinden, E. Hoffman, F. Ching Liaw, T. Lyon, G. Minshall || bob.hinden@gmail.com +# RFC2298 || R. Fajman || raf@cu.nih.gov +# RFC2299 || A. Ramos || ramos@isi.edu +# RFC2300 || J. Postel || Postel@ISI.EDU +# RFC2301 || L. McIntyre, S. Zilles, R. Buckley, D. Venable, G. Parsons, J. Rafferty || +# RFC2302 || G. Parsons, J. Rafferty, S. Zilles || +# RFC2303 || C. Allocchio || +# RFC2304 || C. Allocchio || +# RFC2305 || K. Toyoda, H. Ohno, J. Murai, D. Wing || +# RFC2306 || G. Parsons, J. Rafferty || +# RFC2307 || L. Howard || lukeh@xedoc.com +# RFC2308 || M. Andrews || Mark.Andrews@cmis.csiro.au +# RFC2309 || B. Braden, D. Clark, J. Crowcroft, B. Davie, S. Deering, D. Estrin, S. Floyd, V. Jacobson, G. Minshall, C. Partridge, L. Peterson, K. Ramakrishnan, S. Shenker, J. Wroclawski, L. Zhang || Braden@ISI.EDU, DDC@lcs.mit.edu, Jon.Crowcroft@cs.ucl.ac.uk, bdavie@cisco.com, deering@cisco.com, Estrin@usc.edu, Floyd@ee.lbl.gov, Van@ee.lbl.gov, Minshall@fiberlane.com, craig@bbn.com, LLP@cs.arizona.edu, KKRama@research.att.com, Shenker@parc.xerox.com, JTW@lcs.mit.edu, Lixia@cs.ucla.edu +# RFC2310 || K. Holtman || koen@win.tue.nl +# RFC2311 || S. Dusse, P. Hoffman, B. Ramsdell, L. Lundblade, L. Repka || spock@rsa.com, phoffman@imc.org, blaker@deming.com, lgl@qualcomm.com, repka@netscape.com +# RFC2312 || S. Dusse, P. Hoffman, B. Ramsdell, J. Weinstein || spock@rsa.com, phoffman@imc.org, blaker@deming.com, jsw@netscape.com +# RFC2313 || B. Kaliski || burt@rsa.com +# RFC2314 || B. Kaliski || burt@rsa.com +# RFC2315 || B. Kaliski || burt@rsa.com +# RFC2316 || S. Bellovin || +# RFC2317 || H. Eidnes, G. de Groot, P. Vixie || Havard.Eidnes@runit.sintef.no, GeertJan.deGroot@bsdi.com, paul@vix.com +# RFC2318 || H. Lie, B. Bos, C. Lilley || howcome@w3.org, bert@w3.org, chris@w3.org +# RFC2319 || KOI8-U Working Group || +# RFC2320 || M. Greene, J. Luciani, K. White, T. Kuo || maria@xedia.com, luciani@baynetworks.com, kennethw@vnet.ibm.com, ted_kuo@Baynetworks.com +# RFC2321 || A. Bressen || bressen@leftbank.com +# RFC2322 || K. van den Hout, A. Koopal, R. van Mook || koos@cetis.hvu.nl, andre@NL.net, remco@sateh.com +# RFC2323 || A. Ramos || ramos@isi.edu +# RFC2324 || L. Masinter || masinter@parc.xerox.com +# RFC2325 || M. Slavitch || slavitch@loran.com +# RFC2326 || H. Schulzrinne, A. Rao, R. Lanphier || schulzrinne@cs.columbia.edu, anup@netscape.com, robla@real.com +# RFC2327 || M. Handley, V. Jacobson || +# RFC2328 || J. Moy || jmoy@casc.com +# RFC2329 || J. Moy || jmoy@casc.com +# RFC2330 || V. Paxson, G. Almes, J. Mahdavi, M. Mathis || vern@ee.lbl.gov, almes@advanced.org, mahdavi@psc.edu, mathis@psc.edu +# RFC2331 || M. Maher || maher@isi.edu +# RFC2332 || J. Luciani, D. Katz, D. Piscitello, B. Cole, N. Doraswamy || dkatz@cisco.com, luciani@baynetworks.com, bcole@jnx.com, naganand@baynetworks.com +# RFC2333 || D. Cansever || dcansever@gte.com +# RFC2334 || J. Luciani, G. Armitage, J. Halpern, N. Doraswamy || luciani@baynetworks.com, gja@lucent.com, jhalpern@Newbridge.COM, naganand@baynetworks.com +# RFC2335 || J. Luciani || luciani@baynetworks.com +# RFC2336 || J. Luciani || +# RFC2337 || D. Farinacci, D. Meyer, Y. Rekhter || +# RFC2338 || S. Knight, D. Weaver, D. Whipple, R. Hinden, D. Mitzel, P. Hunt, P. Higginson, M. Shand, A. Lindem || Steven.Knight@ascend.com, Doug.Weaver@ascend.com, dwhipple@microsoft.com, bob.hinden@gmail.com, mitzel@iprg.nokia.com, hunt@iprg.nokia.com, higginson@mail.dec.com, shand@mail.dec.com +# RFC2339 || The Internet Society, Sun Microsystems || +# RFC2340 || B. Jamoussi, D. Jamieson, D. Williston, S. Gabe || jamoussi@Nortel.ca, djamies@Nortel.ca, danwil@Nortel.ca, spgabe@Nortel.ca +# RFC2341 || A. Valencia, M. Littlewood, T. Kolar || tkolar@cisco.com, littlewo@cisco.com, valencia@cisco.com +# RFC2342 || M. Gahrns, C. Newman || mikega@microsoft.com, chris.newman@innosoft.com +# RFC2343 || M. Civanlar, G. Cash, B. Haskell || civanlar@research.att.com, glenn@research.att.com, bgh@research.att.com +# RFC2344 || G. Montenegro, Ed. || +# RFC2345 || J. Klensin, T. Wolf, G. Oglesby || klensin@mci.net, ted@usa.net, gary@mci.net +# RFC2346 || J. Palme || jpalme@dsv.su.se +# RFC2347 || G. Malkin, A. Harkin || gmalkin@baynetworks.com, ash@cup.hp.com +# RFC2348 || G. Malkin, A. Harkin || gmalkin@baynetworks.com, ash@cup.hp.com +# RFC2349 || G. Malkin, A. Harkin || gmalkin@baynetworks.com, ash@cup.hp.com +# RFC2350 || N. Brownlee, E. Guttman || n.brownlee@auckland.ac.nz, Erik.Guttman@sun.com +# RFC2351 || A. Robert || arobert@par1.par.sita.int +# RFC2352 || O. Vaughan || owain@vaughan.com +# RFC2353 || G. Dudley || dudleyg@us.ibm.com +# RFC2354 || C. Perkins, O. Hodson || c.perkins@cs.ucl.ac.uk, o.hodson@cs.ucl.ac.uk +# RFC2355 || B. Kelly || kellywh@mail.auburn.edu +# RFC2356 || G. Montenegro, V. Gupta || gabriel.montenegro@Eng.Sun.COM, vipul.gupta@Eng.Sun.COM +# RFC2357 || A. Mankin, A. Romanow, S. Bradner, V. Paxson || mankin@east.isi.edu, allyn@mci.net, sob@harvard.edu, vern@ee.lbl.gov +# RFC2358 || J. Flick, J. Johnson || johnf@hprnd.rose.hp.com, jeff@redbacknetworks.com +# RFC2359 || J. Myers || jgmyers@netscape.com +# RFC2360 || G. Scott || +# RFC2361 || E. Fleischman || ericfl@microsoft.com, Eric.Fleischman@PSS.Boeing.com +# RFC2362 || D. Estrin, D. Farinacci, A. Helmy, D. Thaler, S. Deering, M. Handley, V. Jacobson, C. Liu, P. Sharma, L. Wei || estrin@usc.edu, dino@cisco.com, ahelmy@catarina.usc.edu, thalerd@eecs.umich.edu, deering@parc.xerox.com, m.handley@cs.ucl.ac.uk, van@ee.lbl.gov, charley@catarina.usc.edu, puneet@catarina.usc.edu, lwei@cisco.com +# RFC2363 || G. Gross, M. Kaycee, A. Li, A. Malis, J. Stephens || gmgross@lucent.com, mjk@nj.paradyne.com, alin@shastanets.com, malis@ascend.com, john@cayman.com +# RFC2364 || G. Gross, M. Kaycee, A. Li, A. Malis, J. Stephens || gmgross@lucent.com, mjk@nj.paradyne.com, alin@shastanets.com, malis@ascend.com, john@cayman.com +# RFC2365 || D. Meyer || dmm@cisco.com +# RFC2366 || C. Chung, M. Greene || cchung@tieo.saic.com +# RFC2367 || D. McDonald, C. Metz, B. Phan || danmcd@eng.sun.com, cmetz@inner.net, phan@itd.nrl.navy.mil +# RFC2368 || P. Hoffman, L. Masinter, J. Zawinski || +# RFC2369 || G. Neufeld, J. Baer || +# RFC2370 || R. Coltun || +# RFC2371 || J. Lyon, K. Evans, J. Klein || JimLyon@Microsoft.Com, Keith.Evans@Tandem.Com, Johannes.Klein@Tandem.Com +# RFC2372 || K. Evans, J. Klein, J. Lyon || Keith.Evans@Tandem.Com, Johannes.Klein@Tandem.Com, JimLyon@Microsoft.Com +# RFC2373 || R. Hinden, S. Deering || bob.hinden@gmail.com +# RFC2374 || R. Hinden, M. O'Dell, S. Deering || bob.hinden@gmail.com, mo@uunet.uu.net, deering@cisco.com +# RFC2375 || R. Hinden, S. Deering || bob.hinden@gmail.com, deering@cisco.com +# RFC2376 || E. Whitehead, M. Murata || +# RFC2377 || A. Grimstad, R. Huber, S. Sataluri, M. Wahl || alg@att.com, rvh@att.com, srs@lucent.com, M.Wahl@critical-angle.com +# RFC2378 || R. Hedberg, P. Pomes || Roland.Hedberg@umdac.umu.se, ppomes@qualcomm.com +# RFC2379 || L. Berger || lberger@fore.com +# RFC2380 || L. Berger || lberger@fore.com +# RFC2381 || M. Garrett, M. Borden || mwg@bellcore.com, mborden@baynetworks.com +# RFC2382 || E. Crawley, Ed., L. Berger, S. Berson, F. Baker, M. Borden, J. Krawczyk || esc@argon.com, lberger@fore.com, berson@isi.edu, fred@cisco.com, mborden@baynetworks.com, jj@arrowpoint.com +# RFC2383 || M. Suzuki || suzuki@nal.ecl.net +# RFC2384 || R. Gellens || Randy@Qualcomm.Com +# RFC2385 || A. Heffernan || ahh@cisco.com +# RFC2386 || E. Crawley, R. Nair, B. Rajagopalan, H. Sandick || +# RFC2387 || E. Levinson || XIson@cnj.digex.com +# RFC2388 || L. Masinter || masinter@parc.xerox.com +# RFC2389 || P. Hethmon, R. Elz || +# RFC2390 || T. Bradley, C. Brown, A. Malis || tbradley@avici.com, cbrown@juno.com, malis@ascend.com +# RFC2391 || P. Srisuresh, D. Gan || suresh@ra.lucent.com, dhg@juniper.net +# RFC2392 || E. Levinson || XIson@cnj.digex.net +# RFC2393 || A. Shacham, R. Monsour, R. Pereira, M. Thomas || shacham@cisco.com, rmonsour@hifn.com, rpereira@timestep.com, matt.thomas@altavista-software.com, naganand@baynetworks.com +# RFC2394 || R. Pereira || +# RFC2395 || R. Friend, R. Monsour || rfriend@hifn.com, rmonsour@hifn.com +# RFC2396 || T. Berners-Lee, R. Fielding, L. Masinter || timbl@w3.org, fielding@ics.uci.edu, masinter@parc.xerox.com +# RFC2397 || L. Masinter || +# RFC2398 || S. Parker, C. Schmechel || sparker@eng.sun.com, cschmec@eng.sun.com +# RFC2399 || A. Ramos || ramos@isi.edu +# RFC2400 || J. Postel, J. Reynolds || Postel@ISI.EDU, JKRey@ISI.EDU +# RFC2401 || S. Kent, R. Atkinson || +# RFC2402 || S. Kent, R. Atkinson || +# RFC2403 || C. Madson, R. Glenn || +# RFC2404 || C. Madson, R. Glenn || +# RFC2405 || C. Madson, N. Doraswamy || +# RFC2406 || S. Kent, R. Atkinson || +# RFC2407 || D. Piper || ddp@network-alchemy.com +# RFC2408 || D. Maughan, M. Schertler, M. Schneider, J. Turner || wdm@tycho.ncsc.mil, mss@tycho.ncsc.mil, mjs@securify.com, jeff.turner@raba.com +# RFC2409 || D. Harkins, D. Carrel || dharkins@cisco.com, carrel@ipsec.org +# RFC2410 || R. Glenn, S. Kent || +# RFC2411 || R. Thayer, N. Doraswamy, R. Glenn || naganand@baynetworks.com, rob.glenn@nist.gov +# RFC2412 || H. Orman || ho@darpa.mil +# RFC2413 || S. Weibel, J. Kunze, C. Lagoze, M. Wolf || weibel@oclc.org, jak@ckm.ucsf.edu, lagoze@cs.cornell.edu, misha.wolf@reuters.com +# RFC2414 || M. Allman, S. Floyd, C. Partridge || mallman@lerc.nasa.gov, floyd@ee.lbl.gov, craig@bbn.com +# RFC2415 || K. Poduri, K. Nichols || kpoduri@Baynetworks.com, knichols@baynetworks.com +# RFC2416 || T. Shepard, C. Partridge || shep@alum.mit.edu, craig@bbn.com +# RFC2417 || C. Chung, M. Greene || chihschung@aol.com, maria@xedia.com +# RFC2418 || S. Bradner || +# RFC2419 || K. Sklower, G. Meyer || sklower@CS.Berkeley.EDU +# RFC2420 || H. Kummert || kummert@nentec.de +# RFC2421 || G. Vaudreuil, G. Parsons || Glenn.Parsons@Nortel.ca, GregV@Lucent.Com +# RFC2422 || G. Vaudreuil, G. Parsons || Glenn.Parsons@Nortel.ca, GregV@Lucent.Com +# RFC2423 || G. Vaudreuil, G. Parsons || Glenn.Parsons@Nortel.ca, GregV@Lucent.Com +# RFC2424 || G. Vaudreuil, G. Parsons || Glenn.Parsons@Nortel.ca, GregV@Lucent.Com +# RFC2425 || T. Howes, M. Smith, F. Dawson || howes@netscape.com, mcs@netscape.com, frank_dawson@lotus.com +# RFC2426 || F. Dawson, T. Howes || +# RFC2427 || C. Brown, A. Malis || cbrown@juno.com, malis@ascend.com +# RFC2428 || M. Allman, S. Ostermann, C. Metz || mallman@lerc.nasa.gov, ostermann@cs.ohiou.edu, cmetz@inner.net +# RFC2429 || C. Bormann, L. Cline, G. Deisher, T. Gardos, C. Maciocco, D. Newell, J. Ott, G. Sullivan, S. Wenger, C. Zhu || +# RFC2430 || T. Li, Y. Rekhter || tli@juniper.net, yakov@cisco.com +# RFC2431 || D. Tynan || dtynan@claddagh.ie +# RFC2432 || K. Dubray || kdubray@ironbridgenetworks.com +# RFC2433 || G. Zorn, S. Cobb || glennz@microsoft.com, stevec@microsoft.com +# RFC2434 || T. Narten, H. Alvestrand || narten@raleigh.ibm.com, Harald@Alvestrand.no +# RFC2435 || L. Berc, W. Fenner, R. Frederick, S. McCanne, P. Stewart || berc@pa.dec.com, fenner@parc.xerox.com, frederick@parc.xerox.com, mccanne@cs.berkeley.edu, stewart@parc.xerox.com +# RFC2436 || R. Brett, S. Bradner, G. Parsons || rfbrett@nortel.ca, sob@harvard.edu, Glenn.Parsons@Nortel.ca +# RFC2437 || B. Kaliski, J. Staddon || burt@rsa.com, jstaddon@rsa.com +# RFC2438 || M. O'Dell, H. Alvestrand, B. Wijnen, S. Bradner || mo@uu.net, Harald.Alvestrand@maxware.no, wijnen@vnet.ibm.com, sob@harvard.edu +# RFC2439 || C. Villamizar, R. Chandra, R. Govindan || curtis@ans.net, rchandra@cisco.com, govindan@isi.edu +# RFC2440 || J. Callas, L. Donnerhacke, H. Finney, R. Thayer || +# RFC2441 || D. Cohen || cohen@myri.com +# RFC2442 || N. Freed, D. Newman, J. Belissent, M. Hoy || ned.freed@innosoft.com, dan.newman@innosoft.com, jacques.belissent@eng.sun.com +# RFC2443 || J. Luciani, A. Gallo || luciani@baynetworks.com, gallo@raleigh.ibm.com +# RFC2444 || C. Newman || chris.newman@innosoft.com +# RFC2445 || F. Dawson, D. Stenerson || +# RFC2446 || S. Silverberg, S. Mansour, F. Dawson, R. Hopson || +# RFC2447 || F. Dawson, S. Mansour, S. Silverberg || +# RFC2448 || M. Civanlar, G. Cash, B. Haskell || civanlar@research.att.com, glenn@research.att.com, bgh@research.att.com +# RFC2449 || R. Gellens, C. Newman, L. Lundblade || randy@qualcomm.com, chris.newman@innosoft.com, lgl@qualcomm.com +# RFC2450 || R. Hinden || bob.hinden@gmail.com +# RFC2451 || R. Pereira, R. Adams || +# RFC2452 || M. Daniele || daniele@zk3.dec.com +# RFC2453 || G. Malkin || gmalkin@baynetworks.com +# RFC2454 || M. Daniele || daniele@zk3.dec.com +# RFC2455 || B. Clouston, B. Moore || clouston@cisco.com, remoore@us.ibm.com +# RFC2456 || B. Clouston, B. Moore || clouston@cisco.com, remoore@us.ibm.com +# RFC2457 || B. Clouston, B. Moore || clouston@cisco.com, remoore@us.ibm.com +# RFC2458 || H. Lu, M. Krishnaswamy, L. Conroy, S. Bellovin, F. Burg, A. DeSimone, K. Tewani, P. Davidson, H. Schulzrinne, K. Vishwanathan || smb@research.att.com, fburg@hogpb.att.com, lwc@roke.co.uk, pauldav@nortel.ca, murali@bell-labs.com, hui-lan.lu@bell-labs.com, schulzrinne@cs.columbia.edu, tewani@att.com, kumar@isochrone.com +# RFC2459 || R. Housley, W. Ford, W. Polk, D. Solo || housley@spyrus.com, wford@verisign.com, wpolk@nist.gov, david.solo@citicorp.com +# RFC2460 || S. Deering, R. Hinden || deering@cisco.com, bob.hinden@gmail.com +# RFC2461 || T. Narten, E. Nordmark, W. Simpson || narten@raleigh.ibm.com, nordmark@sun.com, Bill.Simpson@um.cc.umich.edu +# RFC2462 || S. Thomson, T. Narten || +# RFC2463 || A. Conta, S. Deering || aconta@lucent.com, deering@cisco.com +# RFC2464 || M. Crawford || crawdad@fnal.gov +# RFC2465 || D. Haskin, S. Onishi || dhaskin@baynetworks.com, sonishi@baynetworks.com +# RFC2466 || D. Haskin, S. Onishi || dhaskin@baynetworks.com, sonishi@baynetworks.com +# RFC2467 || M. Crawford || crawdad@fnal.gov +# RFC2468 || V. Cerf || vcerf@mci.net +# RFC2469 || T. Narten, C. Burton || narten@raleigh.ibm.com, burton@rtp.vnet.ibm.com +# RFC2470 || M. Crawford, T. Narten, S. Thomas || crawdad@fnal.gov, narten@raleigh.ibm.com, stephen.thomas@transnexus.com +# RFC2471 || R. Hinden, R. Fink, J. Postel || bob.hinden@gmail.com, rlfink@lbl.gov +# RFC2472 || D. Haskin, E. Allen || dhaskin@baynetworks.com, eallen@baynetworks.com +# RFC2473 || A. Conta, S. Deering || aconta@lucent.com, deering@cisco.com +# RFC2474 || K. Nichols, S. Blake, F. Baker, D. Black || kmn@cisco.com, slblake@torrentnet.com, fred@cisco.com, black_david@emc.com +# RFC2475 || S. Blake, D. Black, M. Carlson, E. Davies, Z. Wang, W. Weiss || slblake@torrentnet.com, black_david@emc.com, mark.carlson@sun.com, elwynd@nortel.co.uk, zhwang@bell-labs.com, wweiss@lucent.com +# RFC2476 || R. Gellens, J. Klensin || Randy@Qualcomm.Com, klensin@mci.net +# RFC2477 || B. Aboba, G. Zorn || bernarda@microsoft.com, glennz@microsoft.com +# RFC2478 || E. Baize, D. Pinkas || +# RFC2479 || C. Adams || cadams@entrust.com +# RFC2480 || N. Freed || ned.freed@innosoft.com +# RFC2481 || K. Ramakrishnan, S. Floyd || +# RFC2482 || K. Whistler, G. Adams || kenw@sybase.com, glenn@spyglass.com +# RFC2483 || M. Mealling, R. Daniel || michaelm@rwhois.net, rdaniel@lanl.gov +# RFC2484 || G. Zorn || glennz@microsoft.com +# RFC2485 || S. Drach || drach@sun.com +# RFC2486 || B. Aboba, M. Beadles || bernarda@microsoft.com, mbeadles@wcom.net +# RFC2487 || P. Hoffman || phoffman@imc.org +# RFC2488 || M. Allman, D. Glover, L. Sanchez || mallman@lerc.nasa.gov, Daniel.R.Glover@lerc.nasa.gov, lsanchez@ir.bbn.com +# RFC2489 || R. Droms || droms@bucknell.edu +# RFC2490 || M. Pullen, R. Malghan, L. Lavu, G. Duan, J. Ma, H. Nah || mpullen@gmu.edu, rmalghan@bacon.gmu.edu, llavu@bacon.gmu.edu, gduan@us.oracle.com, jma@newbridge.com, hnah@bacon.gmu.edu +# RFC2491 || G. Armitage, P. Schulter, M. Jork, G. Harter || gja@lucent.com, paschulter@acm.org, jork@kar.dec.com, harter@zk3.dec.com +# RFC2492 || G. Armitage, P. Schulter, M. Jork || gja@lucent.com, paschulter@acm.org, jork@kar.dec.com +# RFC2493 || K. Tesink, Ed. || kaj@bellcore.com +# RFC2494 || D. Fowler, Ed. || davef@newbridge.com +# RFC2495 || D. Fowler, Ed. || davef@newbridge.com +# RFC2496 || D. Fowler, Ed. || davef@newbridge.com +# RFC2497 || I. Souvatzis || is@netbsd.org +# RFC2498 || J. Mahdavi, V. Paxson || mahdavi@psc.edu, vern@ee.lbl.gov +# RFC2499 || A. Ramos || ramos@isi.edu +# RFC2500 || J. Reynolds, R. Braden || +# RFC2501 || S. Corson, J. Macker || corson@isr.umd.edu, macker@itd.nrl.navy.mil +# RFC2502 || M. Pullen, M. Myjak, C. Bouwens || mpullen@gmu.edu, mmyjak@virtualworkshop.com, christina.bouwens@cpmx.mail.saic.com +# RFC2503 || R. Moulton, M. Needleman || ruth@muswell.demon.co.uk +# RFC2504 || E. Guttman, L. Leong, G. Malkin || erik.guttman@sun.com, lorna@colt.net, gmalkin@baynetworks.com +# RFC2505 || G. Lindberg || +# RFC2506 || K. Holtman, A. Mutz, T. Hardie || koen@win.tue.nl, andy_mutz@hp.com, hardie@equinix.com +# RFC2507 || M. Degermark, B. Nordgren, S. Pink || micke@sm.luth.se, bcn@lulea.trab.se, steve@sm.luth.se +# RFC2508 || S. Casner, V. Jacobson || casner@cisco.com, van@cisco.com +# RFC2509 || M. Engan, S. Casner, C. Bormann || engan@effnet.com, casner@cisco.com, cabo@tzi.org +# RFC2510 || C. Adams, S. Farrell || cadams@entrust.com, stephen.farrell@sse.ie +# RFC2511 || M. Myers, C. Adams, D. Solo, D. Kemp || mmyers@verisign.com, cadams@entrust.com, david.solo@citicorp.com, dpkemp@missi.ncsc.mil +# RFC2512 || K. McCloghrie, J. Heinanen, W. Greene, A. Prasad || kzm@cisco.com, jh@telia.fi, wedge.greene@mci.com, aprasad@cisco.com +# RFC2513 || K. McCloghrie, J. Heinanen, W. Greene, A. Prasad || kzm@cisco.com, jh@telia.fi, wedge.greene@mci.com, aprasad@cisco.com +# RFC2514 || M. Noto, E. Spiegel, K. Tesink || mspiegel@cisco.com, kaj@bellcore.com +# RFC2515 || K. Tesink, Ed || kaj@bellcore.com +# RFC2516 || L. Mamakos, K. Lidl, J. Evarts, D. Carrel, D. Simone, R. Wheeler || louie@uu.net, lidl@uu.net, jde@uu.net, carrel@RedBack.net, dan@RedBack.net, ross@routerware.com +# RFC2517 || R. Moats, R. Huber || jayhawk@att.com, rvh@att.com +# RFC2518 || Y. Goland, E. Whitehead, A. Faizi, S. Carter, D. Jensen || yarong@microsoft.com, ejw@ics.uci.edu, asad@netscape.com, srcarter@novell.com, dcjensen@novell.com +# RFC2519 || E. Chen, J. Stewart || enkechen@cisco.com, jstewart@juniper.net +# RFC2520 || J. Luciani, H. Suzuki, N. Doraswamy, D. Horton || luciani@baynetworks.com, hsuzuki@cisco.com, naganand@baynetworks.com, d.horton@citr.com.au +# RFC2521 || P. Karn, W. Simpson || +# RFC2522 || P. Karn, W. Simpson || +# RFC2523 || P. Karn, W. Simpson || +# RFC2524 || M. Banan || +# RFC2525 || V. Paxson, M. Allman, S. Dawson, W. Fenner, J. Griner, I. Heavens, K. Lahey, J. Semke, B. Volz || vern@aciri.org, sdawson@eecs.umich.edu, fenner@parc.xerox.com, jgriner@grc.nasa.gov, ian@spider.com, kml@nas.nasa.gov, semke@psc.edu, volz@process.com +# RFC2526 || D. Johnson, S. Deering || dbj@cs.cmu.edu, deering@cisco.com +# RFC2527 || S. Chokhani, W. Ford || +# RFC2528 || R. Housley, W. Polk || housley@spyrus.com, wpolk@nist.gov +# RFC2529 || B. Carpenter, C. Jung || brian@hursley.ibm.com, cmj@3Com.com +# RFC2530 || D. Wing || dwing-ietf@fuggles.com +# RFC2531 || G. Klyne, L. McIntyre || GK@ACM.ORG, Lloyd.McIntyre@pahv.xerox.com +# RFC2532 || L. Masinter, D. Wing || masinter@parc.xerox.com, dwing-ietf@fuggles.com +# RFC2533 || G. Klyne || GK@ACM.ORG +# RFC2534 || L. Masinter, D. Wing, A. Mutz, K. Holtman || masinter@parc.xerox.com, dwing-ietf@fuggles.com, koen@win.tue.nl +# RFC2535 || D. Eastlake 3rd || dee3@us.ibm.com +# RFC2536 || D. Eastlake 3rd || dee3@us.ibm.com +# RFC2537 || D. Eastlake 3rd || dee3@us.ibm.com +# RFC2538 || D. Eastlake 3rd, O. Gudmundsson || dee3@us.ibm.com, ogud@tislabs.com +# RFC2539 || D. Eastlake 3rd || dee3@us.ibm.com +# RFC2540 || D. Eastlake 3rd || dee3@us.ibm.com +# RFC2541 || D. Eastlake 3rd || dee3@us.ibm.com +# RFC2542 || L. Masinter || masinter@parc.xerox.com +# RFC2543 || M. Handley, H. Schulzrinne, E. Schooler, J. Rosenberg || +# RFC2544 || S. Bradner, J. McQuaid || +# RFC2545 || P. Marques, F. Dupont || +# RFC2546 || A. Durand, B. Buclin || Alain.Durand@imag.fr, Bertrand.Buclin@ch.att.com +# RFC2547 || E. Rosen, Y. Rekhter || erosen@cisco.com, yakov@cisco.com +# RFC2548 || G. Zorn || +# RFC2549 || D. Waitzman || djw@vineyard.net +# RFC2550 || S. Glassman, M. Manasse, J. Mogul || steveg@pa.dec.com, msm@pa.dec.com, mogul@pa.dec.com +# RFC2551 || S. Bradner || +# RFC2552 || M. Blinov, M. Bessonov, C. Clissmann || mch@net-cs.ucd.ie, mikeb@net-cs.ucd.ie, ciaranc@net-cs.ucd.ie +# RFC2553 || R. Gilligan, S. Thomson, J. Bound, W. Stevens || gilligan@freegate.com, set@thumper.bellcore.com, bound@zk3.dec.com, rstevens@kohala.com +# RFC2554 || J. Myers || jgmyers@netscape.com +# RFC2555 || RFC Editor, et al. || braden@isi.edu, jkrey@isi.edu, crocker@mbl.edu, vcerf@mci.net, feinler@juno.com, celeste@isi.edu +# RFC2556 || S. Bradner || sob@harvard.edu +# RFC2557 || J. Palme, A. Hopmann, N. Shelness || jpalme@dsv.su.se, alexhop@microsoft.com, Shelness@lotus.com, stef@nma.com +# RFC2558 || K. Tesink || kaj@research.telcordia.com +# RFC2559 || S. Boeyen, T. Howes, P. Richard || sharon.boeyen@entrust.com, howes@netscape.com, patr@xcert.com +# RFC2560 || M. Myers, R. Ankney, A. Malpani, S. Galperin, C. Adams || mmyers@verisign.com, rankney@erols.com, ambarish@valicert.com, galperin@mycfo.com, cadams@entrust.com +# RFC2561 || K. White, R. Moore || kennethw@vnet.ibm.com, remoore@us.ibm.com +# RFC2562 || K. White, R. Moore || kennethw@vnet.ibm.com, remoore@us.ibm.com +# RFC2563 || R. Troll || rtroll@corp.home.net +# RFC2564 || C. Kalbfleisch, C. Krupczak, R. Presuhn, J. Saperia || cwk@verio.net, cheryl@empiretech.com, randy_presuhn@bmc.com, saperia@mediaone.net +# RFC2565 || R. Herriot, Ed., S. Butler, P. Moore, R. Turner || rherriot@pahv.xerox.com, sbutler@boi.hp.com, paulmo@microsoft.com, rturner@sharplabs.com, rherriot@pahv.xerox.com +# RFC2566 || R. deBry, T. Hastings, R. Herriot, S. Isaacson, P. Powell || sisaacson@novell.com, tom.hastings@alum.mit.edu, robert.herriot@pahv.xerox.com, debryro@uvsc.edu, papowell@astart.com +# RFC2567 || F. Wright || +# RFC2568 || S. Zilles || +# RFC2569 || R. Herriot, Ed., T. Hastings, N. Jacobs, J. Martin || rherriot@pahv.xerox.com, Norm.Jacobs@Central.sun.com, tom.hastings@alum.mit.edu, jkm@underscore.com +# RFC2570 || J. Case, R. Mundy, D. Partain, B. Stewart || +# RFC2571 || B. Wijnen, D. Harrington, R. Presuhn || +# RFC2572 || J. Case, D. Harrington, R. Presuhn, B. Wijnen || +# RFC2573 || D. Levi, P. Meyer, B. Stewart || +# RFC2574 || U. Blumenthal, B. Wijnen || +# RFC2575 || B. Wijnen, R. Presuhn, K. McCloghrie || +# RFC2576 || R. Frye, D. Levi, S. Routhier, B. Wijnen || +# RFC2577 || M. Allman, S. Ostermann || mallman@grc.nasa.gov, ostermann@cs.ohiou.edu +# RFC2578 || K. McCloghrie, Ed., D. Perkins, Ed., J. Schoenwaelder, Ed. || +# RFC2579 || K. McCloghrie, Ed., D. Perkins, Ed., J. Schoenwaelder, Ed. || +# RFC2580 || K. McCloghrie, Ed., D. Perkins, Ed., J. Schoenwaelder, Ed. || +# RFC2581 || M. Allman, V. Paxson, W. Stevens || mallman@grc.nasa.gov, vern@aciri.org, rstevens@kohala.com +# RFC2582 || S. Floyd, T. Henderson || +# RFC2583 || R. Carlson, L. Winkler || RACarlson@anl.gov, lwinkler@anl.gov +# RFC2584 || B. Clouston, B. Moore || clouston@cisco.com, remoore@us.ibm.com +# RFC2585 || R. Housley, P. Hoffman || housley@spyrus.com, phoffman@imc.org +# RFC2586 || J. Salsman, H. Alvestrand || James@bovik.org, Harald.T.Alvestrand@uninett.no +# RFC2587 || S. Boeyen, T. Howes, P. Richard || sharon.boeyen@entrust.com, howes@netscape.com, patr@xcert.com +# RFC2588 || R. Finlayson || finlayson@live.com +# RFC2589 || Y. Yaacovi, M. Wahl, T. Genovese || yoramy@microsoft.com, tonyg@microsoft.com +# RFC2590 || A. Conta, A. Malis, M. Mueller || aconta@lucent.com, malis@ascend.com, memueller@lucent.com +# RFC2591 || D. Levi, J. Schoenwaelder || +# RFC2592 || D. Levi, J. Schoenwaelder || +# RFC2593 || J. Schoenwaelder, J. Quittek || schoenw@ibr.cs.tu-bs.de, quittek@ccrle.nec.de +# RFC2594 || H. Hazewinkel, C. Kalbfleisch, J. Schoenwaelder || +# RFC2595 || C. Newman || chris.newman@innosoft.com +# RFC2596 || M. Wahl, T. Howes || M.Wahl@innosoft.com, howes@netscape.com +# RFC2597 || J. Heinanen, F. Baker, W. Weiss, J. Wroclawski || jh@telia.fi, fred@cisco.com, wweiss@lucent.com, jtw@lcs.mit.edu +# RFC2598 || V. Jacobson, K. Nichols, K. Poduri || van@cisco.com, kmn@cisco.com, kpoduri@baynetworks.com +# RFC2599 || A. DeLaCruz || delacruz@isi.edu +# RFC2600 || J. Reynolds, R. Braden || +# RFC2601 || M. Davison || mike.davison@cisco.com +# RFC2602 || M. Davison || mike.davison@cisco.com +# RFC2603 || M. Davison || mike.davison@cisco.com +# RFC2604 || R. Gellens || randy@qualcomm.com +# RFC2605 || G. Mansfield, S. Kille || glenn@cysols.com, Steve.Kille@MessagingDirect.com +# RFC2606 || D. Eastlake 3rd, A. Panitz || dee3@us.ibm.com, buglady@fuschia.net +# RFC2607 || B. Aboba, J. Vollbrecht || bernarda@microsoft.com, jrv@merit.edu +# RFC2608 || E. Guttman, C. Perkins, J. Veizades, M. Day || Erik.Guttman@sun.com, cperkins@sun.com, veizades@home.net, mday@vinca.com +# RFC2609 || E. Guttman, C. Perkins, J. Kempf || erik.guttman@sun.com, cperkins@sun.com, james.kempf@sun.com +# RFC2610 || C. Perkins, E. Guttman || Charles.Perkins@Sun.Com, Erik.Guttman@Sun.Com +# RFC2611 || L. Daigle, D. van Gulik, R. Iannella, P. Faltstrom || leslie@thinkingcat.com, Dirk.vanGulik@jrc.it, renato@dstc.edu.au, paf@swip.net +# RFC2612 || C. Adams, J. Gilchrist || carlisle.adams@entrust.com, jeff.gilchrist@entrust.com +# RFC2613 || R. Waterman, B. Lahaye, D. Romascanu, S. Waldbusser || rich@allot.com, dromasca@gmail.com , waldbusser@ins.com +# RFC2614 || J. Kempf, E. Guttman || james.kempf@sun.com, erik.guttman@sun.com +# RFC2615 || A. Malis, W. Simpson || malis@ascend.com, wsimpson@GreenDragon.com +# RFC2616 || R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, T. Berners-Lee || fielding@ics.uci.edu, jg@w3.org, mogul@wrl.dec.com, frystyk@w3.org, masinter@parc.xerox.com, paulle@microsoft.com, timbl@w3.org +# RFC2617 || J. Franks, P. Hallam-Baker, J. Hostetler, S. Lawrence, P. Leach, A. Luotonen, L. Stewart || john@math.nwu.edu, pbaker@verisign.com, jeff@AbiSource.com, lawrence@agranat.com, paulle@microsoft.com, stewart@OpenMarket.com +# RFC2618 || B. Aboba, G. Zorn || bernarda@microsoft.com, glennz@microsoft.com +# RFC2619 || G. Zorn, B. Aboba || bernarda@microsoft.com, glennz@microsoft.com +# RFC2620 || B. Aboba, G. Zorn || bernarda@microsoft.com, glennz@microsoft.com +# RFC2621 || G. Zorn, B. Aboba || bernarda@microsoft.com, glennz@microsoft.com +# RFC2622 || C. Alaettinoglu, C. Villamizar, E. Gerich, D. Kessens, D. Meyer, T. Bates, D. Karrenberg, M. Terpstra || cengiz@isi.edu, curtis@avici.com, epg@home.net, David.Kessens@qwest.net, meyer@antc.uoregon.edu, tbates@cisco.com, dfk@ripe.net, marten@BayNetworks.com +# RFC2623 || M. Eisler || mre@eng.sun.com +# RFC2624 || S. Shepler || spencer.shepler@eng.sun.com +# RFC2625 || M. Rajagopal, R. Bhagwat, W. Rickard || murali@gadzoox.com, raj@gadzoox.com, wayne@gadzoox.com +# RFC2626 || P. Nesser II || +# RFC2627 || D. Wallner, E. Harder, R. Agee || dmwalln@orion.ncsc.mil, ejh@tycho.ncsc.mil +# RFC2628 || V. Smyslov || svan@trustworks.com +# RFC2629 || M. Rose || mrose17@gmail.com +# RFC2630 || R. Housley || housley@spyrus.com +# RFC2631 || E. Rescorla || ekr@rtfm.com +# RFC2632 || B. Ramsdell, Ed. || +# RFC2633 || B. Ramsdell, Ed. || +# RFC2634 || P. Hoffman, Ed. || phoffman@imc.org +# RFC2635 || S. Hambridge, A. Lunde || +# RFC2636 || R. Gellens || randy@qualcomm.com +# RFC2637 || K. Hamzeh, G. Pall, W. Verthein, J. Taarud, W. Little, G. Zorn || kory@ascend.com, gurdeep@microsoft.com, glennz@microsoft.com +# RFC2638 || K. Nichols, V. Jacobson, L. Zhang || kmn@cisco.com, van@cisco.com, lixia@cs.ucla.edu +# RFC2639 || T. Hastings, C. Manros || tom.hastings@alum.mit.edu, manros@cp10.es.xerox.com +# RFC2640 || B. Curtin || curtinw@ftm.disa.mil +# RFC2641 || D. Hamilton, D. Ruffen || daveh@ctron.com, ruffen@ctron.com +# RFC2642 || L. Kane || lkane@ctron.com +# RFC2643 || D. Ruffen, T. Len, J. Yanacek || ruffen@ctron.com, len@ctron.com, jyanacek@ctron.com +# RFC2644 || D. Senie || dts@senie.com +# RFC2645 || R. Gellens || randy@qualcomm.com +# RFC2646 || R. Gellens, Ed. || +# RFC2647 || D. Newman || +# RFC2648 || R. Moats || jayhawk@att.com +# RFC2649 || B. Greenblatt, P. Richard || bgreenblatt@directory-applications.com, patr@xcert.com +# RFC2650 || D. Meyer, J. Schmitz, C. Orange, M. Prior, C. Alaettinoglu || dmm@cisco.com, SchmitzJo@aol.com, orange@spiritone.com, mrp@connect.com.au, cengiz@isi.edu +# RFC2651 || J. Allen, M. Mealling || jeff.allen@acm.org, michael.mealling@RWhois.net +# RFC2652 || J. Allen, M. Mealling || jeff.allen@acm.org, michael.mealling@RWhois.net +# RFC2653 || J. Allen, P. Leach, R. Hedberg || jeff.allen@acm.org, paulle@microsoft.com, roland@catalogix.ac.se +# RFC2654 || R. Hedberg, B. Greenblatt, R. Moats, M. Wahl || roland@catalogix.ac.se, bgreenblatt@directory-applications.com, jayhawk@att.com +# RFC2655 || T. Hardie, M. Bowman, D. Hardy, M. Schwartz, D. Wessels || hardie@equinix.com, mic@transarc.com, dhardy@netscape.com, wessels@nlanr.net +# RFC2656 || T. Hardie || hardie@equinix.com +# RFC2657 || R. Hedberg || roland@catalogix.ac.se +# RFC2658 || K. McKay || kylem@qualcomm.com +# RFC2659 || E. Rescorla, A. Schiffman || ekr@rtfm.com, ams@terisa.com +# RFC2660 || E. Rescorla, A. Schiffman || ekr@rtfm.com, ams@terisa.com +# RFC2661 || W. Townsley, A. Valencia, A. Rubens, G. Pall, G. Zorn, B. Palter || gurdeep@microsoft.com, palter@zev.net, acr@del.com, townsley@cisco.com, vandys@cisco.com, gwz@acm.org +# RFC2662 || G. Bathrick, F. Ly || bathricg@agcs.com, faye@coppermountain.com +# RFC2663 || P. Srisuresh, M. Holdrege || srisuresh@lucent.com, holdrege@lucent.com +# RFC2664 || R. Plzak, A. Wells, E. Krol || plzakr@saic.com, awel@cs.wisc.edu, krol@uiuc.edu +# RFC2665 || J. Flick, J. Johnson || johnf@rose.hp.com, jeff@redbacknetworks.com +# RFC2666 || J. Flick || johnf@rose.hp.com +# RFC2667 || D. Thaler || dthaler@microsoft.com +# RFC2668 || A. Smith, J. Flick, K. de Graaf, D. Romascanu, D. McMaster, K. McCloghrie, S. Roberts || andrew@extremenetworks.com, johnf@rose.hp.com, kdegraaf@argon.com, dromasca@gmail.com , mcmaster@cisco.com, kzm@cisco.com, sroberts@farallon.com +# RFC2669 || M. St. Johns, Ed. || stjohns@corp.home.net +# RFC2670 || M. St. Johns, Ed. || stjohns@corp.home.net +# RFC2671 || P. Vixie || vixie@isc.org +# RFC2672 || M. Crawford || crawdad@fnal.gov +# RFC2673 || M. Crawford || crawdad@fnal.gov +# RFC2674 || E. Bell, A. Smith, P. Langille, A. Rijhsinghani, K. McCloghrie || Les_Bell@3Com.com, andrew@extremenetworks.com, langille@newbridge.com, anil@cabletron.com, kzm@cisco.com +# RFC2675 || D. Borman, S. Deering, R. Hinden || dab@bsdi.com, deering@cisco.com, bob.hinden@gmail.com +# RFC2676 || G. Apostolopoulos, S. Kama, D. Williams, R. Guerin, A. Orda, T. Przygienda || georgeap@watson.ibm.com, guerin@ee.upenn.edu, ariel@ee.technion.ac.il, dougw@watson.ibm.com +# RFC2677 || M. Greene, J. Cucchiara, J. Luciani || luciani@baynetworks.com, maria@xedia.com, joan@ironbridgenetworks.com +# RFC2678 || J. Mahdavi, V. Paxson || mahdavi@psc.edu, vern@ee.lbl.gov +# RFC2679 || G. Almes, S. Kalidindi, M. Zekauskas || almes@advanced.org, kalidindi@advanced.org, matt@advanced.org +# RFC2680 || G. Almes, S. Kalidindi, M. Zekauskas || almes@advanced.org, kalidindi@advanced.org, matt@advanced.org +# RFC2681 || G. Almes, S. Kalidindi, M. Zekauskas || almes@advanced.org, kalidindi@advanced.org, matt@advanced.org +# RFC2682 || I. Widjaja, A. Elwalid || indra.widjaja@fnc.fujitsu.com, anwar@lucent.com +# RFC2683 || B. Leiba || leiba@watson.ibm.com +# RFC2684 || D. Grossman, J. Heinanen || dan@dma.isg.mot.com, jh@telia.fi +# RFC2685 || B. Fox, B. Gleeson || barbarafox@lucent.com, bgleeson@shastanets.com +# RFC2686 || C. Bormann || cabo@tzi.org +# RFC2687 || C. Bormann || cabo@tzi.org +# RFC2688 || S. Jackowski, D. Putzolu, E. Crawley, B. Davie || stevej@DeterministicNetworks.com, David.Putzolu@intel.com, esc@argon.com, bdavie@cisco.com +# RFC2689 || C. Bormann || cabo@tzi.org +# RFC2690 || S. Bradner || +# RFC2691 || S. Bradner || +# RFC2692 || C. Ellison || carl.m.ellison@intel.com +# RFC2693 || C. Ellison, B. Frantz, B. Lampson, R. Rivest, B. Thomas, T. Ylonen || carl.m.ellison@intel.com, frantz@netcom.com, blampson@microsoft.com, rivest@theory.lcs.mit.edu, bt0008@sbc.com, ylo@ssh.fi +# RFC2694 || P. Srisuresh, G. Tsirtsis, P. Akkiraju, A. Heffernan || srisuresh@yahoo.com, george@gideon.bt.co.uk, spa@cisco.com, ahh@juniper.net +# RFC2695 || A. Chiu || +# RFC2696 || C. Weider, A. Herron, A. Anantha, T. Howes || cweider@microsoft.com, andyhe@microsoft.com, anoopa@microsoft.com, howes@netscape.com +# RFC2697 || J. Heinanen, R. Guerin || jh@telia.fi, guerin@ee.upenn.edu +# RFC2698 || J. Heinanen, R. Guerin || jh@telia.fi, guerin@ee.upenn.edu +# RFC2699 || S. Ginoza || ginoza@isi.edu +# RFC2700 || J. Reynolds, R. Braden || +# RFC2701 || G. Malkin || +# RFC2702 || D. Awduche, J. Malcolm, J. Agogbua, M. O'Dell, J. McManus || awduche@uu.net, jmalcolm@uu.net, ja@uu.net, mo@uu.net, jmcmanus@uu.net +# RFC2703 || G. Klyne || GK@ACM.ORG +# RFC2704 || M. Blaze, J. Feigenbaum, J. Ioannidis, A. Keromytis || mab@research.att.com, jf@research.att.com, ji@research.att.com, angelos@dsl.cis.upenn.edu +# RFC2705 || M. Arango, A. Dugan, I. Elliott, C. Huitema, S. Pickett || marango@rslcom.com, andrew.dugan@l3.com, ike.elliott@l3.com, huitema@research.telcordia.com, ScottP@vertical.com +# RFC2706 || D. Eastlake 3rd, T. Goldstein || dee3@us.ibm.com, tgoldstein@brodia.com +# RFC2707 || R. Bergman, T. Hastings, S. Isaacson, H. Lewis || rbergma@dpc.com, tom.hastings@alum.mit.edu, scott_isaacson@novell.com, harryl@us.ibm.com +# RFC2708 || R. Bergman || rbergman@dpc.com, tom.hastings@alum.mit.edu, scott_isaacson@novell.com, harryl@us.ibm.com, bpenteco@boi.hp.com +# RFC2709 || P. Srisuresh || srisuresh@lucent.com +# RFC2710 || S. Deering, W. Fenner, B. Haberman || deering@cisco.com, fenner@research.att.com, haberman@raleigh.ibm.com +# RFC2711 || C. Partridge, A. Jackson || craig@bbn.com, awjacks@bbn.com +# RFC2712 || A. Medvinsky, M. Hur || amedvins@excitecorp.com, matt.hur@cybersafe.com +# RFC2713 || V. Ryan, S. Seligman, R. Lee || vincent.ryan@ireland.sun.com, scott.seligman@eng.sun.com, rosanna.lee@eng.sun.com +# RFC2714 || V. Ryan, R. Lee, S. Seligman || vincent.ryan@ireland.sun.com, rosanna.lee@eng.sun.com, scott.seligman@eng.sun.com +# RFC2715 || D. Thaler || dthaler@microsoft.com +# RFC2716 || B. Aboba, D. Simon || bernarda@microsoft.com, dansimon@microsoft.com +# RFC2717 || R. Petke, I. King || rpetke@wcom.net, iking@microsoft.com +# RFC2718 || L. Masinter, H. Alvestrand, D. Zigmond, R. Petke || masinter@parc.xerox.com, harald.alvestrand@maxware.no, djz@corp.webtv.net, rpetke@wcom.net +# RFC2719 || L. Ong, I. Rytina, M. Garcia, H. Schwarzbauer, L. Coene, H. Lin, I. Juhasz, M. Holdrege, C. Sharp || long@nortelnetworks.com, ian.rytina@ericsson.com, holdrege@lucent.com, lode.coene@siemens.atea.be, Miguel.A.Garcia@ericsson.com, chsharp@cisco.com, imre.i.juhasz@telia.se, hlin@research.telcordia.com, HannsJuergen.Schwarzbauer@icn.siemens.de +# RFC2720 || N. Brownlee || n.brownlee@auckland.ac.nz +# RFC2721 || N. Brownlee || n.brownlee@auckland.ac.nz +# RFC2722 || N. Brownlee, C. Mills, G. Ruth || n.brownlee@auckland.ac.nz, cmills@gte.com, gruth@bbn.com +# RFC2723 || N. Brownlee || n.brownlee@auckland.ac.nz +# RFC2724 || S. Handelman, S. Stibler, N. Brownlee, G. Ruth || swhandel@us.ibm.com, stibler@us.ibm.com, n.brownlee@auckland.ac.nz, gruth@bbn.com +# RFC2725 || C. Villamizar, C. Alaettinoglu, D. Meyer, S. Murphy || curtis@avici.com, cengiz@ISI.EDU, dmm@cisco.com, sandy@tis.com +# RFC2726 || J. Zsako || zsako@banknet.net +# RFC2727 || J. Galvin || +# RFC2728 || R. Panabaker, S. Wegerif, D. Zigmond || +# RFC2729 || P. Bagnall, R. Briscoe, A. Poppitt || pete@surfaceeffect.com, bob.briscoe@bt.com, apoppitt@jungle.bt.co.uk +# RFC2730 || S. Hanna, B. Patel, M. Shah || steve.hanna@sun.com, baiju.v.patel@intel.com, munils@microsoft.com +# RFC2731 || J. Kunze || jak@ckm.ucsf.edu +# RFC2732 || R. Hinden, B. Carpenter, L. Masinter || bob.hinden@gmail.com, brian@icair.org, LMM@acm.org +# RFC2733 || J. Rosenberg, H. Schulzrinne || schulzrinne@cs.columbia.edu +# RFC2734 || P. Johansson || +# RFC2735 || B. Fox, B. Petri || bfox@equipecom.com, bernhard.petri@icn.siemens.de +# RFC2736 || M. Handley, C. Perkins || mjh@aciri.org, C.Perkins@cs.ucl.ac.uk +# RFC2737 || K. McCloghrie, A. Bierman || kzm@cisco.com, andy@yumaworks.com +# RFC2738 || G. Klyne || GK@ACM.ORG +# RFC2739 || T. Small, D. Hennessy, F. Dawson || +# RFC2740 || R. Coltun, D. Ferguson, J. Moy || rcoltun@siara.com, dennis@juniper.com, jmoy@sycamorenet.com +# RFC2741 || M. Daniele, B. Wijnen, M. Ellison, D. Francisco || daniele@zk3.dec.com, wijnen@vnet.ibm.com, ellison@world.std.com, dfrancis@cisco.com +# RFC2742 || L. Heintz, S. Gudur, M. Ellison || lheintz@cisco.com, sgudur@hotmail.com +# RFC2743 || J. Linn || +# RFC2744 || J. Wray || John_Wray@Iris.com +# RFC2745 || A. Terzis, B. Braden, S. Vincent, L. Zhang || terzis@cs.ucla.edu, braden@isi.edu, svincent@cisco.com, lixia@cs.ucla.edu +# RFC2746 || A. Terzis, J. Krawczyk, J. Wroclawski, L. Zhang || jj@arrowpoint.com, jtw@lcs.mit.edu, lixia@cs.ucla.edu, terzis@cs.ucla.edu +# RFC2747 || F. Baker, B. Lindell, M. Talwar || fred@cisco.com, lindell@ISI.EDU, mohitt@microsoft.com +# RFC2748 || D. Durham, Ed., J. Boyle, R. Cohen, S. Herzog, R. Rajan, A. Sastry || +# RFC2749 || S. Herzog, Ed., J. Boyle, R. Cohen, D. Durham, R. Rajan, A. Sastry || +# RFC2750 || S. Herzog || +# RFC2751 || S. Herzog || +# RFC2752 || S. Yadav, R. Yavatkar, R. Pabbati, P. Ford, T. Moore, S. Herzog || +# RFC2753 || R. Yavatkar, D. Pendarakis, R. Guerin || raj.yavatkar@intel.com, dimitris@watson.ibm.com, guerin@ee.upenn.edu +# RFC2754 || C. Alaettinoglu, C. Villamizar, R. Govindan || cengiz@isi.edu, curtis@avici.com, govindan@isi.edu +# RFC2755 || A. Chiu, M. Eisler, B. Callaghan || alex.chiu@Eng.sun.com, michael.eisler@Eng.sun.com, brent.callaghan@Eng.sun.com +# RFC2756 || P. Vixie, D. Wessels || vixie@isc.org, wessels@nlanr.net +# RFC2757 || G. Montenegro, S. Dawkins, M. Kojo, V. Magret, N. Vaidya || gab@sun.com, sdawkins@nortel.com, kojo@cs.helsinki.fi, vincent.magret@aud.alcatel.com, vaidya@cs.tamu.edu +# RFC2758 || K. White || wkenneth@us.ibm.com +# RFC2759 || G. Zorn || gwz@acm.org +# RFC2760 || M. Allman, Ed., S. Dawkins, D. Glover, J. Griner, D. Tran, T. Henderson, J. Heidemann, J. Touch, H. Kruse, S. Ostermann, K. Scott, J. Semke || mallman@grc.nasa.gov, Spencer.Dawkins.sdawkins@nt.com, Daniel.R.Glover@grc.nasa.gov, jgriner@grc.nasa.gov, dtran@grc.nasa.gov, tomh@cs.berkeley.edu, johnh@isi.edu, touch@isi.edu, hkruse1@ohiou.edu, ostermann@cs.ohiou.edu, kscott@mitre.org, semke@psc.edu +# RFC2761 || J. Dunn, C. Martin || +# RFC2762 || J. Rosenberg, H. Schulzrinne || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu +# RFC2763 || N. Shen, H. Smit || naiming@siara.com, hsmit@cisco.com +# RFC2764 || B. Gleeson, A. Lin, J. Heinanen, G. Armitage, A. Malis || +# RFC2765 || E. Nordmark || nordmark@sun.com +# RFC2766 || G. Tsirtsis, P. Srisuresh || george.tsirtsis@bt.com, srisuresh@yahoo.com +# RFC2767 || K. Tsuchiya, H. Higuchi, Y. Atarashi || tsuchi@ebina.hitachi.co.jp, h-higuti@ebina.hitachi.co.jp, atarashi@ebina.hitachi.co.jp +# RFC2768 || B. Aiken, J. Strassner, B. Carpenter, I. Foster, C. Lynch, J. Mambretti, R. Moore, B. Teitelbaum || raiken@cisco.com, raiken@cisco.com, johns@cisco.com, brian@hursley.ibm.com, foster@mcs.anl.gov, cliff@cni.org, j-mambretti@nwu.edu, moore@sdsc.edu, ben@internet2.edu +# RFC2769 || C. Villamizar, C. Alaettinoglu, R. Govindan, D. Meyer || curtis@avici.com, cengiz@ISI.EDU, govindan@ISI.EDU, dmm@cisco.com +# RFC2770 || D. Meyer, P. Lothberg || dmm@cisco.com, roll@sprint.net +# RFC2771 || R. Finlayson || finlayson@live.com +# RFC2772 || R. Rockell, R. Fink || rrockell@sprint.net, fink@es.net +# RFC2773 || R. Housley, P. Yee, W. Nace || housley@spyrus.com, yee@spyrus.com +# RFC2774 || H. Nielsen, P. Leach, S. Lawrence || frystyk@microsoft.com, paulle@microsoft.com, lawrence@agranat.com +# RFC2775 || B. Carpenter || brian@icair.org +# RFC2776 || M. Handley, D. Thaler, R. Kermode || mjh@aciri.org, dthaler@microsoft.com, Roger.Kermode@motorola.com +# RFC2777 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC2778 || M. Day, J. Rosenberg, H. Sugano || mday@alum.mit.edu, suga@flab.fujitsu.co.jp +# RFC2779 || M. Day, S. Aggarwal, G. Mohr, J. Vincent || mday@alum.mit.edu, sonuag@microsoft.com, gojomo@usa.net, jesse@intonet.com +# RFC2780 || S. Bradner, V. Paxson || sob@harvard.edu, vern@aciri.org +# RFC2781 || P. Hoffman, F. Yergeau || phoffman@imc.org, fyergeau@alis.com +# RFC2782 || A. Gulbrandsen, P. Vixie, L. Esibov || arnt@troll.no, levone@microsoft.com +# RFC2783 || J. Mogul, D. Mills, J. Brittenson, J. Stone, U. Windl || mogul@wrl.dec.com, mills@udel.edu, jonathan@dsg.stanford.edu, ulrich.windl@rz.uni-regensburg.de +# RFC2784 || D. Farinacci, T. Li, S. Hanks, D. Meyer, P. Traina || dino@procket.com, tony1@home.net, stan_hanks@enron.net, dmm@cisco.com, pst@juniper.net +# RFC2785 || R. Zuccherato || robert.zuccherato@entrust.com +# RFC2786 || M. St. Johns || stjohns@corp.home.net +# RFC2787 || B. Jewell, D. Chuang || bjewell@coppermountain.com, david_chuang@cosinecom.com +# RFC2788 || N. Freed, S. Kille || ned.freed@innosoft.com, Steve.Kille@MessagingDirect.com +# RFC2789 || N. Freed, S. Kille || ned.freed@innosoft.com, Steve.Kille@MessagingDirect.com +# RFC2790 || S. Waldbusser, P. Grillo || waldbusser@ins.com +# RFC2791 || J. Yu || jyy@cosinecom.com +# RFC2792 || M. Blaze, J. Ioannidis, A. Keromytis || +# RFC2793 || G. Hellstrom || gunnar.hellstrom@omnitor.se +# RFC2794 || P. Calhoun, C. Perkins || +# RFC2795 || S. Christey || steqve@shore.net +# RFC2796 || T. Bates, R. Chandra, E. Chen || tbates@cisco.com, rchandra@redback.com, enke@redback.com +# RFC2797 || M. Myers, X. Liu, J. Schaad, J. Weinstein || mmyers@verisign.com, xliu@cisco.com, jimsch@nwlink.com, jsw@meer.net +# RFC2798 || M. Smith || mcs@netscape.com +# RFC2799 || S. Ginoza || ginoza@isi.edu +# RFC2800 || J. Reynolds, R. Braden, S. Ginoza || +# RFC2801 || D. Burdett || david.burdett@commerceone.com +# RFC2802 || K. Davidson, Y. Kawatsura || kent@differential.com, kawatura@bisd.hitachi.co.jp +# RFC2803 || H. Maruyama, K. Tamura, N. Uramoto || maruyama@jp.ibm.com, kent@trl.ibm.co.jp, uramoto@jp.ibm.com +# RFC2804 || IAB, IESG || fred@cisco.com, brian@icair.org +# RFC2805 || N. Greene, M. Ramalho, B. Rosen || ngreene@nortelnetworks.com, mramalho@cisco.com, brosen@eng.fore.com +# RFC2806 || A. Vaha-Sipila || avs@iki.fi +# RFC2807 || J. Reagle || reagle@w3.org +# RFC2808 || M. Nystrom || magnus@rsasecurity.com +# RFC2809 || B. Aboba, G. Zorn || bernarda@microsoft.com, gwz@cisco.com +# RFC2810 || C. Kalt || Christophe.Kalt@gmail.com +# RFC2811 || C. Kalt || Christophe.Kalt@gmail.com +# RFC2812 || C. Kalt || Christophe.Kalt@gmail.com +# RFC2813 || C. Kalt || Christophe.Kalt@gmail.com +# RFC2814 || R. Yavatkar, D. Hoffman, Y. Bernet, F. Baker, M. Speer || yavatkar@ibeam.intel.com, yoramb@microsoft.com, fred@cisco.com, speer@Eng.Sun.COM +# RFC2815 || M. Seaman, A. Smith, E. Crawley, J. Wroclawski || andrew@extremenetworks.com, jtw@lcs.mit.edu +# RFC2816 || A. Ghanwani, J. Pace, V. Srinivasan, A. Smith, M. Seaman || aghanwan@nortelnetworks.com, pacew@us.ibm.com, vijay@cosinecom.com, andrew@extremenetworks.com +# RFC2817 || R. Khare, S. Lawrence || rohit@4K-associates.com, lawrence@agranat.com +# RFC2818 || E. Rescorla || ekr@rtfm.com +# RFC2819 || S. Waldbusser || +# RFC2820 || E. Stokes, D. Byrne, B. Blakley, P. Behera || blakley@dascom.com, stokes@austin.ibm.com, djbyrne@us.ibm.com, prasanta@netscape.com +# RFC2821 || J. Klensin, Ed. || +# RFC2822 || P. Resnick, Ed. || presnick@qti.qualcomm.com +# RFC2823 || J. Carlson, P. Langner, E. Hernandez-Valencia, J. Manchester || james.d.carlson@sun.com, plangner@lucent.com, enrique@lucent.com, sterling@hotair.hobl.lucent.com +# RFC2824 || J. Lennox, H. Schulzrinne || lennox@cs.columbia.edu, schulzrinne@cs.columbia.edu +# RFC2825 || IAB, L. Daigle, Ed. || iab@iab.org +# RFC2826 || Internet Architecture Board || iab@iab.org +# RFC2827 || P. Ferguson, D. Senie || ferguson@cisco.com, dts@senie.com +# RFC2828 || R. Shirey || rshirey@bbn.com +# RFC2829 || M. Wahl, H. Alvestrand, J. Hodges, R. Morgan || M.Wahl@innosoft.com, Harald@Alvestrand.no, JHodges@oblix.com, rlmorgan@washington.edu +# RFC2830 || J. Hodges, R. Morgan, M. Wahl || JHodges@oblix.com, rlmorgan@washington.edu, M.Wahl@innosoft.com +# RFC2831 || P. Leach, C. Newman || paulle@microsoft.com, chris.newman@innosoft.com +# RFC2832 || S. Hollenbeck, M. Srivastava || shollenb@netsol.com, manojs@netsol.com +# RFC2833 || H. Schulzrinne, S. Petrack || schulzrinne@cs.columbia.edu, scott.petrack@metatel.com +# RFC2834 || J.-M. Pittet || jmp@sgi.com +# RFC2835 || J.-M. Pittet || jmp@sgi.com +# RFC2836 || S. Brim, B. Carpenter, F. Le Faucheur || sbrim@cisco.com, brian@icair.org, flefauch@cisco.com +# RFC2837 || K. Teow || +# RFC2838 || D. Zigmond, M. Vickers || djz@corp.webtv.net, mav@liberate.com +# RFC2839 || F. da Cruz, J. Altman || +# RFC2840 || J. Altman, F. da Cruz || +# RFC2841 || P. Metzger, W. Simpson || +# RFC2842 || R. Chandra, J. Scudder || rchandra@redback.com, jgs@cisco.com +# RFC2843 || P. Droz, T. Przygienda || dro@zurich.ibm.com, prz@siara.com +# RFC2844 || T. Przygienda, P. Droz, R. Haas || prz@siara.com, dro@zurich.ibm.com, rha@zurich.ibm.com +# RFC2845 || P. Vixie, O. Gudmundsson, D. Eastlake 3rd, B. Wellington || vixie@isc.org, ogud@tislabs.com, dee3@torque.pothole.com, Brian.Wellington@nominum.com +# RFC2846 || C. Allocchio || +# RFC2847 || M. Eisler || mike@eisler.com +# RFC2848 || S. Petrack, L. Conroy || scott.petrack@metatel.com, lwc@roke.co.uk +# RFC2849 || G. Good || ggood@netscape.com +# RFC2850 || Internet Architecture Board, B. Carpenter, Ed. || brian@icair.org +# RFC2851 || M. Daniele, B. Haberman, S. Routhier, J. Schoenwaelder || daniele@zk3.dec.com, haberman@nortelnetworks.com, sar@epilogue.com, schoenw@ibr.cs.tu-bs.de +# RFC2852 || D. Newman || dan.newman@sun.com +# RFC2853 || J. Kabat, M. Upadhyay || jackk@valicert.com, mdu@eng.sun.com +# RFC2854 || D. Connolly, L. Masinter || connolly@w3.org, LM@att.com +# RFC2855 || K. Fujisawa || fujisawa@sm.sony.co.jp +# RFC2856 || A. Bierman, K. McCloghrie, R. Presuhn || andy@yumaworks.com, kzm@cisco.com, rpresuhn@bmc.com +# RFC2857 || A. Keromytis, N. Provos || angelos@dsl.cis.upenn.edu, provos@citi.umich.edu, rgm@icsa.net, tytso@valinux.com +# RFC2858 || T. Bates, Y. Rekhter, R. Chandra, D. Katz || tbates@cisco.com, rchandra@redback.com, dkatz@jnx.com, yakov@cisco.com +# RFC2859 || W. Fang, N. Seddigh, B. Nandy || wfang@cs.princeton.edu, nseddigh@nortelnetworks.com, bnandy@nortelnetworks.com +# RFC2860 || B. Carpenter, F. Baker, M. Roberts || brian@icair.org, fred@cisco.com, roberts@icann.org +# RFC2861 || M. Handley, J. Padhye, S. Floyd || mjh@aciri.org, padhye@aciri.org, floyd@aciri.org +# RFC2862 || M. Civanlar, G. Cash || civanlar@research.att.com, glenn@research.att.com +# RFC2863 || K. McCloghrie, F. Kastenholz || kzm@cisco.com, kasten@argon.com +# RFC2864 || K. McCloghrie, G. Hanson || kzm@cisco.com, gary_hanson@adc.com +# RFC2865 || C. Rigney, S. Willens, A. Rubens, W. Simpson || cdr@telemancy.com, acr@merit.edu, wsimpson@greendragon.com, steve@livingston.com +# RFC2866 || C. Rigney || cdr@telemancy.com +# RFC2867 || G. Zorn, B. Aboba, D. Mitton || gwz@cisco.com, dmitton@nortelnetworks.com, aboba@internaut.com +# RFC2868 || G. Zorn, D. Leifer, A. Rubens, J. Shriver, M. Holdrege, I. Goyret || gwz@cisco.com, leifer@del.com, John.Shriver@intel.com, acr@del.com, matt@ipverse.com, igoyret@lucent.com +# RFC2869 || C. Rigney, W. Willats, P. Calhoun || cdr@telemancy.com, ward@cyno.com, pcalhoun@eng.sun.com, arubens@tutsys.com, bernarda@microsoft.com +# RFC2870 || R. Bush, D. Karrenberg, M. Kosters, R. Plzak || randy@psg.com, daniel.karrenberg@ripe.net, markk@netsol.com, plzakr@saic.com +# RFC2871 || J. Rosenberg, H. Schulzrinne || +# RFC2872 || Y. Bernet, R. Pabbati || yoramb@microsoft.com, rameshpa@microsoft.com +# RFC2873 || X. Xiao, A. Hannan, V. Paxson, E. Crabbe || xipeng@gblx.net, alan@ivmg.net, edc@explosive.net, vern@aciri.org +# RFC2874 || M. Crawford, C. Huitema || crawdad@fnal.gov, huitema@microsoft.com +# RFC2875 || H. Prafullchandra, J. Schaad || hemma@cp.net, jimsch@exmsft.com +# RFC2876 || J. Pawling || john.pawling@wang.com +# RFC2877 || T. Murphy Jr., P. Rieth, J. Stevens || murphyte@us.ibm.com, rieth@us.ibm.com, jssteven@us.ibm.com +# RFC2878 || M. Higashiyama, F. Baker || Mitsuru.Higashiyama@yy.anritsu.co.jp, fred.baker@cisco.com +# RFC2879 || G. Klyne, L. McIntyre || GK@ACM.ORG, Lloyd.McIntyre@pahv.xerox.com +# RFC2880 || L. McIntyre, G. Klyne || Lloyd.McIntyre@pahv.xerox.com, GK@ACM.ORG +# RFC2881 || D. Mitton, M. Beadles || dmitton@nortelnetworks.com, mbeadles@smartpipes.com +# RFC2882 || D. Mitton || dmitton@nortelnetworks.com +# RFC2883 || S. Floyd, J. Mahdavi, M. Mathis, M. Podolsky || floyd@aciri.org, mahdavi@novell.com, mathis@psc.edu, podolsky@eecs.berkeley.edu +# RFC2884 || J. Hadi Salim, U. Ahmed || hadi@nortelnetworks.com, ahmed@sce.carleton.ca +# RFC2885 || F. Cuervo, N. Greene, C. Huitema, A. Rayhan, B. Rosen, J. Segers || +# RFC2886 || T. Taylor || tom.taylor.stds@gmail.com +# RFC2887 || M. Handley, S. Floyd, B. Whetten, R. Kermode, L. Vicisano, M. Luby || mjh@aciri.org, floyd@aciri.org, whetten@talarian.com, Roger.Kermode@motorola.com, lorenzo@cisco.com, luby@digitalfountain.com +# RFC2888 || P. Srisuresh || srisuresh@yahoo.com +# RFC2889 || R. Mandeville, J. Perser || bob@cqos.com, jerry_perser@netcomsystems.com +# RFC2890 || G. Dommety || gdommety@cisco.com +# RFC2891 || T. Howes, M. Wahl, A. Anantha || anoopa@microsoft.com, howes@loudcloud.com, Mark.Wahl@sun.com +# RFC2892 || D. Tsiang, G. Suwala || tsiang@cisco.com, gsuwala@cisco.com +# RFC2893 || R. Gilligan, E. Nordmark || gilligan@freegate.com, nordmark@eng.sun.com +# RFC2894 || M. Crawford || crawdad@fnal.gov +# RFC2895 || A. Bierman, C. Bucci, R. Iddon || andy@yumaworks.com, cbucci@cisco.com +# RFC2896 || A. Bierman, C. Bucci, R. Iddon || andy@yumaworks.com, cbucci@cisco.com +# RFC2897 || D. Cromwell || cromwell@nortelnetworks.com +# RFC2898 || B. Kaliski || bkaliski@rsasecurity.com +# RFC2899 || S. Ginoza || ginoza@isi.edu +# RFC2900 || J. Reynolds, R. Braden, S. Ginoza || +# RFC2901 || Z. Wenzel, J. Klensin, R. Bush, S. Huter || zita@nsrc.org, klensin@nsrc.org, randy@nsrc.org, sghuter@nsrc.org +# RFC2902 || S. Deering, S. Hares, C. Perkins, R. Perlman || deering@cisco.com, skh@nexthop.com, Radia.Perlman@sun.com, Charles.Perkins@nokia.com +# RFC2903 || C. de Laat, G. Gross, L. Gommans, J. Vollbrecht, D. Spence || delaat@phys.uu.nl, gmgross@lucent.com, jrv@interlinknetworks.com, dspence@interlinknetworks.com +# RFC2904 || J. Vollbrecht, P. Calhoun, S. Farrell, L. Gommans, G. Gross, B. de Bruijn, C. de Laat, M. Holdrege, D. Spence || pcalhoun@eng.sun.com, stephen.farrell@baltimore.ie, betty@euronet.nl, delaat@phys.uu.nl, matt@ipverse.com, dspence@interlinknetworks.com +# RFC2905 || J. Vollbrecht, P. Calhoun, S. Farrell, L. Gommans, G. Gross, B. de Bruijn, C. de Laat, M. Holdrege, D. Spence || jrv@interlinknetworks.com, pcalhoun@eng.sun.com, stephen.farrell@baltimore.ie, gmgross@lucent.com, betty@euronet.nl, delaat@phys.uu.nl, matt@ipverse.com, dspence@interlinknetworks.com +# RFC2906 || S. Farrell, J. Vollbrecht, P. Calhoun, L. Gommans, G. Gross, B. de Bruijn, C. de Laat, M. Holdrege, D. Spence || stephen.farrell@baltimore.ie, jrv@interlinknetworks.com, pcalhoun@eng.sun.com, gmgross@lucent.com, betty@euronet.nl, delaat@phys.uu.nl, matt@ipverse.com, dspence@interlinknetworks.com +# RFC2907 || R. Kermode || Roger.Kermode@motorola.com +# RFC2908 || D. Thaler, M. Handley, D. Estrin || dthaler@microsoft.com, mjh@aciri.org, estrin@usc.edu +# RFC2909 || P. Radoslavov, D. Estrin, R. Govindan, M. Handley, S. Kumar, D. Thaler || pavlin@catarina.usc.edu, estrin@isi.edu, govindan@isi.edu, mjh@aciri.org, kkumar@usc.edu, dthaler@microsoft.com +# RFC2910 || R. Herriot, Ed., S. Butler, P. Moore, R. Turner, J. Wenn || robert.herriot@pahv.xerox.com, sbutler@boi.hp.com, pmoore@peerless.com, jwenn@cp10.es.xerox.com, tom.hastings@alum.mit.edu, robert.herriot@pahv.xerox.com +# RFC2911 || T. Hastings, Ed., R. Herriot, R. deBry, S. Isaacson, P. Powell || sisaacson@novell.com, tom.hastings@alum.mit.edu, robert.herriot@pahv.xerox.com, debryro@uvsc.edu, papowell@astart.com +# RFC2912 || G. Klyne || GK@ACM.ORG +# RFC2913 || G. Klyne || GK@ACM.ORG +# RFC2914 || S. Floyd || +# RFC2915 || M. Mealling, R. Daniel || michaelm@netsol.com, rdaniel@datafusion.net +# RFC2916 || P. Faltstrom || paf@cisco.com +# RFC2917 || K. Muthukrishnan, A. Malis || mkarthik@lucent.com, Andy.Malis@vivacenetworks.com +# RFC2918 || E. Chen || enke@redback.com +# RFC2919 || R. Chandhok, G. Wenger || chandhok@qualcomm.com, gwenger@qualcomm.com +# RFC2920 || N. Freed || ned.freed@innosoft.com +# RFC2921 || B. Fink || fink@es.net +# RFC2922 || A. Bierman, K. Jones || andy@yumaworks.com, kejones@nortelnetworks.com +# RFC2923 || K. Lahey || +# RFC2924 || N. Brownlee, A. Blount || n.brownlee@auckland.ac.nz, blount@alum.mit.edu +# RFC2925 || K. White || wkenneth@us.ibm.com +# RFC2926 || J. Kempf, R. Moats, P. St. Pierre || james.kempf@sun.com, rmoats@coreon.net, Pete.StPierre@Eng.Sun.COM +# RFC2927 || M. Wahl || Mark.Wahl@sun.com +# RFC2928 || R. Hinden, S. Deering, R. Fink, T. Hain || bob.hinden@gmail.com, deering@cisco.com, rlfink@lbl.gov, tonyhain@microsoft.com +# RFC2929 || D. Eastlake 3rd, E. Brunner-Williams, B. Manning || Donald.Eastlake@motorola.com, brunner@engage.com, bmanning@isi.edu +# RFC2930 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC2931 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC2932 || K. McCloghrie, D. Farinacci, D. Thaler || kzm@cisco.com, dthaler@microsoft.com +# RFC2933 || K. McCloghrie, D. Farinacci, D. Thaler || kzm@cisco.com, dthaler@microsoft.com +# RFC2934 || K. McCloghrie, D. Farinacci, D. Thaler, B. Fenner || kzm@cisco.com, dthaler@microsoft.com, fenner@research.att.com +# RFC2935 || D. Eastlake 3rd, C. Smith || Donald.Eastlake@motorola.com, chris.smith@royalbank.com +# RFC2936 || D. Eastlake 3rd, C. Smith, D. Soroka || Donald.Eastlake@motorola.com, chris.smith@royalbank.com, dsoroka@us.ibm.com +# RFC2937 || C. Smith || cs@Eng.Sun.COM +# RFC2938 || G. Klyne, L. Masinter || GK@ACM.ORG, LMM@acm.org +# RFC2939 || R. Droms || droms@bucknell.edu +# RFC2940 || A. Smith, D. Partain, J. Seligson || David.Partain@ericsson.com, jseligso@nortelnetworks.com +# RFC2941 || T. Ts'o, Ed., J. Altman || tytso@mit.edu, jaltman@columbia.edu +# RFC2942 || T. Ts'o || +# RFC2943 || R. Housley, T. Horting, P. Yee || housley@spyrus.com, thorting@spyrus.com, yee@spyrus.com +# RFC2944 || T. Wu || tjw@cs.Stanford.EDU +# RFC2945 || T. Wu || tjw@cs.Stanford.EDU +# RFC2946 || T. Ts'o || tytso@mit.edu +# RFC2947 || J. Altman || jaltman@columbia.edu +# RFC2948 || J. Altman || jaltman@columbia.edu +# RFC2949 || J. Altman || jaltman@columbia.edu +# RFC2950 || J. Altman || jaltman@columbia.edu +# RFC2951 || R. Housley, T. Horting, P. Yee || housley@spyrus.com, thorting@spyrus.com, yee@spyrus.com +# RFC2952 || T. Ts'o || tytso@mit.edu +# RFC2953 || T. Ts'o || tytso@mit.edu +# RFC2954 || K. Rehbehn, D. Fowler || krehbehn@megisto.com, fowler@syndesis.com +# RFC2955 || K. Rehbehn, O. Nicklass, G. Mouradian || krehbehn@megisto.com, orly_n@rad.co.il, gvm@att.com +# RFC2956 || M. Kaat || Marijke.Kaat@surfnet.nl +# RFC2957 || L. Daigle, P. Faltstrom || paf@cisco.com +# RFC2958 || L. Daigle, P. Faltstrom || paf@cisco.com +# RFC2959 || M. Baugher, B. Strahm, I. Suconick || mbaugher@passedge.com, Bill.Strahm@intel.com, irina@ennovatenetworks.com +# RFC2960 || R. Stewart, Q. Xie, K. Morneault, C. Sharp, H. Schwarzbauer, T. Taylor, I. Rytina, M. Kalla, L. Zhang, V. Paxson || randall@lakerest.net, qxie1@email.mot.com, kmorneau@cisco.com, chsharp@cisco.com, HannsJuergen.Schwarzbauer@icn.siemens.de, tom.taylor.stds@gmail.com, ian.rytina@ericsson.com, mkalla@telcordia.com, lixia@cs.ucla.edu, vern@aciri.org +# RFC2961 || L. Berger, D. Gan, G. Swallow, P. Pan, F. Tommasi, S. Molendini || lberger@labn.net, swallow@cisco.com, franco.tommasi@unile.it, molendini@ultra5.unile.it +# RFC2962 || D. Raz, J. Schoenwaelder, B. Sugla || raz@lucent.com, schoenw@ibr.cs.tu-bs.de, sugla@ispsoft.com +# RFC2963 || O. Bonaventure, S. De Cnodder || Olivier.Bonaventure@info.fundp.ac.be, stefaan.de_cnodder@alcatel.be +# RFC2964 || K. Moore, N. Freed || moore@cs.utk.edu, ned.freed@innosoft.com +# RFC2965 || D. Kristol, L. Montulli || +# RFC2966 || T. Li, T. Przygienda, H. Smit || tli@procket.com, prz@redback.com, henk@procket.com +# RFC2967 || L. Daigle, R. Hedberg || leslie@thinkingcat.com, Roland@catalogix.se +# RFC2968 || L. Daigle, T. Eklof || leslie@thinkingcat.com, thommy.eklof@hotsip.com +# RFC2969 || T. Eklof, L. Daigle || thommy.eklof@hotsip.com, leslie@thinkingcat.com +# RFC2970 || L. Daigle, T. Eklof || leslie@thinkingcat.com, thommy.eklof@hotsip.com +# RFC2971 || T. Showalter || tjs@mirapoint.com +# RFC2972 || N. Popp, M. Mealling, L. Masinter, K. Sollins || LMM@acm.org, michaelm@netsol.com, nico@realnames.com, sollins@lcs.mit.edu +# RFC2973 || R. Balay, D. Katz, J. Parker || Rajesh.Balay@cosinecom.com, dkatz@juniper.net, jparker@axiowave.com +# RFC2974 || M. Handley, C. Perkins, E. Whelan || mjh@aciri.org, csp@isi.edu, e.whelan@cs.ucl.ac.uk +# RFC2975 || B. Aboba, J. Arkko, D. Harrington || bernarda@microsoft.com, Jari.Arkko@ericsson.com, dbh@cabletron.com +# RFC2976 || S. Donovan || +# RFC2977 || S. Glass, T. Hiller, S. Jacobs, C. Perkins || +# RFC2978 || N. Freed, J. Postel || ned.freed@innosoft.com +# RFC2979 || N. Freed || ned.freed@innosoft.com +# RFC2980 || S. Barber || sob@academ.com +# RFC2981 || R. Kavasseri, Ed. || ramk@cisco.com +# RFC2982 || R. Kavasseri, Ed. || ramk@cisco.com +# RFC2983 || D. Black || black_david@emc.com +# RFC2984 || C. Adams || cadams@entrust.com +# RFC2985 || M. Nystrom, B. Kaliski || magnus@rsasecurity.com, bkaliski@rsasecurity.com +# RFC2986 || M. Nystrom, B. Kaliski || magnus@rsasecurity.com, bkaliski@rsasecurity.com +# RFC2987 || P. Hoffman || phoffman@imc.org +# RFC2988 || V. Paxson, M. Allman || vern@aciri.org, mallman@grc.nasa.gov +# RFC2989 || B. Aboba, P. Calhoun, S. Glass, T. Hiller, P. McCann, H. Shiino, P. Walsh, G. Zorn, G. Dommety, C. Perkins, B. Patil, D. Mitton, S. Manning, M. Beadles, X. Chen, S. Sivalingham, A. Hameed, M. Munson, S. Jacobs, B. Lim, B. Hirschman, R. Hsu, H. Koo, M. Lipford, E. Campbell, Y. Xu, S. Baba, E. Jaques || bernarda@microsoft.com, pcalhoun@eng.sun.com, steven.glass@sun.com, tom.hiller@lucent.com, mccap@lucent.com, hshiino@lucent.com, walshp@lucent.com, gwz@cisco.com, gdommety@cisco.com, charliep@iprg.nokia.com, Basavaraj.Patil@nokia.com, dmitton@nortelnetworks.com, smanning@nortelnetworks.com, mbeadles@smartpipes.com, xing.chen@usa.alcatel.com, s.sivalingham@ericsson.com, none, mmunson@mobilnet.gte.com, sjacobs@gte.com, bklim@lgic.co.kr, qa4053@email.mot.com, rhsu@qualcomm.com, hskoo@sta.samsung.com, mlipfo01@sprintspectrum.com, ed_campbell@3com.com, yxu@watercove.com, sbaba@tari.toshiba.com, ejaques@akamail.com +# RFC2990 || G. Huston || gih@telstra.net +# RFC2991 || D. Thaler, C. Hopps || dthaler@dthaler.microsoft.com, chopps@nexthop.com +# RFC2992 || C. Hopps || chopps@nexthop.com +# RFC2993 || T. Hain || tonyhain@microsoft.com +# RFC2994 || H. Ohta, M. Matsui || hidenori@iss.isl.melco.co.jp, matsui@iss.isl.melco.co.jp +# RFC2995 || H. Lu, Ed., I. Faynberg, J. Voelker, M. Weissman, W. Zhang, S. Rhim, J. Hwang, S. Ago, S. Moeenuddin, S. Hadvani, S. Nyckelgard, J. Yoakum, L. Robart || faynberg@lucent.com, huilanlu@lucent.com, jvoelker@lucent.com, maw1@lucent.com, wzz@lucent.com, syrhim@kt.co.kr, jkhwang@kt.co.kr, ago@ssf.abk.nec.co.jp, moeen@asl.dl.nec.com, hadvani@asl.dl.nec.com, soren.m.nyckelgard@telia.se, yoakum@nortelnetworks.com, robart@nortelnetworks.com +# RFC2996 || Y. Bernet || yoramb@microsoft.com +# RFC2997 || Y. Bernet, A. Smith, B. Davie || Yoramb@microsoft.com, bsd@cisco.com +# RFC2998 || Y. Bernet, P. Ford, R. Yavatkar, F. Baker, L. Zhang, M. Speer, R. Braden, B. Davie, J. Wroclawski, E. Felstaine || yoramb@microsoft.com, raj.yavatkar@intel.com, peterf@microsoft.com, fred@cisco.com, lixia@cs.ucla.edu, speer@Eng.Sun.COM, braden@isi.edu, bsd@cisco.com, jtw@lcs.mit.edu +# RFC2999 || S. Ginoza || ginoza@isi.edu +# RFC3000 || J. Reynolds, R. Braden, S. Ginoza, L. Shiota || +# RFC3001 || M. Mealling || michaelm@netsol.com +# RFC3002 || D. Mitzel || mitzel@iprg.nokia.com +# RFC3003 || M. Nilsson || nilsson@id3.org +# RFC3004 || G. Stump, R. Droms, Y. Gu, R. Vyaghrapuri, A. Demirtjis, B. Beser, J. Privat || stumpga@us.ibm.com, rdroms@cisco.com, yegu@microsoft.com, rameshv@microsoft.com, annd@microsoft.com +# RFC3005 || S. Harris || srh@merit.edu +# RFC3006 || B. Davie, C. Iturralde, D. Oran, S. Casner, J. Wroclawski || bsd@cisco.com, cei@cisco.com, oran@cisco.com, casner@acm.org, jtw@lcs.mit.edu +# RFC3007 || B. Wellington || Brian.Wellington@nominum.com +# RFC3008 || B. Wellington || Brian.Wellington@nominum.com +# RFC3009 || J. Rosenberg, H. Schulzrinne || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu +# RFC3010 || S. Shepler, B. Callaghan, D. Robinson, R. Thurlow, C. Beame, M. Eisler, D. Noveck || beame@bws.com, brent.callaghan@sun.com, mike@eisler.com, david.robinson@sun.com, robert.thurlow@sun.com +# RFC3011 || G. Waters || +# RFC3012 || C. Perkins, P. Calhoun || +# RFC3013 || T. Killalea || tomk@neart.org +# RFC3014 || R. Kavasseri || ramk@cisco.com +# RFC3015 || F. Cuervo, N. Greene, A. Rayhan, C. Huitema, B. Rosen, J. Segers || +# RFC3016 || Y. Kikuchi, T. Nomura, S. Fukunaga, Y. Matsui, H. Kimata || yoshihiro.kikuchi@toshiba.co.jp, matsui@drl.mei.co.jp, t-nomura@ccm.cl.nec.co.jp, fukunaga444@oki.co.jp, kimata@nttvdt.hil.ntt.co.jp +# RFC3017 || M. Riegel, G. Zorn || maximilian.riegel@icn.siemens.de, gwz@cisco.com +# RFC3018 || A. Bogdanov || a_bogdanov@iname.ru +# RFC3019 || B. Haberman, R. Worzella || haberman@nortelnetworks.com, worzella@us.ibm.com +# RFC3020 || P. Pate, B. Lynch, K. Rehbehn || prayson.pate@overturenetworks.com, bob.lynch@overturenetworks.com, krehbehn@megisto.com +# RFC3021 || A. Retana, R. White, V. Fuller, D. McPherson || aretana@cisco.com, riw@cisco.com, vaf@valinor.barrnet.net, danny@ambernetworks.com +# RFC3022 || P. Srisuresh, K. Egevang || srisuresh@yahoo.com, kjeld.egevang@intel.com +# RFC3023 || M. Murata, S. St. Laurent, D. Kohn || mmurata@trl.ibm.co.jp, simonstl@simonstl.com, dan@dankohn.com +# RFC3024 || G. Montenegro, Ed. || +# RFC3025 || G. Dommety, K. Leung || gdommety@cisco.com, kleung@cisco.com +# RFC3026 || R. Blane || Roy_Blane@inmarsat.com +# RFC3027 || M. Holdrege, P. Srisuresh || matt@ipverse.com, srisuresh@yahoo.com +# RFC3028 || T. Showalter || tjs@mirapoint.com +# RFC3029 || C. Adams, P. Sylvester, M. Zolotarev, R. Zuccherato || cadams@entrust.com, mzolotarev@baltimore.com, peter.sylvester@edelweb.fr, robert.zuccherato@entrust.com +# RFC3030 || G. Vaudreuil || GregV@ieee.org +# RFC3031 || E. Rosen, A. Viswanathan, R. Callon || erosen@cisco.com, arun@force10networks.com, rcallon@juniper.net +# RFC3032 || E. Rosen, D. Tappan, G. Fedorkow, Y. Rekhter, D. Farinacci, T. Li, A. Conta || erosen@cisco.com, tappan@cisco.com, yakov@juniper.net, fedorkow@cisco.com, dino@procket.com, tli@procket.com, aconta@txc.com +# RFC3033 || M. Suzuki || suzuki.muneyoshi@lab.ntt.co.jp +# RFC3034 || A. Conta, P. Doolan, A. Malis || aconta@txc.com, pdoolan@ennovatenetworks.com, Andy.Malis@vivacenetworks.com +# RFC3035 || B. Davie, J. Lawrence, K. McCloghrie, E. Rosen, G. Swallow, Y. Rekhter, P. Doolan || bsd@cisco.com, pdoolan@ennovatenetworks.com, jlawrenc@cisco.com, kzm@cisco.com, yakov@juniper.net, erosen@cisco.com, swallow@cisco.com +# RFC3036 || L. Andersson, P. Doolan, N. Feldman, A. Fredette, B. Thomas || loa.andersson@nortelnetworks.com, pdoolan@ennovatenetworks.com, nkf@us.ibm.com, fredette@photonex.com, rhthomas@cisco.com +# RFC3037 || B. Thomas, E. Gray || ewgray@mindspring.com, rhthomas@cisco.com +# RFC3038 || K. Nagami, Y. Katsube, N. Demizu, H. Esaki, P. Doolan || ken.nagami@toshiba.co.jp, demizu@dd.iij4u.or.jp, hiroshi@wide.ad.jp, yasuhiro.katsube@toshiba.co.jp, pdoolan@ennovatenetworks.com +# RFC3039 || S. Santesson, W. Polk, P. Barzin, M. Nystrom || stefan@addtrust.com, wpolk@nist.gov, barzin@secude.com, magnus@rsasecurity.com +# RFC3040 || I. Cooper, I. Melve, G. Tomlinson || icooper@equinix.com, Ingrid.Melve@uninett.no, gary.tomlinson@cacheflow.com +# RFC3041 || T. Narten, R. Draves || narten@raleigh.ibm.com, richdr@microsoft.com +# RFC3042 || M. Allman, H. Balakrishnan, S. Floyd || mallman@grc.nasa.gov, hari@lcs.mit.edu, floyd@aciri.org +# RFC3043 || M. Mealling || michaelm@netsol.com +# RFC3044 || S. Rozenfeld || +# RFC3045 || M. Meredith || mark_meredith@novell.com +# RFC3046 || M. Patrick || michael.patrick@motorola.com +# RFC3047 || P. Luthi || luthip@pictel.com +# RFC3048 || B. Whetten, L. Vicisano, R. Kermode, M. Handley, S. Floyd, M. Luby || whetten@talarian.com, lorenzo@cisco.com, Roger.Kermode@motorola.com, mjh@aciri.org, luby@digitalfountain.com +# RFC3049 || J. Naugle, K. Kasthurirangan, G. Ledford || jnaugle@us.ibm.com, kasthuri@us.ibm.com, gledford@zephyrcorp.com +# RFC3050 || J. Lennox, H. Schulzrinne, J. Rosenberg || lennox@cs.columbia.edu, jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu +# RFC3051 || J. Heath, J. Border || jheath@hns.com, border@hns.com +# RFC3052 || M. Eder, S. Nag || michael.eder@nokia.com, thinker@monmouth.com +# RFC3053 || A. Durand, P. Fasano, I. Guardini, D. Lento || Alain.Durand@sun.com, paolo.fasano@cselt.it, ivano.guardini@cselt.it, dlento@mail.tim.it +# RFC3054 || P. Blatherwick, R. Bell, P. Holland || blather@nortelnetworks.com, rtbell@cisco.com, phil.holland@circa.ca +# RFC3055 || M. Krishnaswamy, D. Romascanu || murali@lucent.com, dromasca@gmail.com +# RFC3056 || B. Carpenter, K. Moore || brian@icair.org, moore@cs.utk.edu +# RFC3057 || K. Morneault, S. Rengasami, M. Kalla, G. Sidebottom || kmorneau@cisco.com, mkalla@telcordia.com, srengasa@telcordia.com, gregside@nortelnetworks.com +# RFC3058 || S. Teiwes, P. Hartmann, D. Kuenzi || stephan.teiwes@it-sec.com, peter.hartmann@it-sec.com, dkuenzi@724.com +# RFC3059 || E. Guttman || Erik.Guttman@sun.com +# RFC3060 || B. Moore, E. Ellesson, J. Strassner, A. Westerinen || eellesson@lboard.com, remoore@us.ibm.com, johns@cisco.com, andreaw@cisco.com +# RFC3061 || M. Mealling || michaelm@netsol.com +# RFC3062 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3063 || Y. Ohba, Y. Katsube, E. Rosen, P. Doolan || yoshihiro.ohba@toshiba.co.jp, yasuhiro.katsube@toshiba.co.jp, erosen@cisco.com, pdoolan@ennovatenetworks.com +# RFC3064 || B. Foster || bfoster@cisco.com +# RFC3065 || P. Traina, D. McPherson, J. Scudder || danny@ambernetworks.com, jgs@cisco.com +# RFC3066 || H. Alvestrand || Harald@Alvestrand.no +# RFC3067 || J. Arvidsson, A. Cormack, Y. Demchenko, J. Meijer || Jimmy.J.Arvidsson@telia.se, Andrew.Cormack@ukerna.ac.uk, demch@terena.nl, jan.meijer@surfnet.nl +# RFC3068 || C. Huitema || huitema@microsoft.com +# RFC3069 || D. McPherson, B. Dykes || danny@ambernetworks.com, bdykes@onesecure.com +# RFC3070 || V. Rawat, R. Tio, S. Nanji, R. Verma || vrawat@oni.com, tor@redback.com, rverma@dc.com, suhail@redback.com +# RFC3071 || J. Klensin || klensin@jck.com +# RFC3072 || M. Wildgrube || max@wildgrube.com +# RFC3073 || J. Collins || jcollins@bitstream.com +# RFC3074 || B. Volz, S. Gonczi, T. Lemon, R. Stevens || bernie.volz@ericsson.com, steve.gonczi@networkengines.com, ted.lemon@nominum.com, robs@join.com +# RFC3075 || D. Eastlake 3rd, J. Reagle, D. Solo || Donald.Eastlake@motorola.com, reagle@w3.org, dsolo@alum.mit.edu +# RFC3076 || J. Boyer || jboyer@PureEdge.com +# RFC3077 || E. Duros, W. Dabbous, H. Izumiyama, N. Fujii, Y. Zhang || +# RFC3078 || G. Pall, G. Zorn || gurdeep@microsoft.com, gwz@cisco.com +# RFC3079 || G. Zorn || gwz@cisco.com +# RFC3080 || M. Rose || mrose17@gmail.com +# RFC3081 || M. Rose || mrose17@gmail.com +# RFC3082 || J. Kempf, J. Goldschmidt || james.kempf@sun.com, jason.goldschmidt@sun.com +# RFC3083 || R. Woundy || rwoundy@cisco.com +# RFC3084 || K. Chan, J. Seligson, D. Durham, S. Gai, K. McCloghrie, S. Herzog, F. Reichmeyer, R. Yavatkar, A. Smith || khchan@nortelnetworks.com, sgai@cisco.com, Herzog@iphighway.com, kzm@cisco.com, franr@pfn.com, raj.yavatkar@intel.com, andrew@allegronetworks.com +# RFC3085 || A. Coates, D. Allen, D. Rivers-Moore || tony.coates@reuters.com, ho73@dial.pipex.com, daniel.rivers-moore@rivcom.com +# RFC3086 || K. Nichols, B. Carpenter || nichols@packetdesign.com, brian@icair.org +# RFC3087 || B. Campbell, R. Sparks || bcampbell@dynamicsoft.com, rsparks@dynamicsoft.com +# RFC3088 || K. Zeilenga || kurt@openldap.org +# RFC3089 || H. Kitamura || kitamura@da.jp.nec.com +# RFC3090 || E. Lewis || lewis@tislabs.com +# RFC3091 || H. Kennedy || kennedyh@engin.umich.edu +# RFC3092 || D. Eastlake 3rd, C. Manros, E. Raymond || Donald.Eastlake@motorola.com, manros@cp10.es.xerox.com, esr@thyrsus.com +# RFC3093 || M. Gaynor, S. Bradner || +# RFC3094 || D. Sprague, R. Benedyk, D. Brendes, J. Keller || david.sprague@tekelec.com, dan.brendes@tekelec.com, robby.benedyk@tekelec.com, joe.keller@tekelec.com +# RFC3095 || C. Bormann, C. Burmeister, M. Degermark, H. Fukushima, H. Hannu, L-E. Jonsson, R. Hakenberg, T. Koren, K. Le, Z. Liu, A. Martensson, A. Miyazaki, K. Svanbro, T. Wiebke, T. Yoshimura, H. Zheng || cabo@tzi.org, burmeister@panasonic.de, micke@cs.arizona.edu, fukusima@isl.mei.co.jp, hans.hannu@ericsson.com, lars-erik.jonsson@ericsson.com, hakenberg@panasonic.de, tmima@cisco.com, khiem.le@nokia.com, zhigang.liu@nokia.com, anton.martensson@era.ericsson.se, akihiro@isl.mei.co.jp, krister.svanbro@ericsson.com, wiebke@panasonic.de, yoshi@spg.yrp.nttdocomo.co.jp, haihong.zheng@nokia.com +# RFC3096 || M. Degermark, Ed. || +# RFC3097 || R. Braden, L. Zhang || Braden@ISI.EDU, lixia@cs.ucla.edu +# RFC3098 || T. Gavin, D. Eastlake 3rd, S. Hambridge || tedgavin@newsguy.com, Donald.Eastlake@motorola.com, sallyh@ludwig.sc.intel.com +# RFC3099 || S. Ginoza || ginoza@isi.edu +# RFC3100 || || +# RFC3101 || P. Murphy || pmurphy@noc.usgs.net +# RFC3102 || M. Borella, J. Lo, D. Grabelsky, G. Montenegro || mike_borella@commworks.com, yidarlo@yahoo.com, david_grabelsky@commworks.com, gab@sun.com +# RFC3103 || M. Borella, D. Grabelsky, J. Lo, K. Taniguchi || mike_borella@commworks.com, david_grabelsky@commworks.com, yidarlo@yahoo.com, taniguti@ccrl.sj.nec.com +# RFC3104 || G. Montenegro, M. Borella || gab@sun.com, mike_borella@commworks.com +# RFC3105 || J. Kempf, G. Montenegro || gab@sun.com +# RFC3106 || D. Eastlake 3rd, T. Goldstein || Donald.Eastlake@motorola.com, tgoldstein@brodia.com +# RFC3107 || Y. Rekhter, E. Rosen || yakov@juniper.net, erosen@cisco.com +# RFC3108 || R. Kumar, M. Mostafa || rkumar@cisco.com, mmostafa@cisco.com +# RFC3109 || R. Braden, R. Bush, J. Klensin || braden@isi.edu, randy@psg.com, klensin@jck.com +# RFC3110 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC3111 || E. Guttman || Erik.Guttman@germany.sun.com +# RFC3112 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3113 || K. Rosenbrock, R. Sanmugam, S. Bradner, J. Klensin || rosenbrock@etsi.fr, sob@harvard.edu, 3GPPContact@etsi.fr +# RFC3114 || W. Nicolls || wnicolls@forsythesolutions.com +# RFC3115 || G. Dommety, K. Leung || gdommety@cisco.com, kleung@cisco.com +# RFC3116 || J. Dunn, C. Martin || Jeffrey.Dunn@worldnet.att.net, Cynthia.E.Martin@worldnet.att.net +# RFC3117 || M. Rose || mrose17@gmail.com +# RFC3118 || R. Droms, Ed., W. Arbaugh, Ed. || +# RFC3119 || R. Finlayson || finlayson@live.com +# RFC3120 || K. Best, N. Walsh || karl.best@oasis-open.org, Norman.Walsh@East.Sun.COM +# RFC3121 || K. Best, N. Walsh || karl.best@oasis-open.org, Norman.Walsh@East.Sun.COM +# RFC3122 || A. Conta || aconta@txc.com +# RFC3123 || P. Koch || pk@TechFak.Uni-Bielefeld.DE +# RFC3124 || H. Balakrishnan, S. Seshan || hari@lcs.mit.edu, srini@cmu.edu +# RFC3125 || J. Ross, D. Pinkas, N. Pope || harri.rasilainen@etsi.fr, ross@secstan.com, Denis.Pinkas@bull.net, pope@secstan.com +# RFC3126 || D. Pinkas, J. Ross, N. Pope || harri.rasilainen@etsi.fr, Denis.Pinkas@bull.net, ross@secstan.com, pope@secstan.com +# RFC3127 || D. Mitton, M. St.Johns, S. Barkley, D. Nelson, B. Patil, M. Stevens, B. Wolff || dmitton@nortelnetworks.com, stjohns@rainmakertechnologies.com, stuartb@uu.net, dnelson@enterasys.com, Basavaraj.Patil@nokia.com, mstevens@ellacoya.com, barney@databus.com +# RFC3128 || I. Miller || Ian_Miller@singularis.ltd.uk +# RFC3129 || M. Thomas || mat@cisco.com +# RFC3130 || E. Lewis || +# RFC3131 || S. Bradner, P. Calhoun, H. Cuschieri, S. Dennett, G. Flynn, M. Lipford, M. McPheters || sob@harvard.edu, pcalhoun@eng.sun.com, hcuschie@tia.eia.org, S.Dennett@motorola.com, gerry.flynn@verizonwireless.com, mjmcpheters@lucent.com +# RFC3132 || J. Kempf || +# RFC3133 || J. Dunn, C. Martin || +# RFC3134 || J. Dunn, C. Martin || +# RFC3135 || J. Border, M. Kojo, J. Griner, G. Montenegro, Z. Shelby || border@hns.com, kojo@cs.helsinki.fi, jgriner@grc.nasa.gov, gab@sun.com, zach.shelby@ee.oulu.fi +# RFC3136 || L. Slutsman, Ed., I. Faynberg, H. Lu, M. Weissman || faynberg@lucent.com, huilanlu@lucent.com, maw1@lucent.com, lslutsman@att.com +# RFC3137 || A. Retana, L. Nguyen, R. White, A. Zinin, D. McPherson || aretana@cisco.com, lhnguyen@cisco.com, riw@cisco.com, azinin@nexsi.com, danny@ambernetworks.com +# RFC3138 || D. Meyer || dmm@sprint.net +# RFC3139 || L. Sanchez, K. McCloghrie, J. Saperia || kzm@cisco.com, lsanchez@megisto.com, saperia@jdscons.com +# RFC3140 || D. Black, S. Brim, B. Carpenter, F. Le Faucheur || black_david@emc.com, sbrim@cisco.com, brian@icair.org, flefauch@cisco.com +# RFC3141 || T. Hiller, P. Walsh, X. Chen, M. Munson, G. Dommety, S. Sivalingham, B. Lim, P. McCann, H. Shiino, B. Hirschman, S. Manning, R. Hsu, H. Koo, M. Lipford, P. Calhoun, C. Lo, E. Jaques, E. Campbell, Y.Xu,S.Baba,T.Ayaki,T.Seki,A.Hameed || pcalhoun@eng.sun.com, gdommety@cisco.com, tom.hiller@lucent.com, rhsu@qualcomm.com, mlipfo01@sprintspectrum.com, serge@awardsolutions.com, mccap@lucent.com, mmunson@gte.net, hskoo@sta.samsung.com, walshp@lucent.com, yxu@watercove.com, qa4053@email.mot.com, ejaques@akamail.com, s.sivalingham@ericsson.com, xing.chen@usa.alcatel.com, bklim@lge.com, hshiino@lucent.com, sbaba@tari.toshiba.com, ayaki@ddi.co.jp, Charles.Lo@vodafone-us.com, t-seki@kddi.com +# RFC3142 || J. Hagino, K. Yamamoto || itojun@iijlab.net, kazu@iijlab.net +# RFC3143 || I. Cooper, J. Dilley || icooper@equinix.com, jad@akamai.com +# RFC3144 || D. Romascanu || dromasca@gmail.com +# RFC3145 || R. Verma, M. Verma, J. Carlson || rverma@dc.com, Madhvi_Verma@3com.com, james.d.carlson@sun.com +# RFC3146 || K. Fujisawa, A. Onoe || fujisawa@sm.sony.co.jp, onoe@sm.sony.co.jp +# RFC3147 || P. Christian || christi@nortelnetworks.com +# RFC3148 || M. Mathis, M. Allman || mathis@psc.edu, mallman@bbn.com +# RFC3149 || A. Srinath, G. Levendel, K. Fritz, R. Kalyanaram || Ashok.Srinath@sylantro.com, Gil.Levendel@sylantro.com, Kent.Fritz@sylantro.com, Raghuraman.Kal@wipro.com +# RFC3150 || S. Dawkins, G. Montenegro, M. Kojo, V. Magret || spencer.dawkins@fnc.fujitsu.com, gab@sun.com, kojo@cs.helsinki.fi, vincent.magret@alcatel.com +# RFC3151 || N. Walsh, J. Cowan, P. Grosso || Norman.Walsh@East.Sun.COM, jcowan@reutershealth.com, pgrosso@arbortext.com +# RFC3152 || R. Bush || randy@psg.com +# RFC3153 || R. Pazhyannur, I. Ali, C. Fox || pazhynnr@cig.mot.com, fia225@email.mot.com, fox@cisco.com +# RFC3154 || J. Kempf, C. Castelluccia, P. Mutaf, N. Nakajima, Y. Ohba, R. Ramjee, Y. Saifullah, B. Sarikaya, X. Xu || James.Kempf@Sun.COM, pars.mutaf@inria.fr, claude.castelluccia@inria.fr, nnakajima@tari.toshiba.com, yohba@tari.toshiba.com, ramjee@bell-labs.com, Yousuf.Saifullah@nokia.com, Behcet.Sarikaya@usa.alcatel.com +# RFC3155 || S. Dawkins, G. Montenegro, M. Kojo, V. Magret, N. Vaidya || spencer.dawkins@fnc.fujitsu.com, gab@sun.com, kojo@cs.helsinki.fi, vincent.magret@alcatel.com +# RFC3156 || M. Elkins, D. Del Torto, R. Levien, T. Roessler || +# RFC3157 || A. Arsenault, S. Farrell || aarsenault@dvnet.com, stephen.farrell@baltimore.ie +# RFC3158 || C. Perkins, J. Rosenberg, H. Schulzrinne || csp@isi.edu, jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu +# RFC3159 || K. McCloghrie, M. Fine, J. Seligson, K. Chan, S. Hahn, R. Sahita, A. Smith, F. Reichmeyer || mfine@cisco.com, jseligso@nortelnetworks.com, khchan@nortelnetworks.com, scott.hahn@intel.com, ravi.sahita@intel.com, andrew@allegronetworks.com, franr@pfn.com +# RFC3160 || S. Harris || +# RFC3161 || C. Adams, P. Cain, D. Pinkas, R. Zuccherato || cadams@entrust.com, pcain@bbn.com, Denis.Pinkas@bull.net, robert.zuccherato@entrust.com +# RFC3162 || B. Aboba, G. Zorn, D. Mitton || bernarda@microsoft.com, gwz@cisco.com +# RFC3163 || R. Zuccherato, M. Nystrom || robert.zuccherato@entrust.com, magnus@rsasecurity.com +# RFC3164 || C. Lonvick || clonvick@cisco.com +# RFC3165 || D. Levi, J. Schoenwaelder || +# RFC3166 || D. Meyer, J. Scudder || dmm@sprint.net, jgs@cisco.com +# RFC3167 || D. Meyer, J. Scudder || dmm@sprint.net, jgs@cisco.com +# RFC3168 || K. Ramakrishnan, S. Floyd, D. Black || kk@teraoptic.com, floyd@aciri.org, black_david@emc.com +# RFC3169 || M. Beadles, D. Mitton || dmitton@nortelnetworks.com +# RFC3170 || B. Quinn, K. Almeroth || bquinn@celoxnetworks.com, almeroth@cs.ucsb.edu +# RFC3171 || Z. Albanna, K. Almeroth, D. Meyer, M. Schipper || zaid@juniper.net, almeroth@cs.ucsb.edu, dmm@sprint.net, iana@iana.org +# RFC3172 || G. Huston, Ed. || +# RFC3173 || A. Shacham, B. Monsour, R. Pereira, M. Thomas || shacham@shacham.net, bob@bobmonsour.com, royp@cisco.com, matt@3am-software.com +# RFC3174 || D. Eastlake 3rd, P. Jones || Donald.Eastlake@motorola.com, paulej@packetizer.com +# RFC3175 || F. Baker, C. Iturralde, F. Le Faucheur, B. Davie || fred@cisco.com, cei@cisco.com, flefauch@cisco.com, bdavie@cisco.com +# RFC3176 || P. Phaal, S. Panchen, N. McKee || peter_phaal@INMON.COM, sonia_panchen@INMON.COM, neil_mckee@INMON.COM +# RFC3177 || IAB, IESG || +# RFC3178 || J. Hagino, H. Snyder || itojun@iijlab.net, hal@vailsys.com +# RFC3179 || J. Schoenwaelder, J. Quittek || schoenw@ibr.cs.tu-bs.de, quittek@ccrle.nec.de +# RFC3180 || D. Meyer, P. Lothberg || dmm@sprint.net, roll@sprint.net +# RFC3181 || S. Herzog || herzog@policyconsulting.com +# RFC3182 || S. Yadav, R. Yavatkar, R. Pabbati, P. Ford, T. Moore, S. Herzog, R. Hess || Satyendra.Yadav@intel.com, Raj.Yavatkar@intel.com, rameshpa@microsoft.com, peterf@microsoft.com, timmoore@microsoft.com, herzog@policyconsulting.com, rodney.hess@intel.com +# RFC3183 || T. Dean, W. Ottaway || tbdean@QinetiQ.com, wjottaway@QinetiQ.com +# RFC3184 || S. Harris || srh@merit.edu +# RFC3185 || S. Farrell, S. Turner || stephen.farrell@baltimore.ie, turners@ieca.com +# RFC3186 || S. Shimizu, T. Kawano, K. Murakami, E. Beier || shimizu@ntt-20.ecl.net, kawano@core.ecl.net, murakami@ntt-20.ecl.net, Beier@bina.de +# RFC3187 || J. Hakala, H. Walravens || juha.hakala@helsinki.fi, hartmut.walravens@sbb.spk-berlin.de +# RFC3188 || J. Hakala || juha.hakala@helsinki.fi +# RFC3189 || K. Kobayashi, A. Ogawa, S. Casner, C. Bormann || ikob@koganei.wide.ad.jp, akimichi@sfc.wide.ad.jp, casner@acm.org, cabo@tzi.org +# RFC3190 || K. Kobayashi, A. Ogawa, S. Casner, C. Bormann || ikob@koganei.wide.ad.jp, akimichi@sfc.wide.ad.jp, casner@acm.org, cabo@tzi.org +# RFC3191 || C. Allocchio || +# RFC3192 || C. Allocchio || +# RFC3193 || B. Patel, B. Aboba, W. Dixon, G. Zorn, S. Booth || baiju.v.patel@intel.com, bernarda@microsoft.com, wdixon@microsoft.com, gwz@cisco.com, ebooth@cisco.com +# RFC3194 || A. Durand, C. Huitema || +# RFC3195 || D. New, M. Rose || dnew@san.rr.com, mrose17@gmail.com +# RFC3196 || T. Hastings, C. Manros, P. Zehler, C. Kugler, H. Holst || tom.hastings@alum.mit.edu, Kugler@us.ibm.com, hh@I-data.com, Peter.Zehler@xerox.com +# RFC3197 || R. Austein || sra@hactrn.net +# RFC3198 || A. Westerinen, J. Schnizlein, J. Strassner, M. Scherling, B. Quinn, S. Herzog, A. Huynh, M. Carlson, J. Perry, S. Waldbusser || andreaw@cisco.com, john.schnizlein@cisco.com, john.strassner@intelliden.com, mscherling@xcert.com, bquinn@celoxnetworks.com, jay.perry@netapp.com, herzog@PolicyConsulting.com, mark.carlson@sun.com, waldbusser@nextbeacon.com +# RFC3199 || S. Ginoza || ginoza@isi.edu +# RFC3200 || || +# RFC3201 || R. Steinberger, O. Nicklass || robert.steinberger@fnc.fujitsu.com, Orly_n@rad.co.il +# RFC3202 || R. Steinberger, O. Nicklass || robert.steinberger@fnc.fujitsu.com, Orly_n@rad.co.il +# RFC3203 || Y. T'Joens, C. Hublet, P. De Schrijver || yves.tjoens@alcatel.be, p2@mind.be, Christian.Hublet@alcatel.be +# RFC3204 || E. Zimmerer, J. Peterson, A. Vemuri, L. Ong, F. Audet, M. Watson, M. Zonoun || eric_zimmerer@yahoo.com, Aparna.Vemuri@Qwest.com, jon.peterson@neustar.com, lyndon_ong@yahoo.com, mzonoun@nortelnetworks.com, audet@nortelnetworks.com, mwatson@nortelnetworks.com +# RFC3205 || K. Moore || moore@cs.utk.edu +# RFC3206 || R. Gellens || randy@qualcomm.com +# RFC3207 || P. Hoffman || phoffman@imc.org +# RFC3208 || T. Speakman, J. Crowcroft, J. Gemmell, D. Farinacci, S. Lin, D. Leshchiner, M. Luby, T. Montgomery, L. Rizzo, A. Tweedly, N. Bhaskar, R. Edmonstone, R. Sumanasekera, L. Vicisano || speakman@cisco.com, dino@procket.com, steven@juniper.net, agt@cisco.com, nbhaskar@cisco.com, redmonst@cisco.com, rajitha@cisco.com, lorenzo@cisco.com, j.crowcroft@cs.ucl.ac.uk, jgemmell@microsoft.com, dleshc@tibco.com, luby@digitalfountain.com, todd@talarian.com, luigi@iet.unipi.it +# RFC3209 || D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan, G. Swallow || awduche@movaz.com, lberger@movaz.com, dhg@juniper.net, tli@procket.com, vsriniva@cosinecom.com, swallow@cisco.com +# RFC3210 || D. Awduche, A. Hannan, X. Xiao || awduche@movaz.com, alan@routingloop.com, xxiao@photuris.com +# RFC3211 || P. Gutmann || pgut001@cs.auckland.ac.nz +# RFC3212 || B. Jamoussi, Ed., L. Andersson, R. Callon, R. Dantu, L. Wu, P. Doolan, T. Worster, N. Feldman, A. Fredette, M. Girish, E. Gray, J. Heinanen, T. Kilty, A. Malis || loa.andersson@utfors.se, rcallon@juniper.net, rdantu@netrake.com, pdoolan@acm.org, Nkf@us.ibm.com, afredette@charter.net, eric.gray@sandburst.com, jh@song.fi, tim-kilty@mediaone.net, Andy.Malis@vivacenetworks.com, muckai@atoga.com, fsb@thefsb.org, liwwu@cisco.com +# RFC3213 || J. Ash, M. Girish, E. Gray, B. Jamoussi, G. Wright || gash@att.com, eric.gray@sandburst.com, gwright@nortelnetworks.com, muckai@atoga.com, Jamoussi@nortelnetworks.com +# RFC3214 || J. Ash, Y. Lee, P. Ashwood-Smith, B. Jamoussi, D. Fedyk, D. Skalecki, L. Li || gash@att.com, jamoussi@NortelNetworks.com, petera@NortelNetworks.com, dareks@nortelnetworks.com, ylee@ceterusnetworks.com, lili@ss8networks.com, dwfedyk@nortelnetworks.com +# RFC3215 || C. Boscher, P. Cheval, L. Wu, E. Gray || christophe.boscher@alcatel.fr, pierrick.cheval@space.alcatel.fr, liwwu@cisco.com, eric.gray@sandburst.com +# RFC3216 || C. Elliott, D. Harrington, J. Jason, J. Schoenwaelder, F. Strauss, W. Weiss || chelliot@cisco.com, dbh@enterasys.com, jamie.jason@intel.com, schoenw@ibr.cs.tu-bs.de, strauss@ibr.cs.tu-bs.de, wweiss@ellacoya.com +# RFC3217 || R. Housley || rhousley@rsasecurity.com +# RFC3218 || E. Rescorla || ekr@rtfm.com +# RFC3219 || J. Rosenberg, H. Salama, M. Squire || jdrosen@dynamicsoft.com, hsalama@cisco.com, mattsquire@acm.org +# RFC3220 || C. Perkins, Ed. || charliep@iprg.nokia.com +# RFC3221 || G. Huston || +# RFC3222 || G. Trotter || Guy_Trotter@agilent.com +# RFC3223 || || +# RFC3224 || E. Guttman || erik.guttman@sun.com +# RFC3225 || D. Conrad || david.conrad@nominum.com +# RFC3226 || O. Gudmundsson || ogud@ogud.com +# RFC3227 || D. Brezinski, T. Killalea || dbrezinski@In-Q-Tel.org, tomk@neart.org +# RFC3228 || B. Fenner || fenner@research.att.com +# RFC3229 || J. Mogul, B. Krishnamurthy, F. Douglis, A. Feldmann, Y. Goland, A. van Hoff, D. Hellerstein || +# RFC3230 || J. Mogul, A. Van Hoff || JeffMogul@acm.org, avh@marimba.com +# RFC3231 || D. Levi, J. Schoenwaelder || +# RFC3232 || J. Reynolds, Ed. || rfc-editor@rfc-editor.org +# RFC3233 || P. Hoffman, S. Bradner || +# RFC3234 || B. Carpenter, S. Brim || brian@hursley.ibm.com, sbrim@cisco.com +# RFC3235 || D. Senie || dts@senie.com +# RFC3236 || M. Baker, P. Stark || mbaker@planetfred.com, distobj@acm.org, Peter.Stark@ecs.ericsson.com +# RFC3237 || M. Tuexen, Q. Xie, R. Stewart, M. Shore, L. Ong, J. Loughney, M. Stillman || Michael.Tuexen@icn.siemens.de, qxie1@email.mot.com, randall@lakerest.net, mshore@cisco.com, lyong@ciena.com, john.loughney@nokia.com, maureen.stillman@nokia.com +# RFC3238 || S. Floyd, L. Daigle || iab@iab.org +# RFC3239 || C. Kugler, H. Lewis, T. Hastings || kugler@us.ibm.com, tom.hastings@alum.mit.edu, harryl@us.ibm.com +# RFC3240 || D. Clunie, E. Cordonnier || dclunie@dclunie.com, emmanuel.cordonnier@etiam.com +# RFC3241 || C. Bormann || cabo@tzi.org +# RFC3242 || L-E. Jonsson, G. Pelletier || lars-erik.jonsson@ericsson.com, ghyslain.pelletier@epl.ericsson.se +# RFC3243 || L-E. Jonsson || lars-erik.jonsson@ericsson.com +# RFC3244 || M. Swift, J. Trostle, J. Brezak || mikesw@cs.washington.edu, john3725@world.std.com, jbrezak@microsoft.com +# RFC3245 || J. Klensin, Ed., IAB || iab@iab.org, sob@harvard.edu, paf@cisco.com +# RFC3246 || B. Davie, A. Charny, J.C.R. Bennet, K. Benson, J.Y. Le Boudec, W. Courtney, S. Davari, V. Firoiu, D. Stiliadis || bsd@cisco.com, acharny@cisco.com, jcrb@motorola.com, Kent.Benson@tellabs.com, jean-yves.leboudec@epfl.ch, bill.courtney@trw.com, shahram_davari@pmc-sierra.com, vfiroiu@nortelnetworks.com, stiliadi@bell-labs.com +# RFC3247 || A. Charny, J. Bennet, K. Benson, J. Boudec, A. Chiu, W. Courtney, S. Davari, V. Firoiu, C. Kalmanek, K. Ramakrishnan || acharny@cisco.com, jcrb@motorola.com, Kent.Benson@tellabs.com, jean-yves.leboudec@epfl.ch, angela.chiu@celion.com, bill.courtney@trw.com, shahram_davari@pmc-sierra.com, vfiroiu@nortelnetworks.com, crk@research.att.com, kk@teraoptic.com +# RFC3248 || G. Armitage, B. Carpenter, A. Casati, J. Crowcroft, J. Halpern, B. Kumar, J. Schnizlein || +# RFC3249 || V. Cancio, M. Moldovan, H. Tamura, D. Wing || vcancio@pacbell.net, mmoldovan@g3nova.com, tamura@toda.ricoh.co.jp, dwing-ietf@fuggles.com +# RFC3250 || L. McIntyre, G. Parsons, J. Rafferty || lmcintyre@pahv.xerox.com, gparsons@nortelnetworks.com, jraff@brooktrout.com +# RFC3251 || B. Rajagopalan || braja@tellium.com +# RFC3252 || H. Kennedy || kennedyh@engin.umich.edu +# RFC3253 || G. Clemm, J. Amsden, T. Ellison, C. Kaler, J. Whitehead || geoffrey.clemm@rational.com, jamsden@us.ibm.com, tim_ellison@uk.ibm.com, ckaler@microsoft.com, ejw@cse.ucsc.edu +# RFC3254 || H. Alvestrand || Harald@alvestrand.no +# RFC3255 || N. Jones, C. Murton || nrjones@agere.com, murton@nortelnetworks.com +# RFC3256 || D. Jones, R. Woundy || doug@yas.com, rwoundy@broadband.att.com +# RFC3257 || L. Coene || +# RFC3258 || T. Hardie || Ted.Hardie@nominum.com +# RFC3259 || J. Ott, C. Perkins, D. Kutscher || jo@tzi.uni-bremen.de, csp@isi.edu, dku@tzi.uni-bremen.de +# RFC3260 || D. Grossman || dan@dma.isg.mot.com +# RFC3261 || J. Rosenberg, H. Schulzrinne, G. Camarillo, A. Johnston, J. Peterson, R. Sparks, M. Handley, E. Schooler || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu, Gonzalo.Camarillo@ericsson.com, alan.johnston@wcom.com, jon.peterson@neustar.com, rsparks@dynamicsoft.com, mjh@icir.org, schooler@research.att.com +# RFC3262 || J. Rosenberg, H. Schulzrinne || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu +# RFC3263 || J. Rosenberg, H. Schulzrinne || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu +# RFC3264 || J. Rosenberg, H. Schulzrinne || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu +# RFC3265 || A. B. Roach || adam@dynamicsoft.com +# RFC3266 || S. Olson, G. Camarillo, A. B. Roach || seanol@microsoft.com, Gonzalo.Camarillo@ericsson.com, adam@dynamicsoft.com +# RFC3267 || J. Sjoberg, M. Westerlund, A. Lakaniemi, Q. Xie || Johan.Sjoberg@ericsson.com, Magnus.Westerlund@ericsson.com, ari.lakaniemi@nokia.com, qxie1@email.mot.com +# RFC3268 || P. Chown || pc@skygate.co.uk +# RFC3269 || R. Kermode, L. Vicisano || Roger.Kermode@motorola.com, lorenzo@cisco.com +# RFC3270 || F. Le Faucheur, L. Wu, B. Davie, S. Davari, P. Vaananen, R. Krishnan, P. Cheval, J. Heinanen || flefauch@cisco.com, liwwu@cisco.com, bsd@cisco.com, davari@ieee.org, pasi.vaananen@nokia.com, ram@axiowave.com, pierrick.cheval@space.alcatel.fr, jh@song.fi +# RFC3271 || V. Cerf || vinton.g.cerf@wcom.com +# RFC3272 || D. Awduche, A. Chiu, A. Elwalid, I. Widjaja, X. Xiao || awduche@movaz.com, angela.chiu@celion.com, anwar@lucent.com, iwidjaja@research.bell-labs.com, xipeng@redback.com +# RFC3273 || S. Waldbusser || waldbusser@nextbeacon.com +# RFC3274 || P. Gutmann || pgut001@cs.auckland.ac.nz +# RFC3275 || D. Eastlake 3rd, J. Reagle, D. Solo || Donald.Eastlake@motorola.com, reagle@w3.org, dsolo@alum.mit.edu +# RFC3276 || B. Ray, R. Abbi || rray@pesa.com, Rajesh.Abbi@alcatel.com +# RFC3277 || D. McPherson || danny@tcb.net +# RFC3278 || S. Blake-Wilson, D. Brown, P. Lambert || sblakewi@certicom.com, dbrown@certicom.com, plambert@sprintmail.com +# RFC3279 || L. Bassham, W. Polk, R. Housley || tim.polk@nist.gov, rhousley@rsasecurity.com, lbassham@nist.gov +# RFC3280 || R. Housley, W. Polk, W. Ford, D. Solo || rhousley@rsasecurity.com, wford@verisign.com, wpolk@nist.gov, dsolo@alum.mit.edu +# RFC3281 || S. Farrell, R. Housley || stephen.farrell@baltimore.ie, rhousley@rsasecurity.com +# RFC3282 || H. Alvestrand || Harald@Alvestrand.no +# RFC3283 || B. Mahoney, G. Babics, A. Taler || bobmah@mit.edu, georgeb@steltor.com, alex@0--0.org +# RFC3284 || D. Korn, J. MacDonald, J. Mogul, K. Vo || kpv@research.att.com, dgk@research.att.com, JeffMogul@acm.org, jmacd@cs.berkeley.edu +# RFC3285 || M. Gahrns, T. Hain || mikega@microsoft.com, ahain@cisco.com +# RFC3286 || L. Ong, J. Yoakum || lyong@ciena.com, yoakum@nortelnetworks.com +# RFC3287 || A. Bierman || andy@yumaworks.com +# RFC3288 || E. O'Tuathail, M. Rose || eamon.otuathail@clipcode.com, mrose17@gmail.com +# RFC3289 || F. Baker, K. Chan, A. Smith || fred@cisco.com, khchan@nortelnetworks.com, ah_smith@acm.org +# RFC3290 || Y. Bernet, S. Blake, D. Grossman, A. Smith || ybernet@msn.com, steven.blake@ericsson.com, dan@dma.isg.mot.com, ah_smith@acm.org +# RFC3291 || M. Daniele, B. Haberman, S. Routhier, J. Schoenwaelder || md@world.std.com, bkhabs@nc.rr.com, sar@epilogue.com, schoenw@ibr.cs.tu-bs.de +# RFC3292 || A. Doria, F. Hellstrand, K. Sundell, T. Worster || avri@acm.org, fiffi@nortelnetworks.com, ksundell@nortelnetworks.com, fsb@thefsb.org +# RFC3293 || T. Worster, A. Doria, J. Buerkle || fsb@thefsb.org, avri@acm.com, Joachim.Buerkle@nortelnetworks.com +# RFC3294 || A. Doria, K. Sundell || avri@acm.org, sundell@nortelnetworks.com +# RFC3295 || H. Sjostrand, J. Buerkle, B. Srinivasan || hans@ipunplugged.com, joachim.buerkle@nortelnetworks.com, balaji@cplane.com +# RFC3296 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3297 || G. Klyne, R. Iwazaki, D. Crocker || GK@ACM.ORG, iwa@rdl.toshibatec.co.jp, dcrocker@brandenburg.com +# RFC3298 || I. Faynberg, J. Gato, H. Lu, L. Slutsman || lslutsman@att.com, faynberg@lucent.com, jgato@airtel.es, huilanlu@lucent.com +# RFC3299 || S. Ginoza || ginoza@isi.edu +# RFC3300 || J. Reynolds, R. Braden, S. Ginoza, A. De La Cruz || +# RFC3301 || Y. T'Joens, P. Crivellari, B. Sales || paolo.crivellari@belgacom.be +# RFC3302 || G. Parsons, J. Rafferty || gparsons@nortelnetworks.com, jraff@brooktrout.com +# RFC3303 || P. Srisuresh, J. Kuthan, J. Rosenberg, A. Molitor, A. Rayhan || srisuresh@yahoo.com, kuthan@fokus.fhg.de, jdrosen@dynamicsoft.com, amolitor@visi.com, rayhan@ee.ryerson.ca +# RFC3304 || R. P. Swale, P. A. Mart, P. Sijben, S. Brim, M. Shore || richard.swale@bt.com, paul.sijben@picopoint.com, philip.mart@marconi.com, sbrim@cisco.com, mshore@cisco.com +# RFC3305 || M. Mealling, Ed., R. Denenberg, Ed. || michael@verisignlabs.com, rden@loc.gov +# RFC3306 || B. Haberman, D. Thaler || bkhabs@nc.rr.com, dthaler@microsoft.com +# RFC3307 || B. Haberman || bkhabs@nc.rr.com +# RFC3308 || P. Calhoun, W. Luo, D. McPherson, K. Peirce || pcalhoun@bstormnetworks.com, luo@cisco.com, danny@tcb.net, Ken@malibunetworks.com +# RFC3309 || J. Stone, R. Stewart, D. Otis || jonathan@dsg.stanford.edu, randall@lakerest.net, dotis@sanlight.net +# RFC3310 || A. Niemi, J. Arkko, V. Torvinen || aki.niemi@nokia.com, jari.arkko@ericsson.com, vesa.torvinen@ericsson.fi +# RFC3311 || J. Rosenberg || jdrosen@dynamicsoft.com +# RFC3312 || G. Camarillo, Ed., W. Marshall, Ed., J. Rosenberg || Gonzalo.Camarillo@ericsson.com, wtm@research.att.com, jdrosen@dynamicsoft.com +# RFC3313 || W. Marshall, Ed. || +# RFC3314 || M. Wasserman, Ed. || +# RFC3315 || R. Droms, Ed., J. Bound, B. Volz, T. Lemon, C. Perkins, M. Carney || Jim.Bound@hp.com, volz@metrocast.net, Ted.Lemon@nominum.com, charles.perkins@nokia.com, michael.carney@sun.com +# RFC3316 || J. Arkko, G. Kuijpers, H. Soliman, J. Loughney, J. Wiljakka || jari.arkko@ericsson.com, gerben.a.kuijpers@ted.ericsson.se, john.loughney@nokia.com, hesham.soliman@era.ericsson.se, juha.wiljakka@nokia.com +# RFC3317 || K. Chan, R. Sahita, S. Hahn, K. McCloghrie || khchan@nortelnetworks.com, ravi.sahita@intel.com, scott.hahn@intel.com, kzm@cisco.com +# RFC3318 || R. Sahita, Ed., S. Hahn, K. Chan, K. McCloghrie || ravi.sahita@intel.com, scott.hahn@intel.com, khchan@nortelnetworks.com, kzm@cisco.com +# RFC3319 || H. Schulzrinne, B. Volz || schulzrinne@cs.columbia.edu, volz@metrocast.net +# RFC3320 || R. Price, C. Bormann, J. Christoffersson, H. Hannu, Z. Liu, J. Rosenberg || richard.price@roke.co.uk, cabo@tzi.org, jan.christoffersson@epl.ericsson.se, hans.hannu@epl.ericsson.se, zhigang.c.liu@nokia.com, jdrosen@dynamicsoft.com +# RFC3321 || H. Hannu, J. Christoffersson, S. Forsgren, K.-C. Leung, Z. Liu, R. Price || hans.hannu@epl.ericsson.se, jan.christoffersson@epl.ericsson.se, StefanForsgren@alvishagglunds.se, kcleung@cs.ttu.edu, zhigang.c.liu@nokia.com, richard.price@roke.co.uk +# RFC3322 || H. Hannu || hans.hannu@epl.ericsson.se +# RFC3323 || J. Peterson || jon.peterson@neustar.biz +# RFC3324 || M. Watson || mwatson@nortelnetworks.com +# RFC3325 || C. Jennings, J. Peterson, M. Watson || fluffy@cisco.com, Jon.Peterson@NeuStar.biz, mwatson@nortelnetworks.com +# RFC3326 || H. Schulzrinne, D. Oran, G. Camarillo || schulzrinne@cs.columbia.edu, oran@cisco.com, Gonzalo.Camarillo@ericsson.com +# RFC3327 || D. Willis, B. Hoeneisen || dean.willis@softarmor.com, hoeneisen@switch.ch +# RFC3328 || || +# RFC3329 || J. Arkko, V. Torvinen, G. Camarillo, A. Niemi, T. Haukka || jari.arkko@ericsson.com, vesa.torvinen@ericsson.fi, Gonzalo.Camarillo@ericsson.com, aki.niemi@nokia.com, tao.haukka@nokia.com +# RFC3330 || IANA || iana@iana.org +# RFC3331 || K. Morneault, R. Dantu, G. Sidebottom, B. Bidulock, J. Heitz || kmorneau@cisco.com, rdantu@netrake.com, greg@signatustechnologies.com, bidulock@openss7.org, jheitz@lucent.com +# RFC3332 || G. Sidebottom, Ed., K. Morneault, Ed., J. Pastor-Balbas, Ed. || +# RFC3334 || T. Zseby, S. Zander, C. Carle || zseby@fokus.fhg.de, zander@fokus.fhg.de, carle@fokus.fhg.de +# RFC3335 || T. Harding, R. Drummond, C. Shih || tharding@cyclonecommerce.com, chuck.shih@gartner.com, rik@drummondgroup.com +# RFC3336 || B. Thompson, T. Koren, B. Buffam || brucet@cisco.com, tmima@cisco.com, bruce@seawaynetworks.com +# RFC3337 || B. Thompson, T. Koren, B. Buffam || brucet@cisco.com, bruce@seawaynetworks.com, tmima@cisco.com +# RFC3338 || S. Lee, M-K. Shin, Y-J. Kim, E. Nordmark, A. Durand || syl@pec.etri.re.kr, mkshin@pec.etri.re.kr, yjkim@pec.etri.re.kr, Alain.Durand@sun.com, erik.nordmark@sun.com +# RFC3339 || G. Klyne, C. Newman || chris.newman@sun.com, GK@ACM.ORG +# RFC3340 || M. Rose, G. Klyne, D. Crocker || mrose17@gmail.com, Graham.Klyne@MIMEsweeper.com, dcrocker@brandenburg.com +# RFC3341 || M. Rose, G. Klyne, D. Crocker || mrose17@gmail.com, Graham.Klyne@MIMEsweeper.com, dcrocker@brandenburg.com +# RFC3342 || E. Dixon, H. Franklin, J. Kint, G. Klyne, D. New, S. Pead, M. Rose, M. Schwartz || Graham.Klyne@MIMEsweeper.com, mrose17@gmail.com, schwartz@CodeOnTheRoad.com, edixon@myrealbox.com, huston@franklin.ro, d20@icosahedron.org, dnew@san.rr.com, spead@fiber.net +# RFC3343 || M. Rose, G. Klyne, D. Crocker || mrose17@gmail.com, gk@ninebynine.org, dcrocker@brandenburg.com +# RFC3344 || C. Perkins, Ed. || Basavaraj.Patil@nokia.com, PRoberts@MEGISTO.com, charliep@iprg.nokia.com +# RFC3345 || D. McPherson, V. Gill, D. Walton, A. Retana || danny@tcb.net, vijay@umbc.edu, dwalton@cisco.com, aretana@cisco.com +# RFC3346 || J. Boyle, V. Gill, A. Hannan, D. Cooper, D. Awduche, B. Christian, W.S. Lai || jboyle@pdnets.com, vijay@umbc.edu, alan@routingloop.com, dcooper@gblx.net, awduche@movaz.com, blaine@uu.net, wlai@att.com +# RFC3347 || M. Krueger, R. Haagens || marjorie_krueger@hp.com, Randy_Haagens@hp.com, csapuntz@stanford.edu, mbakke@cisco.com +# RFC3348 || M. Gahrns, R. Cheng || mikega@microsoft.com, raych@microsoft.com +# RFC3349 || M. Rose || mrose17@gmail.com +# RFC3351 || N. Charlton, M. Gasson, G. Gybels, M. Spanner, A. van Wijk || nathan@millpark.com, michael.gasson@korusolutions.com, Guido.Gybels@rnid.org.uk, mike.spanner@rnid.org.uk, Arnoud.van.Wijk@eln.ericsson.se +# RFC3352 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3353 || D. Ooms, B. Sales, W. Livens, A. Acharya, F. Griffoul, F. Ansari || Dirk.Ooms@alcatel.be, Bernard.Sales@alcatel.be, WLivens@colt-telecom.be, arup@us.ibm.com, griffoul@ulticom.com, furquan@dnrc.bell-labs.com +# RFC3354 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC3355 || A. Singh, R. Turner, R. Tio, S. Nanji || rturner@eng.paradyne.com, tor@redback.com, asingh1@motorola.com, suhail@redback.com +# RFC3356 || G. Fishman, S. Bradner || +# RFC3357 || R. Koodli, R. Ravikanth || rajeev.koodli@nokia.com, rravikanth@axiowave.com +# RFC3358 || T. Przygienda || prz@xebeo.com +# RFC3359 || T. Przygienda || +# RFC3360 || S. Floyd || floyd@icir.org +# RFC3361 || H. Schulzrinne || schulzrinne@cs.columbia.edu +# RFC3362 || G. Parsons || gparsons@nortelnetworks.com +# RFC3363 || R. Bush, A. Durand, B. Fink, O. Gudmundsson, T. Hain || +# RFC3364 || R. Austein || sra@hactrn.net +# RFC3365 || J. Schiller || jis@mit.edu +# RFC3366 || G. Fairhurst, L. Wood || gorry@erg.abdn.ac.uk, lwood@cisco.com +# RFC3367 || N. Popp, M. Mealling, M. Moseley || npopp@verisign.com, michael@verisignlabs.com, marshall@netword.com +# RFC3368 || M. Mealling || michael@verisignlabs.com +# RFC3369 || R. Housley || rhousley@rsasecurity.com +# RFC3370 || R. Housley || rhousley@rsasecurity.com +# RFC3371 || E. Caves, P. Calhoun, R. Wheeler || evan@occamnetworks.com, pcalhoun@bstormnetworks.com +# RFC3372 || A. Vemuri, J. Peterson || Aparna.Vemuri@Qwest.com, jon.peterson@neustar.biz +# RFC3373 || D. Katz, R. Saluja || dkatz@juniper.net, rajesh.saluja@tenetindia.com +# RFC3374 || J. Kempf, Ed. || henrik@levkowetz.com, pcalhoun@bstormnetworks.com, kempf@docomolabs-usa.com, gkenward@nortelnetworks.com, hmsyed@nortelnetworks.com, jmanner@cs.helsinki.fi, madjid.nakhjiri@motorola.com, govind.krishnamurthi@nokia.com, rajeev.koodli@nokia.com, kulwinder.atwal@zucotto.com, mat@cisco.com, mat.horan@comdev.cc, phil_neumiller@3com.com +# RFC3375 || S. Hollenbeck || +# RFC3376 || B. Cain, S. Deering, I. Kouvelas, B. Fenner, A. Thyagarajan || deering@cisco.com, fenner@research.att.com, kouvelas@cisco.com +# RFC3377 || J. Hodges, R. Morgan || Jeff.Hodges@sun.com, rlmorgan@washington.edu +# RFC3378 || R. Housley, S. Hollenbeck || rhousley@rsasecurity.com, shollenbeck@verisign.com +# RFC3379 || D. Pinkas, R. Housley || Denis.Pinkas@bull.net, rhousley@rsasecurity.com +# RFC3380 || T. Hastings, R. Herriot, C. Kugler, H. Lewis || kugler@us.ibm.com, tom.hastings@alum.mit.edu, bob@Herriot.com, harryl@us.ibm.com +# RFC3381 || T. Hastings, H. Lewis, R. Bergman || tom.hastings@alum.mit.edu, harryl@us.ibm.com, rbergma@hitachi-hkis.com +# RFC3382 || R. deBry, T. Hastings, R. Herriot, K. Ocke, P. Zehler || debryro@uvsc.edu, tom.hastings@alum.mit.edu, bob@herriot.com, KOcke@crt.xerox.com, Peter.Zehler@xerox.com +# RFC3383 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3384 || E. Stokes, R. Weiser, R. Moats, R. Huber || rweiser@trustdst.com, stokese@us.ibm.com, rmoats@lemurnetworks.net, rvh@att.com +# RFC3385 || D. Sheinwald, J. Satran, P. Thaler, V. Cavanna || julian_satran@il.ibm.com, Dafna_Sheinwald@il.ibm.com, pat_thaler@agilent.com, vince_cavanna@agilent.com +# RFC3386 || W. Lai, Ed., D. McDysan, Ed. || +# RFC3387 || M. Eder, H. Chaskar, S. Nag || Michael.eder@nokia.com, thinker@monmouth.com, hemant.chaskar@nokia.com +# RFC3388 || G. Camarillo, G. Eriksson, J. Holler, H. Schulzrinne || Gonzalo.Camarillo@ericsson.com, Jan.Holler@era.ericsson.se, Goran.AP.Eriksson@era.ericsson.se, schulzrinne@cs.columbia.edu +# RFC3389 || R. Zopf || zopf@lucent.com +# RFC3390 || M. Allman, S. Floyd, C. Partridge || mallman@bbn.com, floyd@icir.org, craig@bbn.com +# RFC3391 || R. Herriot || bob@herriot.com +# RFC3392 || R. Chandra, J. Scudder || rchandra@redback.com, jgs@cisco.com +# RFC3393 || C. Demichelis, P. Chimento || carlo.demichelis@tilab.com, chimento@torrentnet.com +# RFC3394 || J. Schaad, R. Housley || jimsch@exmsft.com, rhousley@rsasecurity.com +# RFC3395 || A. Bierman, C. Bucci, R. Dietz, A. Warth || andy@yumaworks.com, cbucci@cisco.com, rdietz@hifn.com, dahoss@earthlink.net +# RFC3396 || T. Lemon, S. Cheshire || mellon@nominum.com, rfc@stuartcheshire.org +# RFC3397 || B. Aboba, S. Cheshire || bernarda@microsoft.com, rfc@stuartcheshire.org +# RFC3398 || G. Camarillo, A. B. Roach, J. Peterson, L. Ong || Gonzalo.Camarillo@Ericsson.com, adam@dynamicsoft.com, jon.peterson@neustar.biz, lyOng@ciena.com +# RFC3400 || || +# RFC3401 || M. Mealling || michael@neonym.net +# RFC3402 || M. Mealling || michael@neonym.net +# RFC3403 || M. Mealling || michael@neonym.net +# RFC3404 || M. Mealling || michael@neonym.net +# RFC3405 || M. Mealling || michael@neonym.net +# RFC3406 || L. Daigle, D. van Gulik, R. Iannella, P. Faltstrom || leslie@thinkingcat.com, renato@iprsystems.com, paf@cisco.com +# RFC3407 || F. Andreasen || fandreas@cisco.com +# RFC3408 || Z. Liu, K. Le || khiem.le@nokia.com +# RFC3409 || K. Svanbro || krister.svanbro@ericsson.com +# RFC3410 || J. Case, R. Mundy, D. Partain, B. Stewart || +# RFC3411 || D. Harrington, R. Presuhn, B. Wijnen || +# RFC3412 || J. Case, D. Harrington, R. Presuhn, B. Wijnen || +# RFC3413 || D. Levi, P. Meyer, B. Stewart || +# RFC3414 || U. Blumenthal, B. Wijnen || +# RFC3415 || B. Wijnen, R. Presuhn, K. McCloghrie || +# RFC3416 || R. Presuhn, Ed. || +# RFC3417 || R. Presuhn, Ed. || +# RFC3418 || R. Presuhn, Ed. || +# RFC3419 || M. Daniele, J. Schoenwaelder || md@world.std.com, schoenw@ibr.cs.tu-bs.de +# RFC3420 || R. Sparks || rsparks@dynamicsoft.com +# RFC3421 || W. Zhao, H. Schulzrinne, E. Guttman, C. Bisdikian, W. Jerome || zwb@cs.columbia.edu, hgs@cs.columbia.edu, Erik.Guttman@sun.com, bisdik@us.ibm.com, wfj@us.ibm.com +# RFC3422 || O. Okamoto, M. Maruyama, T. Sajima || okamoto.osamu@lab.ntt.co.jp, mitsuru@core.ecl.net, tjs@sun.com +# RFC3423 || K. Zhang, E. Elkin || kevinzhang@ieee.org, eitan@xacct.com +# RFC3424 || L. Daigle, Ed., IAB || iab@iab.org +# RFC3425 || D. Lawrence || tale@nominum.com +# RFC3426 || S. Floyd || iab@iab.org +# RFC3427 || A. Mankin, S. Bradner, R. Mahy, D. Willis, J. Ott, B. Rosen || mankin@psg.com, sob@harvard.edu, rohan@cisco.com, dean.willis@softarmor.com, brian.rosen@marconi.com, jo@ipdialog.com +# RFC3428 || B. Campbell, Ed., J. Rosenberg, H. Schulzrinne, C. Huitema, D. Gurle || bcampbell@dynamicsoft.com, jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu, huitema@microsoft.com, dgurle@microsoft.com +# RFC3429 || H. Ohta || ohta.hiroshi@lab.ntt.co.jp +# RFC3430 || J. Schoenwaelder || schoenw@ibr.cs.tu-bs.de +# RFC3431 || W. Segmuller || whs@watson.ibm.com +# RFC3432 || V. Raisanen, G. Grotefeld, A. Morton || Vilho.Raisanen@nokia.com, g.grotefeld@motorola.com, acmorton@att.com +# RFC3433 || A. Bierman, D. Romascanu, K.C. Norseth || andy@yumaworks.com, dromasca@gmail.com , kenyon.c.norseth@L-3com.com +# RFC3434 || A. Bierman, K. McCloghrie || andy@yumaworks.com, kzm@cisco.com +# RFC3435 || F. Andreasen, B. Foster || fandreas@cisco.com, bfoster@cisco.com +# RFC3436 || A. Jungmaier, E. Rescorla, M. Tuexen || ajung@exp-math.uni-essen.de, ekr@rtfm.com, Michael.Tuexen@siemens.com +# RFC3437 || W. Palter, W. Townsley || mark@townsley.net, palter.ietf@zev.net +# RFC3438 || W. Townsley || mark@townsley.net +# RFC3439 || R. Bush, D. Meyer || randy@psg.com, dmm@maoz.com +# RFC3440 || F. Ly, G. Bathrick || faye@pedestalnetworks.com, greg.bathrick@nokia.com +# RFC3441 || R. Kumar || rkumar@cisco.com +# RFC3442 || T. Lemon, S. Cheshire, B. Volz || Ted.Lemon@nominum.com, rfc@stuartcheshire.org, bernie.volz@ericsson.com +# RFC3443 || P. Agarwal, B. Akyol || puneet@acm.org, bora@cisco.com +# RFC3444 || A. Pras, J. Schoenwaelder || pras@ctit.utwente.nl, schoenw@informatik.uni-osnabrueck.de +# RFC3445 || D. Massey, S. Rose || masseyd@isi.edu, scott.rose@nist.gov +# RFC3446 || D. Kim, D. Meyer, H. Kilmer, D. Farinacci || dorian@blackrose.org, hank@rem.com, dino@procket.com, dmm@maoz.com +# RFC3447 || J. Jonsson, B. Kaliski || jonsson@mathematik.uni-marburg.de, bkaliski@rsasecurity.com +# RFC3448 || M. Handley, S. Floyd, J. Padhye, J. Widmer || mjh@icir.org, floyd@icir.org, padhye@microsoft.com, widmer@informatik.uni-mannheim.de +# RFC3449 || H. Balakrishnan, V. Padmanabhan, G. Fairhurst, M. Sooriyabandara || hari@lcs.mit.edu, padmanab@microsoft.com, gorry@erg.abdn.ac.uk, mahesh@erg.abdn.ac.uk +# RFC3450 || M. Luby, J. Gemmell, L. Vicisano, L. Rizzo, J. Crowcroft || luby@digitalfountain.com, jgemmell@microsoft.com, lorenzo@cisco.com, luigi@iet.unipi.it, Jon.Crowcroft@cl.cam.ac.uk +# RFC3451 || M. Luby, J. Gemmell, L. Vicisano, L. Rizzo, M. Handley, J. Crowcroft || luby@digitalfountain.com, jgemmell@microsoft.com, lorenzo@cisco.com, luigi@iet.unipi.it, mjh@icir.org, Jon.Crowcroft@cl.cam.ac.uk +# RFC3452 || M. Luby, L. Vicisano, J. Gemmell, L. Rizzo, M. Handley, J. Crowcroft || luby@digitalfountain.com, lorenzo@cisco.com, jgemmell@microsoft.com, luigi@iet.unipi.it, mjh@icir.org, Jon.Crowcroft@cl.cam.ac.uk +# RFC3453 || M. Luby, L. Vicisano, J. Gemmell, L. Rizzo, M. Handley, J. Crowcroft || luby@digitalfountain.com, lorenzo@cisco.com, jgemmell@microsoft.com, luigi@iet.unipi.it, mjh@icir.org, Jon.Crowcroft@cl.cam.ac.uk +# RFC3454 || P. Hoffman, M. Blanchet || paul.hoffman@imc.org, Marc.Blanchet@viagenie.qc.ca +# RFC3455 || M. Garcia-Martin, E. Henrikson, D. Mills || miguel.a.garcia@ericsson.com, ehenrikson@lucent.com, duncan.mills@vf.vodafone.co.uk +# RFC3456 || B. Patel, B. Aboba, S. Kelly, V. Gupta || baiju.v.patel@intel.com, bernarda@microsoft.com, scott@hyperthought.com, vipul.gupta@sun.com +# RFC3457 || S. Kelly, S. Ramamoorthi || +# RFC3458 || E. Burger, E. Candell, C. Eliot, G. Klyne || e.burger@ieee.org, emily.candell@comverse.com, GK-IETF@ninebynine.org, charle@Microsoft.com +# RFC3459 || E. Burger || e.burger@ieee.org +# RFC3460 || B. Moore, Ed. || remoore@us.ibm.com +# RFC3461 || K. Moore || moore@cs.utk.edu +# RFC3462 || G. Vaudreuil || GregV@ieee.org +# RFC3463 || G. Vaudreuil || GregV@ieee.org +# RFC3464 || K. Moore, G. Vaudreuil || moore@cs.utk.edu, GregV@ieee.org +# RFC3465 || M. Allman || mallman@bbn.com +# RFC3466 || M. Day, B. Cain, G. Tomlinson, P. Rzewski || mday@alum.mit.edu, bcain@storigen.com, gary@tomlinsongroup.net, philrz@yahoo.com +# RFC3467 || J. Klensin || +# RFC3468 || L. Andersson, G. Swallow || loa@pi.se, swallow@cisco.com +# RFC3469 || V. Sharma, Ed., F. Hellstrand, Ed. || +# RFC3470 || S. Hollenbeck, M. Rose, L. Masinter || shollenbeck@verisign.com, mrose17@gmail.com, LMM@acm.org +# RFC3471 || L. Berger, Ed. || lberger@movaz.com +# RFC3472 || P. Ashwood-Smith, Ed., L. Berger, Ed. || petera@nortelnetworks.com, lberger@movaz.com +# RFC3473 || L. Berger, Ed. || lberger@movaz.com +# RFC3474 || Z. Lin, D. Pendarakis || zhiwlin@nyct.com, dpendarakis@tellium.com +# RFC3475 || O. Aboul-Magd || osama@nortelnetworks.com +# RFC3476 || B. Rajagopalan || braja@tellium.com +# RFC3477 || K. Kompella, Y. Rekhter || kireeti@juniper.net, yakov@juniper.net +# RFC3478 || M. Leelanivas, Y. Rekhter, R. Aggarwal || manoj@juniper.net, yakov@juniper.net, rahul@redback.com +# RFC3479 || A. Farrel, Ed. || afarrel@movaz.com, pjb@dataconnection.com, pmatthews@hyperchip.com, ewgray@GraIyMage.com, jack.shaio@vivacenetworks.com, tob@laurelnetworks.com, andy.malis@vivacenetworks.com +# RFC3480 || K. Kompella, Y. Rekhter, A. Kullberg || kireeti@juniper.net, yakov@juniper.net, akullber@netplane.com +# RFC3481 || H. Inamura, Ed., G. Montenegro, Ed., R. Ludwig, A. Gurtov, F. Khafizov || inamura@mml.yrp.nttdocomo.co.jp, gab@sun.com, Reiner.Ludwig@Ericsson.com, andrei.gurtov@sonera.com, faridk@nortelnetworks.com +# RFC3482 || M. Foster, T. McGarry, J. Yu || mark.foster@neustar.biz, tom.mcgarry@neustar.biz, james.yu@neustar.biz +# RFC3483 || D. Rawlins, A. Kulkarni, M. Bokaemper, K. Chan || Diana.Rawlins@wcom.com, amol.kulkarni@intel.com, khchan@nortelnetworks.com, mbokaemper@juniper.net +# RFC3484 || R. Draves || richdr@microsoft.com +# RFC3485 || M. Garcia-Martin, C. Bormann, J. Ott, R. Price, A. B. Roach || miguel.a.garcia@ericsson.com, cabo@tzi.org, jo@tzi.org, richard.price@roke.co.uk, adam@dynamicsoft.com +# RFC3486 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC3487 || H. Schulzrinne || schulzrinne@cs.columbia.edu +# RFC3488 || I. Wu, T. Eckert || iwu@cisco.com +# RFC3489 || J. Rosenberg, J. Weinberger, C. Huitema, R. Mahy || jdrosen@dynamicsoft.com, jweinberger@dynamicsoft.com, huitema@microsoft.com, rohan@cisco.com +# RFC3490 || P. Faltstrom, P. Hoffman, A. Costello || paf@cisco.com, phoffman@imc.org +# RFC3491 || P. Hoffman, M. Blanchet || paul.hoffman@imc.org, Marc.Blanchet@viagenie.qc.ca +# RFC3492 || A. Costello || +# RFC3493 || R. Gilligan, S. Thomson, J. Bound, J. McCann, W. Stevens || gilligan@intransa.com, sethomso@cisco.com, Jim.Bound@hp.com, Jack.McCann@hp.com +# RFC3494 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3495 || B. Beser, P. Duffy, Ed. || burcak@juniper.net, paduffy@cisco.com +# RFC3496 || A. G. Malis, T. Hsiao || Andy.Malis@vivacenetworks.com, Tony.Hsiao@VivaceNetworks.com +# RFC3497 || L. Gharai, C. Perkins, G. Goncher, A. Mankin || ladan@isi.edu, csp@csperkins.org, mankin@psg.com, Gary.Goncher@tek.com +# RFC3498 || J. Kuhfeld, J. Johnson, M. Thatcher || +# RFC3499 || S. Ginoza || ginoza@isi.edu +# RFC3500 || || +# RFC3501 || M. Crispin || MRC@CAC.Washington.EDU +# RFC3502 || M. Crispin || MRC@CAC.Washington.EDU +# RFC3503 || A. Melnikov || mel@messagingdirect.com +# RFC3504 || D. Eastlake || Donald.Eastlake@motorola.com +# RFC3505 || D. Eastlake || Donald.Eastlake@motorola.com +# RFC3506 || K. Fujimura, D. Eastlake || fujimura@isl.ntt.co.jp, Donald.Eastlake@motorola.com +# RFC3507 || J. Elson, A. Cerpa || jelson@cs.ucla.edu, cerpa@cs.ucla.edu +# RFC3508 || O. Levin || orit@radvision.com +# RFC3509 || A. Zinin, A. Lindem, D. Yeung || zinin@psg.com, myeung@procket.com, acee@redback.com +# RFC3510 || R. Herriot, I. McDonald || bob@herriot.com, imcdonald@sharplabs.com +# RFC3511 || B. Hickman, D. Newman, S. Tadjudin, T. Martin || brooks.hickman@spirentcom.com, dnewman@networktest.com, Saldju.Tadjudin@spirentcom.com, tmartin@gvnw.com +# RFC3512 || M. MacFaden, D. Partain, J. Saperia, W. Tackabury || +# RFC3513 || R. Hinden, S. Deering || bob.hinden@gmail.com, deering@cisco.com +# RFC3514 || S. Bellovin || bellovin@acm.org +# RFC3515 || R. Sparks || rsparks@dynamicsoft.com +# RFC3516 || L. Nerenberg || lyndon@orthanc.ab.ca +# RFC3517 || E. Blanton, M. Allman, K. Fall, L. Wang || eblanton@cs.purdue.edu, mallman@bbn.com, kfall@intel-research.net, lwang0@uky.edu +# RFC3518 || M. Higashiyama, F. Baker, T. Liao || Mitsuru.Higashiyama@yy.anritsu.co.jp, fred@cisco.com, tawei@cisco.com +# RFC3519 || H. Levkowetz, S. Vaarala || henrik@levkowetz.com, sami.vaarala@iki.fi +# RFC3520 || L-N. Hamer, B. Gage, B. Kosinski, H. Shieh || nhamer@nortelnetworks.com, brettk@invidi.com, gageb@nortelnetworks.com, hugh.shieh@attws.com +# RFC3521 || L-N. Hamer, B. Gage, H. Shieh || nhamer@nortelnetworks.com, gageb@nortelnetworks.com, hugh.shieh@attws.com +# RFC3522 || R. Ludwig, M. Meyer || Reiner.Ludwig@eed.ericsson.se, Michael.Meyer@eed.ericsson.se +# RFC3523 || J. Polk || jmpolk@cisco.com +# RFC3524 || G. Camarillo, A. Monrad || Gonzalo.Camarillo@ericsson.com, atle.monrad@ericsson.com +# RFC3525 || C. Groves, Ed., M. Pantaleo, Ed., T. Anderson, Ed., T. Taylor, Ed. || tlatla@verizon.net, Christian.Groves@ericsson.com.au, Marcello.Pantaleo@eed.ericsson.se, tom.taylor.stds@gmail.com +# RFC3526 || T. Kivinen, M. Kojo || kivinen@ssh.fi, mika.kojo@helsinki.fi +# RFC3527 || K. Kinnear, M. Stapp, R. Johnson, J. Kumarasamy || kkinnear@cisco.com, mjs@cisco.com, jayk@cisco.com, raj@cisco.com +# RFC3528 || W. Zhao, H. Schulzrinne, E. Guttman || zwb@cs.columbia.edu, hgs@cs.columbia.edu, Erik.Guttman@sun.com +# RFC3529 || W. Harold || wharold@us.ibm.com +# RFC3530 || S. Shepler, B. Callaghan, D. Robinson, R. Thurlow, C. Beame, M. Eisler, D. Noveck || beame@bws.com, brent.callaghan@sun.com, mike@eisler.com, dnoveck@netapp.com, david.robinson@sun.com, robert.thurlow@sun.com +# RFC3531 || M. Blanchet || Marc.Blanchet@viagenie.qc.ca +# RFC3532 || T. Anderson, J. Buerkle || todd.a.anderson@intel.com, joachim.buerkle@nortelnetworks.com +# RFC3533 || S. Pfeiffer || Silvia.Pfeiffer@csiro.au +# RFC3534 || L. Walleij || triad@df.lth.se +# RFC3535 || J. Schoenwaelder || j.schoenwaelder@iu-bremen.de +# RFC3536 || P. Hoffman || paul.hoffman@imc.org +# RFC3537 || J. Schaad, R. Housley || jimsch@exmsft.com, housley@vigilsec.com +# RFC3538 || Y. Kawatsura || kawatura@bisd.hitachi.co.jp +# RFC3539 || B. Aboba, J. Wood || bernarda@microsoft.com, jonwood@speakeasy.net +# RFC3540 || N. Spring, D. Wetherall, D. Ely || nspring@cs.washington.edu, djw@cs.washington.edu, ely@cs.washington.edu +# RFC3541 || A. Walsh || aaron@mantiscorp.com +# RFC3542 || W. Stevens, M. Thomas, E. Nordmark, T. Jinmei || matt@3am-software.com, Erik.Nordmark@sun.com, jinmei@isl.rdc.toshiba.co.jp +# RFC3543 || S. Glass, M. Chandra || steven.glass@sun.com, mchandra@cisco.com +# RFC3544 || T. Koren, S. Casner, C. Bormann || tmima@cisco.com, casner@packetdesign.com, cabo@tzi.org +# RFC3545 || T. Koren, S. Casner, J. Geevarghese, B. Thompson, P. Ruddy || tmima@cisco.com, casner@acm.org, geevjohn@hotmail.com, brucet@cisco.com, pruddy@cisco.com +# RFC3546 || S. Blake-Wilson, M. Nystrom, D. Hopwood, J. Mikkelsen, T. Wright || sblakewilson@bcisse.com, magnus@rsasecurity.com, david.hopwood@zetnet.co.uk, janm@transactionware.com, timothy.wright@vodafone.com +# RFC3547 || M. Baugher, B. Weis, T. Hardjono, H. Harney || mbaugher@cisco.com, thardjono@verisign.com, hh@sparta.com, bew@cisco.com +# RFC3548 || S. Josefsson, Ed. || +# RFC3549 || J. Salim, H. Khosravi, A. Kleen, A. Kuznetsov || hadi@znyx.com, hormuzd.m.khosravi@intel.com, ak@suse.de, kuznet@ms2.inr.ac.ru +# RFC3550 || H. Schulzrinne, S. Casner, R. Frederick, V. Jacobson || schulzrinne@cs.columbia.edu, casner@acm.org, ronf@bluecoat.com, van@packetdesign.com +# RFC3551 || H. Schulzrinne, S. Casner || schulzrinne@cs.columbia.edu, casner@acm.org +# RFC3552 || E. Rescorla, B. Korver || ekr@rtfm.com, briank@xythos.com, iab@iab.org +# RFC3553 || M. Mealling, L. Masinter, T. Hardie, G. Klyne || michael@verisignlabs.com, LMM@acm.org, hardie@qualcomm.com, GK-IETF@ninebynine.org +# RFC3554 || S. Bellovin, J. Ioannidis, A. Keromytis, R. Stewart || smb@research.att.com, ji@research.att.com, angelos@cs.columbia.edu, randall@lakerest.net +# RFC3555 || S. Casner, P. Hoschka || casner@acm.org, ph@w3.org +# RFC3556 || S. Casner || casner@acm.org +# RFC3557 || Q. Xie, Ed. || bdp003@motorola.com, Senaka.Balasuriya@motorola.com, yoonie@verbaltek.com, stephane.maes@oracle.com, hgarudad@qualcomm.com, Qiaobing.Xie@motorola.com +# RFC3558 || A. Li || adamli@icsl.ucla.edu +# RFC3559 || D. Thaler || dthaler@microsoft.com +# RFC3560 || R. Housley || housley@vigilsec.com +# RFC3561 || C. Perkins, E. Belding-Royer, S. Das || Charles.Perkins@nokia.com, ebelding@cs.ucsb.edu, sdas@ececs.uc.edu +# RFC3562 || M. Leech || mleech@nortelnetworks.com +# RFC3563 || A. Zinin || zinin@psg.com +# RFC3564 || F. Le Faucheur, W. Lai || +# RFC3565 || J. Schaad || jimsch@exmsft.com +# RFC3566 || S. Frankel, H. Herbert || sheila.frankel@nist.gov, howard.c.herbert@intel.com +# RFC3567 || T. Li, R. Atkinson || tli@procket.net, rja@extremenetworks.com +# RFC3568 || A. Barbir, B. Cain, R. Nair, O. Spatscheck || abbieb@nortelnetworks.com, bcain@storigen.com, nair_raj@yahoo.com, spatsch@research.att.com +# RFC3569 || S. Bhattacharyya, Ed. || +# RFC3570 || P. Rzewski, M. Day, D. Gilletti || mday@alum.mit.edu, dgilletti@yahoo.com, philrz@yahoo.com +# RFC3571 || D. Rawlins, A. Kulkarni, K. Ho Chan, M. Bokaemper, D. Dutt || Diana.Rawlins@mci.com, amol.kulkarni@intel.com, khchan@nortelnetworks.com, mbokaemper@juniper.net, ddutt@cisco.com +# RFC3572 || T. Ogura, M. Maruyama, T. Yoshida || ogura@core.ecl.net, mitsuru@core.ecl.net, yoshida@peta.arch.ecl.net +# RFC3573 || I. Goyret || igoyret@lucent.com +# RFC3574 || J. Soininen, Ed. || +# RFC3575 || B. Aboba || bernarda@microsoft.com +# RFC3576 || M. Chiba, G. Dommety, M. Eklund, D. Mitton, B. Aboba || mchiba@cisco.com, gdommety@cisco.com, meklund@cisco.com, david@mitton.com, bernarda@microsoft.com +# RFC3577 || S. Waldbusser, R. Cole, C. Kalbfleisch, D. Romascanu || waldbusser@nextbeacon.com, cwk@verio.net, rgcole@att.com, dromasca@gmail.com +# RFC3578 || G. Camarillo, A. B. Roach, J. Peterson, L. Ong || Gonzalo.Camarillo@ericsson.com, adam@dynamicsoft.com, jon.peterson@neustar.biz, lyong@ciena.com +# RFC3579 || B. Aboba, P. Calhoun || bernarda@microsoft.com, pcalhoun@airespace.com +# RFC3580 || P. Congdon, B. Aboba, A. Smith, G. Zorn, J. Roese || paul_congdon@hp.com, bernarda@microsoft.com, ah_smith@acm.org, jjr@enterasys.com, gwz@cisco.com +# RFC3581 || J. Rosenberg, H. Schulzrinne || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu +# RFC3582 || J. Abley, B. Black, V. Gill || jabley@isc.org, ben@layer8.net, vijaygill9@aol.com +# RFC3583 || H. Chaskar, Ed. || john.loughney@nokia.com, hemant.chaskar@nokia.com +# RFC3584 || R. Frye, D. Levi, S. Routhier, B. Wijnen || +# RFC3585 || J. Jason, L. Rafalow, E. Vyncke || jamie.jason@intel.com, rafalow@watson.ibm.com, evyncke@cisco.com +# RFC3586 || M. Blaze, A. Keromytis, M. Richardson, L. Sanchez || mab@crypto.com, angelos@cs.columbia.edu, mcr@sandelman.ottawa.on.ca, lsanchez@xapiens.com +# RFC3587 || R. Hinden, S. Deering, E. Nordmark || bob.hinden@gmail.com, erik.nordmark@sun.com +# RFC3588 || P. Calhoun, J. Loughney, E. Guttman, G. Zorn, J. Arkko || pcalhoun@airespace.com, john.Loughney@nokia.com, Jari.Arkko@ericsson.com, erik.guttman@sun.com +# RFC3589 || J. Loughney || john.Loughney@Nokia.com +# RFC3590 || B. Haberman || brian@innovationslab.net +# RFC3591 || H-K. Lam, M. Stewart, A. Huynh || mstewart1@nc.rr.com, a_n_huynh@yahoo.com, hklam@lucent.com +# RFC3592 || K. Tesink || kaj@research.telcordia.com +# RFC3593 || K. Tesink, Ed. || +# RFC3594 || P. Duffy || paduffy@cisco.com +# RFC3595 || B. Wijnen || bwijnen@lucent.com +# RFC3596 || S. Thomson, C. Huitema, V. Ksinant, M. Souissi || sethomso@cisco.com, huitema@microsoft.com, vladimir.ksinant@6wind.com, Mohsen.Souissi@nic.fr +# RFC3597 || A. Gustafsson || gson@nominum.com +# RFC3598 || K. Murchison || ken@oceana.com +# RFC3599 || S. Ginoza || ginoza@isi.edu +# RFC3600 || J. Reynolds, Ed., S. Ginoza, Ed. || +# RFC3601 || C. Allocchio || Claudio.Allocchio@garr.it +# RFC3602 || S. Frankel, R. Glenn, S. Kelly || sheila.frankel@nist.gov, scott@hyperthought.com, rob.glenn@nist.gov +# RFC3603 || W. Marshall, Ed., F. Andreasen, Ed. || +# RFC3604 || H. Khosravi, G. Kullgren, S. Shew, J. Sadler, A. Watanabe || hormuzd.m.khosravi@intel.com, geku@nortelnetworks.com, Jonathan.Sadler@tellabs.com, sdshew@nortelnetworks.com, Shiomoto.Kohei@lab.ntt.co.jp, atsushi@exa.onlab.ntt.co.jp, okamoto@exa.onlab.ntt.co.jp +# RFC3605 || C. Huitema || huitema@microsoft.com +# RFC3606 || F. Ly, M. Noto, A. Smith, E. Spiegel, K. Tesink || faye@pedestalnetworks.com, mnoto@cisco.com, ah_smith@acm.org, mspiegel@cisco.com, kaj@research.telcordia.com +# RFC3607 || M. Leech || mleech@nortelnetworks.com +# RFC3608 || D. Willis, B. Hoeneisen || dean.willis@softarmor.com, hoeneisen@switch.ch +# RFC3609 || R. Bonica, K. Kompella, D. Meyer || ronald.p.bonica@mci.com, kireeti@juniper.net, dmm@maoz.com +# RFC3610 || D. Whiting, R. Housley, N. Ferguson || dwhiting@hifn.com, housley@vigilsec.com, niels@macfergus.com +# RFC3611 || T. Friedman, Ed., R. Caceres, Ed., A. Clark, Ed. || almeroth@cs.ucsb.edu, caceres@watson.ibm.com, alan@telchemy.com, robert.cole@jhuapl.edu, duffield@research.att.com, timur.friedman@lip6.fr, khedayat@brixnet.com, ksarac@utdallas.edu, magnus.westerlund@ericsson.com +# RFC3612 || A. Farrel || adrian@olddog.co.uk +# RFC3613 || R. Morgan, K. Hazelton || rlmorgan@washington.edu, hazelton@doit.wisc.edu +# RFC3614 || J. Smith || jrsmith@watson.ibm.com +# RFC3615 || J. Gustin, A. Goyens || jean-marc.gustin@swift.com, andre.goyens@swift.com +# RFC3616 || F. Bellifemine, I. Constantinescu, S. Willmott || Fabio.Bellifemine@TILAB.COM, ion.constantinescu@epfl.ch, steve@lsi.upc.es +# RFC3617 || E. Lear || lear@cisco.com +# RFC3618 || B. Fenner, Ed., D. Meyer, Ed. || +# RFC3619 || S. Shah, M. Yip || sshah@extremenetworks.com, my@extremenetworks.com +# RFC3620 || D. New || dnew@san.rr.com +# RFC3621 || A. Berger, D. Romascanu || avib@PowerDsine.com, dromasca@gmail.com +# RFC3622 || M. Mealling || michael@neonym.net +# RFC3623 || J. Moy, P. Pillay-Esnault, A. Lindem || jmoy@sycamorenet.com, padma@juniper.net, acee@redback.com +# RFC3624 || B. Foster, D. Auerbach, F. Andreasen || fandreas@cisco.com, dea@cisco.com, bfoster@cisco.com +# RFC3625 || R. Gellens, H. Garudadri || +# RFC3626 || T. Clausen, Ed., P. Jacquet, Ed. || T.Clausen@computer.org, Philippe.Jacquet@inria.fr +# RFC3627 || P. Savola || psavola@funet.fi +# RFC3628 || D. Pinkas, N. Pope, J. Ross || Denis.Pinkas@bull.net, pope@secstan.com, ross@secstan.com, claire.desclercs@etsi.org +# RFC3629 || F. Yergeau || fyergeau@alis.com +# RFC3630 || D. Katz, K. Kompella, D. Yeung || dkatz@juniper.net, myeung@procket.com, kireeti@juniper.net +# RFC3631 || S. Bellovin, Ed., J. Schiller, Ed., C. Kaufman, Ed. || +# RFC3632 || S. Hollenbeck, S. Veeramachaneni, S. Yalamanchilli || shollenbeck@verisign.com, sveerama@verisign.com, syalamanchilli@verisign.com +# RFC3633 || O. Troan, R. Droms || ot@cisco.com, rdroms@cisco.com +# RFC3634 || K. Luehrs, R. Woundy, J. Bevilacqua, N. Davoust || k.luehrs@cablelabs.com, richard_woundy@cable.comcast.com, john@yas.com, nancy@yas.com +# RFC3635 || J. Flick || johnf@rose.hp.com +# RFC3636 || J. Flick || johnf@rose.hp.com +# RFC3637 || C.M. Heard, Ed. || +# RFC3638 || J. Flick, C. M. Heard || johnf@rose.hp.com, heard@pobox.com +# RFC3639 || M. St. Johns, Ed., G. Huston, Ed., IAB || +# RFC3640 || J. van der Meer, D. Mackie, V. Swaminathan, D. Singer, P. Gentric || jan.vandermeer@philips.com, dmackie@apple.com, viswanathan.swaminathan@sun.com, singer@apple.com, philippe.gentric@philips.com +# RFC3641 || S. Legg || steven.legg@adacel.com.au +# RFC3642 || S. Legg || steven.legg@adacel.com.au +# RFC3643 || R. Weber, M. Rajagopal, F. Travostino, M. O'Donnell, C. Monia, M. Merhar || roweber@ieee.org, muralir@broadcom.com, travos@nortelnetworks.com, cmonia@pacbell.net, milan.merhar@sun.com +# RFC3644 || Y. Snir, Y. Ramberg, J. Strassner, R. Cohen, B. Moore || yramberg@cisco.com, ysnir@cisco.com, john.strassner@intelliden.com, ronc@lyciumnetworks.com, remoore@us.ibm.com +# RFC3645 || S. Kwan, P. Garg, J. Gilroy, L. Esibov, J. Westhead, R. Hall || skwan@microsoft.com, praeritg@microsoft.com, jamesg@microsoft.com, levone@microsoft.com, randyhall@lucent.com, jwesth@microsoft.com +# RFC3646 || R. Droms, Ed. || rdroms@cisco.com +# RFC3647 || S. Chokhani, W. Ford, R. Sabett, C. Merrill, S. Wu || chokhani@orionsec.com, wford@verisign.com, rsabett@cooley.com, cmerrill@mccarter.com, swu@infoliance.com +# RFC3648 || J. Whitehead, J. Reschke, Ed. || ejw@cse.ucsc.edu, julian.reschke@greenbytes.de +# RFC3649 || S. Floyd || floyd@acm.org +# RFC3650 || S. Sun, L. Lannom, B. Boesch || ssun@cnri.reston.va.us, llannom@cnri.reston.va.us, bboesch@cnri.reston.va.us +# RFC3651 || S. Sun, S. Reilly, L. Lannom || ssun@cnri.reston.va.us, sreilly@cnri.reston.va.us, llannom@cnri.reston.va.us +# RFC3652 || S. Sun, S. Reilly, L. Lannom, J. Petrone || ssun@cnri.reston.va.us, sreilly@cnri.reston.va.us, llannom@cnri.reston.va.us, jpetrone@cnri.reston.va.us +# RFC3653 || J. Boyer, M. Hughes, J. Reagle || jboyer@PureEdge.com, Merlin.Hughes@betrusted.com, reagle@mit.edu +# RFC3654 || H. Khosravi, Ed., T. Anderson, Ed. || edbowen@us.ibm.com, rdantu@unt.edu, avri@acm.org, ram.gopal@nokia.com, hadi@znyx.com, muneyb@avaya.com, margaret.wasserman@nokia.com, hormuzd.m.khosravi@intel.com, todd.a.anderson@intel.com +# RFC3655 || B. Wellington, O. Gudmundsson || Brian.Wellington@nominum.com, ogud@ogud.com +# RFC3656 || R. Siemborski || +# RFC3657 || S. Moriai, A. Kato || camellia@isl.ntt.co.jp, akato@po.ntts.co.jp +# RFC3658 || O. Gudmundsson || ds-rfc@ogud.com +# RFC3659 || P. Hethmon || phethmon@hethmon.com +# RFC3660 || B. Foster, F. Andreasen || bfoster@cisco.com, fandreas@cisco.com +# RFC3661 || B. Foster, C. Sivachelvan || chelliah@cisco.com, bfoster@cisco.com +# RFC3662 || R. Bless, K. Nichols, K. Wehrle || bless@tm.uka.de, knichols@ieee.org, Klaus.Wehrle@uni-tuebingen.de +# RFC3663 || A. Newton || anewton@verisignlabs.com +# RFC3664 || P. Hoffman || paul.hoffman@vpnc.org +# RFC3665 || A. Johnston, S. Donovan, R. Sparks, C. Cunningham, K. Summers || alan.johnston@mci.com, sdonovan@dynamicsoft.com, rsparks@dynamicsoft.com, ccunningham@dynamicsoft.com, kevin.summers@sonusnet.com +# RFC3666 || A. Johnston, S. Donovan, R. Sparks, C. Cunningham, K. Summers || alan.johnston@mci.com, sdonovan@dynamicsoft.com, rsparks@dynamicsoft.com, ccunningham@dynamicsoft.com, kevin.summers@sonusnet.com +# RFC3667 || S. Bradner || +# RFC3668 || S. Bradner || +# RFC3669 || S. Brim || sbrim@cisco.com +# RFC3670 || B. Moore, D. Durham, J. Strassner, A. Westerinen, W. Weiss || remoore@us.ibm.com, david.durham@intel.com, john.strassner@intelliden.com, andreaw@cisco.com, walterweiss@attbi.com +# RFC3671 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3672 || K. Zeilenga || Kurt@OpenLDAP.org, steven.legg@adacel.com.au +# RFC3673 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3674 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3675 || D. Eastlake 3rd || dee3@torque.pothole.com +# RFC3676 || R. Gellens || randy@qualcomm.com +# RFC3677 || L. Daigle, Ed., Internet Architecture Board || iab@iab.org +# RFC3678 || D. Thaler, B. Fenner, B. Quinn || dthaler@microsoft.com, fenner@research.att.com, rcq@ipmulticast.com +# RFC3679 || R. Droms || rdroms@cisco.com +# RFC3680 || J. Rosenberg || jdrosen@dynamicsoft.com +# RFC3681 || R. Bush, R. Fink || randy@psg.com, bob@thefinks.com +# RFC3682 || V. Gill, J. Heasley, D. Meyer || vijay@umbc.edu, heas@shrubbery.net, dmm@1-4-5.net +# RFC3683 || M. Rose || mrose17@gmail.com +# RFC3684 || R. Ogier, F. Templin, M. Lewis || ogier@erg.sri.com, ftemplin@iprg.nokia.com, lewis@erg.sri.com +# RFC3685 || C. Daboo || daboo@cyrusoft.com +# RFC3686 || R. Housley || housley@vigilsec.com +# RFC3687 || S. Legg || steven.legg@adacel.com.au +# RFC3688 || M. Mealling || michael@verisignlabs.com +# RFC3689 || K. Carlberg, R. Atkinson || k.carlberg@cs.ucl.ac.uk, rja@extremenetworks.com +# RFC3690 || K. Carlberg, R. Atkinson || k.carlberg@cs.ucl.ac.uk, rja@extremenetworks.com +# RFC3691 || A. Melnikov || Alexey.Melnikov@isode.com +# RFC3692 || T. Narten || narten@us.ibm.com +# RFC3693 || J. Cuellar, J. Morris, D. Mulligan, J. Peterson, J. Polk || Jorge.Cuellar@siemens.com, jmorris@cdt.org, dmulligan@law.berkeley.edu, jon.peterson@neustar.biz, jmpolk@cisco.com +# RFC3694 || M. Danley, D. Mulligan, J. Morris, J. Peterson || mre213@nyu.edu, dmulligan@law.berkeley.edu, jmorris@cdt.org, jon.peterson@neustar.biz +# RFC3695 || M. Luby, L. Vicisano || luby@digitalfountain.com, lorenzo@cisco.com +# RFC3696 || J. Klensin || john-ietf@jck.com +# RFC3697 || J. Rajahalme, A. Conta, B. Carpenter, S. Deering || jarno.rajahalme@nokia.com, aconta@txc.com, brc@zurich.ibm.com +# RFC3698 || K. Zeilenga, Ed. || Kurt@OpenLDAP.org +# RFC3700 || J. Reynolds, Ed., S. Ginoza, Ed. || +# RFC3701 || R. Fink, R. Hinden || bob@thefinks.com, bob.hinden@gmail.com +# RFC3702 || J. Loughney, G. Camarillo || John.Loughney@nokia.com, Gonzalo.Camarillo@ericsson.com +# RFC3703 || J. Strassner, B. Moore, R. Moats, E. Ellesson || john.strassner@intelliden.com, remoore@us.ibm.com, rmoats@lemurnetworks.net, ellesson@mindspring.com +# RFC3704 || F. Baker, P. Savola || fred@cisco.com, psavola@funet.fi +# RFC3705 || B. Ray, R. Abbi || rray@pesa.com, Rajesh.Abbi@alcatel.com +# RFC3706 || G. Huang, S. Beaulieu, D. Rochefort || +# RFC3707 || A. Newton || anewton@verisignlabs.com +# RFC3708 || E. Blanton, M. Allman || eblanton@cs.purdue.edu, mallman@icir.org +# RFC3709 || S. Santesson, R. Housley, T. Freeman || stefans@microsoft.com, housley@vigilsec.com, trevorf@microsoft.com +# RFC3710 || H. Alvestrand || harald@alvestrand.no +# RFC3711 || M. Baugher, D. McGrew, M. Naslund, E. Carrara, K. Norrman || mbaugher@cisco.com, elisabetta.carrara@ericsson.com, mcgrew@cisco.com, mats.naslund@ericsson.com, karl.norrman@ericsson.com +# RFC3712 || P. Fleming, I. McDonald || flemingp@us.ibm.com, flemingp@us.ibm.com, flemingp@us.ibm.com +# RFC3713 || M. Matsui, J. Nakajima, S. Moriai || matsui@iss.isl.melco.co.jp, june15@iss.isl.melco.co.jp, shiho@rd.scei.sony.co.jp +# RFC3714 || S. Floyd, Ed., J. Kempf, Ed. || iab@iab.org +# RFC3715 || B. Aboba, W. Dixon || bernarda@microsoft.com, ietf-wd@v6security.com +# RFC3716 || IAB Advisory Committee || iab@iab.org +# RFC3717 || B. Rajagopalan, J. Luciani, D. Awduche || braja@tellium.com, james_luciani@mindspring.com, awduche@awduche.com +# RFC3718 || R. McGowan || +# RFC3719 || J. Parker, Ed. || jparker@axiowave.com +# RFC3720 || J. Satran, K. Meth, C. Sapuntzakis, M. Chadalapaka, E. Zeidner || Julian_Satran@il.ibm.com, meth@il.ibm.com, csapuntz@alum.mit.edu, efri@xiv.co.il, cbm@rose.hp.com +# RFC3721 || M. Bakke, J. Hafner, J. Hufferd, K. Voruganti, M. Krueger || kaladhar@us.ibm.com, mbakke@cisco.com, hafner@almaden.ibm.com, hufferd@us.ibm.com, marjorie_krueger@hp.com +# RFC3722 || M. Bakke || mbakke@cisco.com +# RFC3723 || B. Aboba, J. Tseng, J. Walker, V. Rangan, F. Travostino || bernarda@microsoft.com, joshtseng@yahoo.com, jesse.walker@intel.com, vrangan@brocade.com, travos@nortelnetworks.com +# RFC3724 || J. Kempf, Ed., R. Austein, Ed., IAB || +# RFC3725 || J. Rosenberg, J. Peterson, H. Schulzrinne, G. Camarillo || jdrosen@dynamicsoft.com, jon.peterson@neustar.biz, schulzrinne@cs.columbia.edu, Gonzalo.Camarillo@ericsson.com +# RFC3726 || M. Brunner, Ed. || brunner@netlab.nec.de, robert.hancock@roke.co.uk, eleanor.hepworth@roke.co.uk, cornelia.kappler@siemens.com, Hannes.Tschofenig@mchp.siemens.de +# RFC3727 || S. Legg || steven.legg@adacel.com.au +# RFC3728 || B. Ray, R. Abbi || rray@pesa.com, Rajesh.Abbi@alcatel.com +# RFC3729 || S. Waldbusser || waldbusser@nextbeacon.com +# RFC3730 || S. Hollenbeck || shollenbeck@verisign.com +# RFC3731 || S. Hollenbeck || shollenbeck@verisign.com +# RFC3732 || S. Hollenbeck || shollenbeck@verisign.com +# RFC3733 || S. Hollenbeck || shollenbeck@verisign.com +# RFC3734 || S. Hollenbeck || shollenbeck@verisign.com +# RFC3735 || S. Hollenbeck || shollenbeck@verisign.com +# RFC3736 || R. Droms || rdroms@cisco.com +# RFC3737 || B. Wijnen, A. Bierman || bwijnen@lucent.com, andy@yumaworks.com +# RFC3738 || M. Luby, V. Goyal || luby@digitalfountain.com, v.goyal@ieee.org +# RFC3739 || S. Santesson, M. Nystrom, T. Polk || stefans@microsoft.com, wpolk@nist.gov, magnus@rsasecurity.com +# RFC3740 || T. Hardjono, B. Weis || thardjono@verisign.com, bew@cisco.com +# RFC3741 || J. Boyer, D. Eastlake 3rd, J. Reagle || jboyer@PureEdge.com, Donald.Eastlake@motorola.com, reagle@mit.edu +# RFC3742 || S. Floyd || floyd@icir.org +# RFC3743 || K. Konishi, K. Huang, H. Qian, Y. Ko || konishi@jp.apan.net, huangk@alum.sinica.edu, Hlqian@cnnic.net.cn, yw@mrko.pe.kr, jseng@pobox.org.sg, rickard@rickardgroup.com +# RFC3744 || G. Clemm, J. Reschke, E. Sedlar, J. Whitehead || geoffrey.clemm@us.ibm.com, julian.reschke@greenbytes.de, eric.sedlar@oracle.com, ejw@cse.ucsc.edu +# RFC3745 || D. Singer, R. Clark, D. Lee || singer@apple.com, richard@elysium.ltd.uk, dlee@yahoo-inc.com +# RFC3746 || L. Yang, R. Dantu, T. Anderson, R. Gopal || lily.l.yang@intel.com, rdantu@unt.edu, todd.a.anderson@intel.com, ram.gopal@nokia.com +# RFC3747 || H. Hazewinkel, Ed., D. Partain, Ed. || +# RFC3748 || B. Aboba, L. Blunk, J. Vollbrecht, J. Carlson, H. Levkowetz, Ed. || bernarda@microsoft.com, ljb@merit.edu, jrv@umich.edu, james.d.carlson@sun.com, henrik@levkowetz.com +# RFC3749 || S. Hollenbeck || shollenbeck@verisign.com +# RFC3750 || C. Huitema, R. Austein, S. Satapati, R. van der Pol || huitema@microsoft.com, sra@isc.org, satapati@cisco.com, Ronald.vanderPol@nlnetlabs.nl +# RFC3751 || S. Bradner || sob@harvard.edu +# RFC3752 || A. Barbir, E. Burger, R. Chen, S. McHenry, H. Orman, R. Penno || abbieb@nortelnetworks.com, e.burger@ieee.org, chen@research.att.com, stephen@mchenry.net, ho@alum.mit.edu, rpenno@nortelnetworks.com +# RFC3753 || J. Manner, Ed., M. Kojo, Ed. || jmanner@cs.helsinki.fi, kojo@cs.helsinki.fi +# RFC3754 || R. Bless, K. Wehrle || bless@tm.uka.de, Klaus.Wehrle@uni-tuebingen.de +# RFC3755 || S. Weiler || weiler@tislabs.com +# RFC3756 || P. Nikander, Ed., J. Kempf, E. Nordmark || pekka.nikander@nomadiclab.com, kempf@docomolabs-usa.com, erik.nordmark@sun.com +# RFC3757 || O. Kolkman, J. Schlyter, E. Lewis || olaf@ripe.net, jakob@nic.se, edlewis@arin.net +# RFC3758 || R. Stewart, M. Ramalho, Q. Xie, M. Tuexen, P. Conrad || randall@lakerest.net, mramalho@cisco.com, qxie1@email.mot.com, tuexen@fh-muenster.de, conrad@acm.org +# RFC3759 || L-E. Jonsson || lars-erik.jonsson@ericsson.com +# RFC3760 || D. Gustafson, M. Just, M. Nystrom || degustafson@comcast.net, Just.Mike@tbs-sct.gc.ca, magnus@rsasecurity.com +# RFC3761 || P. Faltstrom, M. Mealling || paf@cisco.com +# RFC3762 || O. Levin || oritl@microsoft.com +# RFC3763 || S. Shalunov, B. Teitelbaum || shalunov@internet2.edu, ben@internet2.edu +# RFC3764 || J. Peterson || jon.peterson@neustar.biz +# RFC3765 || G. Huston || gih@telstra.net +# RFC3766 || H. Orman, P. Hoffman || hilarie@purplestreak.com, paul.hoffman@vpnc.org +# RFC3767 || S. Farrell, Ed. || +# RFC3768 || R. Hinden, Ed. || bob.hinden@gmail.com +# RFC3769 || S. Miyakawa, R. Droms || miyakawa@nttv6.jp, rdroms@cisco.com +# RFC3770 || R. Housley, T. Moore || housley@vigilsec.com, timmoore@microsoft.com +# RFC3771 || R. Harrison, K. Zeilenga || roger_harrison@novell.com, Kurt@OpenLDAP.org +# RFC3772 || J. Carlson, R. Winslow || +# RFC3773 || E. Candell || emily.candell@comverse.com +# RFC3774 || E. Davies, Ed. || +# RFC3775 || D. Johnson, C. Perkins, J. Arkko || dbj@cs.rice.edu, charliep@iprg.nokia.com, jari.arkko@ericsson.com +# RFC3776 || J. Arkko, V. Devarapalli, F. Dupont || jari.arkko@ericsson.com, vijayd@iprg.nokia.com, Francis.Dupont@enst-bretagne.fr +# RFC3777 || J. Galvin, Ed. || galvin+ietf@elistx.com +# RFC3778 || E. Taft, J. Pravetz, S. Zilles, L. Masinter || taft@adobe.com, jpravetz@adobe.com, szilles@adobe.com, LMM@acm.org +# RFC3779 || C. Lynn, S. Kent, K. Seo || CLynn@BBN.Com, Kent@BBN.Com, KSeo@BBN.Com +# RFC3780 || F. Strauss, J. Schoenwaelder || strauss@ibr.cs.tu-bs.de, j.schoenwaelder@iu-bremen.de +# RFC3781 || F. Strauss, J. Schoenwaelder || strauss@ibr.cs.tu-bs.de, j.schoenwaelder@iu-bremen.de +# RFC3782 || S. Floyd, T. Henderson, A. Gurtov || floyd@acm.org, thomas.r.henderson@boeing.com, andrei.gurtov@teliasonera.com +# RFC3783 || M. Chadalapaka, R. Elliott || cbm@rose.hp.com, elliott@hp.com +# RFC3784 || H. Smit, T. Li || hhwsmit@xs4all.nl, tony.li@tony.li +# RFC3785 || F. Le Faucheur, R. Uppili, A. Vedrenne, P. Merckx, T. Telkamp || flefauch@cisco.com, alain.vedrenne@equant.com, pierre.merckx@equant.com, telkamp@gblx.net +# RFC3786 || A. Hermelin, S. Previdi, M. Shand || amir@montilio.com, sprevidi@cisco.com, mshand@cisco.com +# RFC3787 || J. Parker, Ed. || jparker@axiowave.com +# RFC3788 || J. Loughney, M. Tuexen, Ed., J. Pastor-Balbas || john.loughney@nokia.com, tuexen@fh-muenster.de, j.javier.pastor@ericsson.com +# RFC3789 || P. Nesser, II, A. Bergstrom, Ed. || phil@nesser.com, andreas.bergstrom@hiof.no +# RFC3790 || C. Mickles, Ed., P. Nesser, II || cmickles.ee88@gtalumni.org, phil@nesser.com +# RFC3791 || C. Olvera, P. Nesser, II || cesar.olvera@consulintel.es, phil@nesser.com +# RFC3792 || P. Nesser, II, A. Bergstrom, Ed. || phil@nesser.com, andreas.bergstrom@hiof.no +# RFC3793 || P. Nesser, II, A. Bergstrom, Ed. || phil@nesser.com, andreas.bergstrom@hiof.no +# RFC3794 || P. Nesser, II, A. Bergstrom, Ed. || phil@nesser.com, andreas.bergstrom@hiof.no +# RFC3795 || R. Sofia, P. Nesser, II || rsofia@zmail.pt, phil@nesser.com +# RFC3796 || P. Nesser, II, A. Bergstrom, Ed. || phil@nesser.com, andreas.bergstrom@hiof.no +# RFC3797 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC3798 || T. Hansen, Ed., G. Vaudreuil, Ed. || GregV@ieee.org +# RFC3801 || G. Vaudreuil, G. Parsons || gregv@ieee.org, GParsons@NortelNetworks.com +# RFC3802 || G. Vaudreuil, G. Parsons || gregv@ieee.org, gparsons@nortelnetworks.com +# RFC3803 || G. Vaudreuil, G. Parsons || gregv@ieee.org, gparsons@nortelnetworks.com +# RFC3804 || G. Parsons || gparsons@nortelnetworks.com +# RFC3805 || R. Bergman, H. Lewis, I. McDonald || Ron.Bergman@hitachi-ps.us, harryl@us.ibm.com, imcdonald@sharplabs.com +# RFC3806 || R. Bergman, H. Lewis, I. McDonald || Ron.Bergman@hitachi-ps.us, harryl@us.ibm.com, imcdonald@sharplabs.com +# RFC3807 || E. Weilandt, N. Khanchandani, S. Rao || eva.weilandt@temic.com, rsanjay@nortelnetworks.com, neerajk@nortelnetworks.com +# RFC3808 || I. McDonald || imcdonald@sharplabs.com, iana@iana.org +# RFC3809 || A. Nagarajan, Ed. || +# RFC3810 || R. Vida, Ed., L. Costa, Ed. || Rolland.Vida@lip6.fr, Luis.Costa@lip6.fr, Serge.Fdida@lip6.fr, deering@cisco.com, fenner@research.att.com, kouvelas@cisco.com, brian@innovationslab.net +# RFC3811 || T. Nadeau, Ed., J. Cucchiara, Ed. || tnadeau@cisco.com, jcucchiara@mindspring.com +# RFC3812 || C. Srinivasan, A. Viswanathan, T. Nadeau || cheenu@bloomberg.net, arunv@force10networks.com, tnadeau@cisco.com +# RFC3813 || C. Srinivasan, A. Viswanathan, T. Nadeau || cheenu@bloomberg.net, arunv@force10networks.com, tnadeau@cisco.com +# RFC3814 || T. Nadeau, C. Srinivasan, A. Viswanathan || tnadeau@cisco.com, cheenu@bloomberg.net, arunv@force10networks.com +# RFC3815 || J. Cucchiara, H. Sjostrand, J. Luciani || james_luciani@mindspring.com, hans@ipunplugged.com, jcucchiara@mindspring.com +# RFC3816 || J. Quittek, M. Stiemerling, H. Hartenstein || quittek@netlab.nec.de, stiemerling@netlab.nec.de, hartenstein@rz.uni-karlsruhe.de +# RFC3817 || W. Townsley, R. da Silva || mark@townsley.net, rdasilva@va.rr.com +# RFC3818 || V. Schryver || vjs@rhyolite.com +# RFC3819 || P. Karn, Ed., C. Bormann, G. Fairhurst, D. Grossman, R. Ludwig, J. Mahdavi, G. Montenegro, J. Touch, L. Wood || karn@qualcomm.com, cabo@tzi.org, gorry@erg.abdn.ac.uk, Dan.Grossman@motorola.com, Reiner.Ludwig@ericsson.com, jmahdavi@earthlink.net, gab@sun.com, touch@isi.edu, lwood@cisco.com +# RFC3820 || S. Tuecke, V. Welch, D. Engert, L. Pearlman, M. Thompson || tuecke@mcs.anl.gov, vwelch@ncsa.uiuc.edu, deengert@anl.gov, laura@isi.edu, mrthompson@lbl.gov +# RFC3821 || M. Rajagopal, E. Rodriguez, R. Weber || +# RFC3822 || D. Peterson || dap@cnt.com +# RFC3823 || B. Kovitz || bkovitz@caltech.edu +# RFC3824 || J. Peterson, H. Liu, J. Yu, B. Campbell || jon.peterson@neustar.biz, hong.liu@neustar.biz, james.yu@neustar.biz, bcampbell@dynamicsoft.com +# RFC3825 || J. Polk, J. Schnizlein, M. Linsner || jmpolk@cisco.com, john.schnizlein@cisco.com, marc.linsner@cisco.com +# RFC3826 || U. Blumenthal, F. Maino, K. McCloghrie || uri@bell-labs.com, fmaino@andiamo.com, kzm@cisco.com +# RFC3827 || K. Sarcar || kanoj.sarcar@sun.com +# RFC3828 || L-A. Larzon, M. Degermark, S. Pink, L-E. Jonsson, Ed., G. Fairhurst, Ed. || lln@csee.ltu.se, micke@cs.arizona.edu, steve@cs.arizona.edu, lars-erik.jonsson@ericsson.com, gorry@erg.abdn.ac.uk +# RFC3829 || R. Weltman, M. Smith, M. Wahl || robw@worldspot.com, mcs@pearlcrescent.com +# RFC3830 || J. Arkko, E. Carrara, F. Lindholm, M. Naslund, K. Norrman || jari.arkko@ericsson.com, elisabetta.carrara@ericsson.com, fredrik.lindholm@ericsson.com, mats.naslund@ericsson.com, karl.norrman@ericsson.com +# RFC3831 || C. DeSanti || cds@cisco.com +# RFC3832 || W. Zhao, H. Schulzrinne, E. Guttman, C. Bisdikian, W. Jerome || zwb@cs.columbia.edu, hgs@cs.columbia.edu, Erik.Guttman@sun.com, bisdik@us.ibm.com, wfj@us.ibm.com +# RFC3833 || D. Atkins, R. Austein || derek@ihtfp.com, sra@isc.org +# RFC3834 || K. Moore || moore@cs.utk.edu +# RFC3835 || A. Barbir, R. Penno, R. Chen, M. Hofmann, H. Orman || abbieb@nortelnetworks.com, chen@research.att.com, hofmann@bell-labs.com, ho@alum.mit.edu, rpenno@nortelnetworks.com +# RFC3836 || A. Beck, M. Hofmann, H. Orman, R. Penno, A. Terzis || abeck@bell-labs.com, hofmann@bell-labs.com, ho@alum.mit.edu, rpenno@nortelnetworks.com, terzis@cs.jhu.edu +# RFC3837 || A. Barbir, O. Batuner, B. Srinivas, M. Hofmann, H. Orman || abbieb@nortelnetworks.com, batuner@attbi.com, bindignavile.srinivas@nokia.com, hofmann@bell-labs.com, ho@alum.mit.edu +# RFC3838 || A. Barbir, O. Batuner, A. Beck, T. Chan, H. Orman || abbieb@nortelnetworks.com, batuner@attbi.com, abeck@bell-labs.com, Tat.Chan@nokia.com, ho@alum.mit.edu +# RFC3839 || R. Castagno, D. Singer || +# RFC3840 || J. Rosenberg, H. Schulzrinne, P. Kyzivat || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu, pkyzivat@cisco.com +# RFC3841 || J. Rosenberg, H. Schulzrinne, P. Kyzivat || jdrosen@dynamicsoft.com, schulzrinne@cs.columbia.edu, pkyzivat@cisco.com +# RFC3842 || R. Mahy || rohan@cisco.com +# RFC3843 || L-E. Jonsson, G. Pelletier || lars-erik.jonsson@ericsson.com, ghyslain.pelletier@ericsson.com +# RFC3844 || E. Davies, Ed., J. Hofmann, Ed. || elwynd@nortelnetworks.com, jeanette@wz-berlin.de +# RFC3845 || J. Schlyter, Ed. || jakob@nic.se +# RFC3846 || F. Johansson, T. Johansson || fredrik@ipunplugged.com, tony.johansson@bytemobile.com +# RFC3847 || M. Shand, L. Ginsberg || mshand@cisco.com, ginsberg@cisco.com +# RFC3848 || C. Newman || chris.newman@sun.com +# RFC3849 || G. Huston, A. Lord, P. Smith || gih@apnic.net, anne@apnic.net, pfs@cisco.com +# RFC3850 || B. Ramsdell, Ed. || +# RFC3851 || B. Ramsdell, Ed. || +# RFC3852 || R. Housley || housley@vigilsec.com +# RFC3853 || J. Peterson || jon.peterson@neustar.biz +# RFC3854 || P. Hoffman, C. Bonatti, A. Eggen || +# RFC3855 || P. Hoffman, C. Bonatti || phoffman@imc.org, bonattic@ieca.com +# RFC3856 || J. Rosenberg || jdrosen@dynamicsoft.com +# RFC3857 || J. Rosenberg || jdrosen@dynamicsoft.com +# RFC3858 || J. Rosenberg || jdrosen@dynamicsoft.com +# RFC3859 || J. Peterson || jon.peterson@neustar.biz +# RFC3860 || J. Peterson || jon.peterson@neustar.biz +# RFC3861 || J. Peterson || jon.peterson@neustar.biz +# RFC3862 || G. Klyne, D. Atkins || GK-IETF@ninebynine.org, derek@ihtfp.com +# RFC3863 || H. Sugano, S. Fujimoto, G. Klyne, A. Bateman, W. Carr, J. Peterson || sugano.h@jp.fujitsu.com, shingo_fujimoto@jp.fujitsu.com, GK@ninebynine.org, bateman@acm.org, wayne.carr@intel.com, jon.peterson@neustar.biz +# RFC3864 || G. Klyne, M. Nottingham, J. Mogul || GK-IETF@ninebynine.org, mnot@pobox.com, JeffMogul@acm.org +# RFC3865 || C. Malamud || carl@media.org +# RFC3866 || K. Zeilenga, Ed. || +# RFC3867 || Y. Kawatsura, M. Hiroya, H. Beykirch || ykawatsu@itg.hitachi.co.jp, hiroya@st.rim.or.jp, hbbeykirch@web.de +# RFC3868 || J. Loughney, Ed., G. Sidebottom, L. Coene, G. Verwimp, J. Keller, B. Bidulock || john.Loughney@nokia.com, greg@signatustechnologies.com, lode.coene@siemens.com, gery.verwimp@siemens.com, joe.keller@tekelec.com, bidulock@openss7.org +# RFC3869 || R. Atkinson, Ed., S. Floyd, Ed., Internet Architecture Board || iab@iab.org, iab@iab.org, iab@iab.org +# RFC3870 || A. Swartz || me@aaronsw.com +# RFC3871 || G. Jones, Ed. || gmj3871@pobox.com +# RFC3872 || D. Zinman, D. Walker, J. Jiang || dzinman@rogers.com, david.walker@sedna-wireless.com, jjiang@syndesis.com +# RFC3873 || J. Pastor, M. Belinchon || J.Javier.Pastor@ericsson.com, maria.carmen.belinchon@ericsson.com +# RFC3874 || R. Housley || housley@vigilsec.com +# RFC3875 || D. Robinson, K. Coar || drtr@apache.org, coar@apache.org +# RFC3876 || D. Chadwick, S. Mullan || d.w.chadwick@salford.ac.uk, sean.mullan@sun.com +# RFC3877 || S. Chisholm, D. Romascanu || schishol@nortelnetworks.com, dromasca@gmail.com +# RFC3878 || H. Lam, A. Huynh, D. Perkins || hklam@lucent.com, a_n_huynh@yahoo.com, dperkins@snmpinfo.com +# RFC3879 || C. Huitema, B. Carpenter || huitema@microsoft.com, brc@zurich.ibm.com +# RFC3880 || J. Lennox, X. Wu, H. Schulzrinne || lennox@cs.columbia.edu, xiaotaow@cs.columbia.edu, schulzrinne@cs.columbia.edu +# RFC3881 || G. Marshall || glen.f.marshall@siemens.com +# RFC3882 || D. Turk || doughan.turk@bell.ca +# RFC3883 || S. Rao, A. Zinin, A. Roy || siraprao@hotmail.com, zinin@psg.com, akr@cisco.com +# RFC3884 || J. Touch, L. Eggert, Y. Wang || touch@isi.edu, lars.eggert@netlab.nec.de, yushunwa@isi.edu +# RFC3885 || E. Allman, T. Hansen || eric@Sendmail.COM, tony+msgtrk@maillennium.att.com +# RFC3886 || E. Allman || eric@Sendmail.COM +# RFC3887 || T. Hansen || tony+msgtrk@maillennium.att.com +# RFC3888 || T. Hansen || tony+msgtrk@maillennium.att.com +# RFC3889 || || +# RFC3890 || M. Westerlund || Magnus.Westerlund@ericsson.com +# RFC3891 || R. Mahy, B. Biggs, R. Dean || rohan@cisco.com, bbiggs@dumbterm.net, rfc@fdd.com +# RFC3892 || R. Sparks || RjS@xten.com +# RFC3893 || J. Peterson || jon.peterson@neustar.biz +# RFC3894 || J. Degener || jutta@sendmail.com +# RFC3895 || O. Nicklass, Ed. || orly_n@rad.com +# RFC3896 || O. Nicklass, Ed. || orly_n@rad.com +# RFC3897 || A. Barbir || abbieb@nortelnetworks.com +# RFC3898 || V. Kalusivalingam || vibhaska@cisco.com +# RFC3901 || A. Durand, J. Ihren || Alain.Durand@sun.com, johani@autonomica.se +# RFC3902 || M. Baker, M. Nottingham || distobj@acm.org, mnot@pobox.com +# RFC3903 || A. Niemi, Ed. || aki.niemi@nokia.com +# RFC3904 || C. Huitema, R. Austein, S. Satapati, R. van der Pol || huitema@microsoft.com, sra@isc.org, satapati@cisco.com, Ronald.vanderPol@nlnetlabs.nl +# RFC3905 || V. See, Ed. || vsee@microsoft.com +# RFC3906 || N. Shen, H. Smit || naiming@redback.com, hhwsmit@xs4all.nl +# RFC3909 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC3910 || V. Gurbani, Ed., A. Brusilovsky, I. Faynberg, J. Gato, H. Lu, M. Unmehopa || vkg@lucent.com, abrusilovsky@lucent.com, faynberg@lucent.com, jorge.gato@vodafone.com, huilanlu@lucent.com, unmehopa@lucent.com +# RFC3911 || R. Mahy, D. Petrie || rohan@airespace.com, dpetrie@pingtel.com +# RFC3912 || L. Daigle || leslie@verisignlabs.com +# RFC3913 || D. Thaler || dthaler@microsoft.com +# RFC3914 || A. Barbir, A. Rousskov || abbieb@nortelnetworks.com, rousskov@measurement-factory.com +# RFC3915 || S. Hollenbeck || shollenbeck@verisign.com +# RFC3916 || X. Xiao, Ed., D. McPherson, Ed., P. Pate, Ed. || xxiao@riverstonenet.com, danny@arbor.net, prayson.pate@overturenetworks.com +# RFC3917 || J. Quittek, T. Zseby, B. Claise, S. Zander || quittek@netlab.nec.de, zseby@fokus.fhg.de, bclaise@cisco.com, szander@swin.edu.au +# RFC3918 || D. Stopp, B. Hickman || debby@ixiacom.com, brooks.hickman@spirentcom.com +# RFC3919 || E. Stephan, J. Palet || emile.stephan@francetelecom.com, jordi.palet@consulintel.es +# RFC3920 || P. Saint-Andre, Ed. || ietf@stpeter.im +# RFC3921 || P. Saint-Andre, Ed. || ietf@stpeter.im +# RFC3922 || P. Saint-Andre || ietf@stpeter.im +# RFC3923 || P. Saint-Andre || ietf@stpeter.im +# RFC3924 || F. Baker, B. Foster, C. Sharp || fred@cisco.com, bfoster@cisco.com, chsharp@cisco.com +# RFC3925 || J. Littlefield || joshl@cisco.com +# RFC3926 || T. Paila, M. Luby, R. Lehtonen, V. Roca, R. Walsh || toni.paila@nokia.com, luby@digitalfountain.com, rami.lehtonen@teliasonera.com, vincent.roca@inrialpes.fr, rod.walsh@nokia.com +# RFC3927 || S. Cheshire, B. Aboba, E. Guttman || rfc@stuartcheshire.org, bernarda@microsoft.com, erik@spybeam.org +# RFC3928 || R. Megginson, Ed., M. Smith, O. Natkovich, J. Parham || rmegginson0224@aol.com, olgan@yahoo-inc.com, mcs@pearlcrescent.com, jeffparh@microsoft.com +# RFC3929 || T. Hardie || hardie@qualcomm.com +# RFC3930 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC3931 || J. Lau, Ed., M. Townsley, Ed., I. Goyret, Ed. || jedlau@cisco.com, mark@townsley.net, igoyret@lucent.com +# RFC3932 || H. Alvestrand || harald@alvestrand.no +# RFC3933 || J. Klensin, S. Dawkins || john-ietf@jck.com, spencer@mcsr-labs.org +# RFC3934 || M. Wasserman || margaret@thingmagic.com +# RFC3935 || H. Alvestrand || harald@alvestrand.no +# RFC3936 || K. Kompella, J. Lang || kireeti@juniper.net, jplang@ieee.org +# RFC3937 || M. Steidl || mdirector@iptc.org +# RFC3938 || T. Hansen || tony+msgctxt@maillennium.att.com +# RFC3939 || G. Parsons, J. Maruszak || gparsons@nortelnetworks.com, jjmaruszak@sympatico.ca +# RFC3940 || B. Adamson, C. Bormann, M. Handley, J. Macker || adamson@itd.nrl.navy.mil, cabo@tzi.org, M.Handley@cs.ucl.ac.uk, macker@itd.nrl.navy.mil +# RFC3941 || B. Adamson, C. Bormann, M. Handley, J. Macker || adamson@itd.nrl.navy.mil, cabo@tzi.org, M.Handley@cs.ucl.ac.uk, macker@itd.nrl.navy.mil +# RFC3942 || B. Volz || volz@cisco.com +# RFC3943 || R. Friend || rfriend@hifn.com +# RFC3944 || T. Johnson, S. Okubo, S. Campos || Tyler_Johnson@unc.edu, sokubo@waseda.jp, simao.campos@itu.int +# RFC3945 || E. Mannie, Ed. || eric_mannie@hotmail.com +# RFC3946 || E. Mannie, D. Papadimitriou || eric_mannie@hotmail.com, dimitri.papadimitriou@alcatel.be +# RFC3947 || T. Kivinen, B. Swander, A. Huttunen, V. Volpe || kivinen@safenet-inc.com, Ari.Huttunen@F-Secure.com, briansw@microsoft.com, vvolpe@cisco.com +# RFC3948 || A. Huttunen, B. Swander, V. Volpe, L. DiBurro, M. Stenberg || Ari.Huttunen@F-Secure.com, briansw@microsoft.com, vvolpe@cisco.com, ldiburro@nortelnetworks.com, markus.stenberg@iki.fi +# RFC3949 || R. Buckley, D. Venable, L. McIntyre, G. Parsons, J. Rafferty || rbuckley@crt.xerox.com, dvenable@crt.xerox.com, lloyd10328@pacbell.net, gparsons@nortel.com, jraff@brooktrout.com +# RFC3950 || L. McIntyre, G. Parsons, J. Rafferty || lloyd10328@pacbell.net, gparsons@nortel.com, jraff@brooktrout.com +# RFC3951 || S. Andersen, A. Duric, H. Astrom, R. Hagen, W. Kleijn, J. Linden || sva@kom.auc.dk, alan.duric@telio.no, henrik.astrom@globalipsound.com, roar.hagen@globalipsound.com, bastiaan.kleijn@globalipsound.com, jan.linden@globalipsound.com +# RFC3952 || A. Duric, S. Andersen || alan.duric@telio.no, sva@kom.auc.dk +# RFC3953 || J. Peterson || jon.peterson@neustar.biz +# RFC3954 || B. Claise, Ed. || bclaise@cisco.com +# RFC3955 || S. Leinen || simon@switch.ch +# RFC3956 || P. Savola, B. Haberman || psavola@funet.fi, brian@innovationslab.net +# RFC3957 || C. Perkins, P. Calhoun || charles.perkins@nokia.com, pcalhoun@airespace.com +# RFC3958 || L. Daigle, A. Newton || leslie@thinkingcat.com, anewton@verisignlabs.com +# RFC3959 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC3960 || G. Camarillo, H. Schulzrinne || Gonzalo.Camarillo@ericsson.com, schulzrinne@cs.columbia.edu +# RFC3961 || K. Raeburn || raeburn@mit.edu +# RFC3962 || K. Raeburn || raeburn@mit.edu +# RFC3963 || V. Devarapalli, R. Wakikawa, A. Petrescu, P. Thubert || vijay.devarapalli@nokia.com, ryuji@sfc.wide.ad.jp, Alexandru.Petrescu@motorola.com, pthubert@cisco.com +# RFC3964 || P. Savola, C. Patel || psavola@funet.fi, chirayu@chirayu.org +# RFC3965 || K. Toyoda, H. Ohno, J. Murai, D. Wing || toyoda.kiyoshi@jp.panasonic.com, hohno@ohnolab.org, jun@wide.ad.jp, dwing-ietf@fuggles.com +# RFC3966 || H. Schulzrinne || hgs@cs.columbia.edu +# RFC3967 || R. Bush, T. Narten || randy@psg.com, narten@us.ibm.com +# RFC3968 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC3969 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC3970 || K. Kompella || kireeti@juniper.net +# RFC3971 || J. Arkko, Ed., J. Kempf, B. Zill, P. Nikander || jari.arkko@ericsson.com, kempf@docomolabs-usa.com, bzill@microsoft.com, Pekka.Nikander@nomadiclab.com +# RFC3972 || T. Aura || tuomaura@microsoft.com +# RFC3973 || A. Adams, J. Nicholas, W. Siadak || ala@nexthop.com, jonathan.nicholas@itt.com, wfs@nexthop.com +# RFC3974 || M. Nakamura, J. Hagino || motonori@media.kyoto-u.ac.jp, itojun@iijlab.net +# RFC3975 || G. Huston, Ed., I. Leuca, Ed. || execd@iab.org, ileana.leuca@Cingular.com +# RFC3976 || V. K. Gurbani, F. Haerens, V. Rastogi || vkg@lucent.com, frans.haerens@alcatel.be, vidhi.rastogi@wipro.com +# RFC3977 || C. Feather || clive@davros.org +# RFC3978 || S. Bradner, Ed. || sob@harvard.edu +# RFC3979 || S. Bradner, Ed. || sob@harvard.edu +# RFC3980 || M. Krueger, M. Chadalapaka, R. Elliott || marjorie_krueger@hp.com, cbm@rose.hp.com, elliott@hp.com +# RFC3981 || A. Newton, M. Sanz || anewton@verisignlabs.com, sanz@denic.de +# RFC3982 || A. Newton, M. Sanz || anewton@verisignlabs.com, sanz@denic.de +# RFC3983 || A. Newton, M. Sanz || anewton@verisignlabs.com, sanz@denic.de +# RFC3984 || S. Wenger, M.M. Hannuksela, T. Stockhammer, M. Westerlund, D. Singer || stewe@stewe.org, miska.hannuksela@nokia.com, stockhammer@nomor.de, magnus.westerlund@ericsson.com, singer@apple.com +# RFC3985 || S. Bryant, Ed., P. Pate, Ed. || stbryant@cisco.com, prayson.pate@overturenetworks.com +# RFC3986 || T. Berners-Lee, R. Fielding, L. Masinter || timbl@w3.org, fielding@gbiv.com, LMM@acm.org +# RFC3987 || M. Duerst, M. Suignard || duerst@w3.org, michelsu@microsoft.com +# RFC3988 || B. Black, K. Kompella || ben@layer8.net, kireeti@juniper.net +# RFC3989 || M. Stiemerling, J. Quittek, T. Taylor || stiemerling@netlab.nec.de, quittek@netlab.nec.de, tom.taylor.stds@gmail.com +# RFC3990 || B. O'Hara, P. Calhoun, J. Kempf || bob@airespace.com, pcalhoun@airespace.com, kempf@docomolabs-usa.com +# RFC3991 || B. Foster, F. Andreasen || bfoster@cisco.com, fandreas@cisco.com +# RFC3992 || B. Foster, F. Andreasen || bfoster@cisco.com, fandreas@cisco.com +# RFC3993 || R. Johnson, T. Palaniappan, M. Stapp || raj@cisco.com, athenmoz@cisco.com, mjs@cisco.com +# RFC3994 || H. Schulzrinne || hgs@cs.columbia.edu +# RFC3995 || R. Herriot, T. Hastings || bob@herriot.com, tom.hastings@alum.mit.edu +# RFC3996 || R. Herriot, T. Hastings, H. Lewis || bob@herriot.com, tom.hastings@alum.mit.edu, harryl@us.ibm.com +# RFC3997 || T. Hastings, Ed., R. K. deBry, H. Lewis || tom.hastings@alum.mit.edu, debryro@uvsc.edu, harryl@us.ibm.com +# RFC3998 || C. Kugler, H. Lewis, T. Hastings, Ed. || kugler@us.ibm.com, harryl@us.ibm.com, tom.hastings@alum.mit.edu +# RFC4001 || M. Daniele, B. Haberman, S. Routhier, J. Schoenwaelder || michael.daniele@syamsoftware.com, brian@innovationslab.net, shawn.routhier@windriver.com, j.schoenwaelder@iu-bremen.de +# RFC4002 || R. Brandner, L. Conroy, R. Stastny || rudolf.brandner@siemens.com, lwc@roke.co.uk, richard.stastny@oefeg.at +# RFC4003 || L. Berger || lberger@movaz.com +# RFC4004 || P. Calhoun, T. Johansson, C. Perkins, T. Hiller, Ed., P. McCann || pcalhoun@cisco.com, tony.johansson@bytemobile.com, Charles.Perkins@nokia.com, tomhiller@lucent.com, mccap@lucent.com +# RFC4005 || P. Calhoun, G. Zorn, D. Spence, D. Mitton || pcalhoun@cisco.com, gwz@cisco.com, dspence@computer.org, dmitton@circularnetworks.com +# RFC4006 || H. Hakala, L. Mattila, J-P. Koskinen, M. Stura, J. Loughney || Harri.Hakala@ericsson.com, Leena.Mattila@ericsson.com, juha-pekka.koskinen@nokia.com, marco.stura@nokia.com, John.Loughney@nokia.com +# RFC4007 || S. Deering, B. Haberman, T. Jinmei, E. Nordmark, B. Zill || none, brian@innovationslab.net, jinmei@isl.rdc.toshiba.co.jp, Erik.Nordmark@sun.com, bzill@microsoft.com +# RFC4008 || R. Rohit, P. Srisuresh, R. Raghunarayan, N. Pai, C. Wang || rrohit74@hotmail.com, srisuresh@yahoo.com, raraghun@cisco.com, npai@cisco.com, cliffwang2000@yahoo.com +# RFC4009 || J. Park, S. Lee, J. Kim, J. Lee || khopri@kisa.or.kr, sjlee@kisa.or.kr, jykim@kisa.or.kr, jilee@kisa.or.kr +# RFC4010 || J. Park, S. Lee, J. Kim, J. Lee || khopri@kisa.or.kr, sjlee@kisa.or.kr, jykim@kisa.or.kr, jilee@kisa.or.kr +# RFC4011 || S. Waldbusser, J. Saperia, T. Hongal || waldbusser@nextbeacon.com, saperia@jdscons.com, hongal@riverstonenet.com +# RFC4012 || L. Blunk, J. Damas, F. Parent, A. Robachevsky || ljb@merit.edu, Joao_Damas@isc.org, Florent.Parent@hexago.com, andrei@ripe.net +# RFC4013 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4014 || R. Droms, J. Schnizlein || rdroms@cisco.com, jschnizl@cisco.com +# RFC4015 || R. Ludwig, A. Gurtov || Reiner.Ludwig@ericsson.com, andrei.gurtov@cs.helsinki.fi +# RFC4016 || M. Parthasarathy || mohanp@sbcglobal.net +# RFC4017 || D. Stanley, J. Walker, B. Aboba || dstanley@agere.com, jesse.walker@intel.com, bernarda@microsoft.com +# RFC4018 || M. Bakke, J. Hufferd, K. Voruganti, M. Krueger, T. Sperry || mbakke@cisco.com, jlhufferd@comcast.net, kaladhar@us.ibm.com, marjorie_krueger@hp.com, todd_sperry@adaptec.com +# RFC4019 || G. Pelletier || ghyslain.pelletier@ericsson.com +# RFC4020 || K. Kompella, A. Zinin || kireeti@juniper.net, zinin@psg.com +# RFC4021 || G. Klyne, J. Palme || GK-IETF@ninebynine.org, jpalme@dsv.su.se +# RFC4022 || R. Raghunarayan, Ed. || raraghun@cisco.com +# RFC4023 || T. Worster, Y. Rekhter, E. Rosen, Ed. || tom.worster@motorola.com, yakov@juniper.net, erosen@cisco.com +# RFC4024 || G. Parsons, J. Maruszak || gparsons@nortel.com, jjmaruszak@sympatico.ca +# RFC4025 || M. Richardson || mcr@sandelman.ottawa.on.ca +# RFC4026 || L. Andersson, T. Madsen || loa@pi.se, tove.madsen@acreo.se +# RFC4027 || S. Josefsson || simon@josefsson.org +# RFC4028 || S. Donovan, J. Rosenberg || srd@cisco.com, jdrosen@cisco.com +# RFC4029 || M. Lind, V. Ksinant, S. Park, A. Baudot, P. Savola || mikael.lind@teliasonera.com, vladimir.ksinant@fr.thalesgroup.com, soohong.park@samsung.com, alain.baudot@francetelecom.com, psavola@funet.fi +# RFC4030 || M. Stapp, T. Lemon || mjs@cisco.com, Ted.Lemon@nominum.com +# RFC4031 || M. Carugi, Ed., D. McDysan, Ed. || marco.carugi@nortel.com, dave.mcdysan@mci.com +# RFC4032 || G. Camarillo, P. Kyzivat || Gonzalo.Camarillo@ericsson.com, pkyzivat@cisco.com +# RFC4033 || R. Arends, R. Austein, M. Larson, D. Massey, S. Rose || roy.arends@telin.nl, sra@isc.org, mlarson@verisign.com, massey@cs.colostate.edu, scott.rose@nist.gov +# RFC4034 || R. Arends, R. Austein, M. Larson, D. Massey, S. Rose || roy.arends@telin.nl, sra@isc.org, mlarson@verisign.com, massey@cs.colostate.edu, scott.rose@nist.gov +# RFC4035 || R. Arends, R. Austein, M. Larson, D. Massey, S. Rose || roy.arends@telin.nl, sra@isc.org, mlarson@verisign.com, massey@cs.colostate.edu, scott.rose@nist.gov +# RFC4036 || W. Sawyer || wsawyer@ieee.org +# RFC4037 || A. Rousskov || rousskov@measurement-factory.com +# RFC4038 || M-K. Shin, Ed., Y-G. Hong, J. Hagino, P. Savola, E. M. Castro || mshin@nist.gov, yghong@pec.etri.re.kr, itojun@iijlab.net, psavola@funet.fi, eva@gsyc.escet.urjc.es +# RFC4039 || S. Park, P. Kim, B. Volz || soohong.park@samsung.com, kimps@samsung.com, volz@cisco.com +# RFC4040 || R. Kreuter || ruediger.kreuter@siemens.com +# RFC4041 || A. Farrel || adrian@olddog.co.uk +# RFC4042 || M. Crispin || UTF9@Lingling.Panda.COM +# RFC4043 || D. Pinkas, T. Gindin || Denis.Pinkas@bull.net, tgindin@us.ibm.com +# RFC4044 || K. McCloghrie || kzm@cisco.com +# RFC4045 || G. Bourdon || gilles.bourdon@francetelecom.com +# RFC4046 || M. Baugher, R. Canetti, L. Dondeti, F. Lindholm || mbaugher@cisco.com, canetti@watson.ibm.com, ldondeti@qualcomm.com, fredrik.lindholm@ericsson.com +# RFC4047 || S. Allen, D. Wells || sla@ucolick.org, dwells@nrao.edu +# RFC4048 || B. Carpenter || brc@zurich.ibm.com +# RFC4049 || R. Housley || housley@vigilsec.com +# RFC4050 || S. Blake-Wilson, G. Karlinger, T. Kobayashi, Y. Wang || sblakewilson@bcisse.com, gregor.karlinger@cio.gv.at, kotetsu@isl.ntt.co.jp, yonwang@uncc.edu +# RFC4051 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC4052 || L. Daigle, Ed., Internet Architecture Board || iab@iab.org, iab@iab.org +# RFC4053 || S. Trowbridge, S. Bradner, F. Baker || sjtrowbridge@lucent.com, sob@harvard.edu, fred@cisco.com +# RFC4054 || J. Strand, Ed., A. Chiu, Ed. || jls@research.att.com, chiu@research.att.com +# RFC4055 || J. Schaad, B. Kaliski, R. Housley || jimsch@exmsft.com, bkaliski@rsasecurity.com, housley@vigilsec.com +# RFC4056 || J. Schaad || jimsch@exmsft.com +# RFC4057 || J. Bound, Ed. || jim.bound@hp.com +# RFC4058 || A. Yegin, Ed., Y. Ohba, R. Penno, G. Tsirtsis, C. Wang || alper.yegin@samsung.com, yohba@tari.toshiba.com, rpenno@juniper.net, G.Tsirtsis@Flarion.com, cliffwangmail@yahoo.com +# RFC4059 || D. Linsenbardt, S. Pontius, A. Sturgeon || dlinsenbardt@spyrus.com, spontius@spyrus.com, asturgeon@spyrus.com +# RFC4060 || Q. Xie, D. Pearce || qxie1@email.mot.com, bdp003@motorola.com +# RFC4061 || V. Manral, R. White, A. Shaikh || vishwas@sinett.com, riw@cisco.com, ashaikh@research.att.com +# RFC4062 || V. Manral, R. White, A. Shaikh || vishwas@sinett.com, riw@cisco.com, ashaikh@research.att.com +# RFC4063 || V. Manral, R. White, A. Shaikh || vishwas@sinett.com, riw@cisco.com, ashaikh@research.att.com +# RFC4064 || A. Patel, K. Leung || alpesh@cisco.com, kleung@cisco.com +# RFC4065 || J. Kempf || kempf@docomolabs-usa.com +# RFC4066 || M. Liebsch, Ed., A. Singh, Ed., H. Chaskar, D. Funato, E. Shim || marco.liebsch@netlab.nec.de, asingh1@email.mot.com, hemant.chaskar@airtightnetworks.net, funato@mlab.yrp.nttdocomo.co.jp, eunsoo@research.panasonic.com +# RFC4067 || J. Loughney, Ed., M. Nakhjiri, C. Perkins, R. Koodli || john.loughney@nokia.com, madjid.nakhjiri@motorola.com, charles.perkins@.nokia.com, rajeev.koodli@nokia.com +# RFC4068 || R. Koodli, Ed. || Rajeev.Koodli@nokia.com +# RFC4069 || M. Dodge, B. Ray || mbdodge@ieee.org, rray@pesa.com +# RFC4070 || M. Dodge, B. Ray || mbdodge@ieee.org, rray@pesa.com +# RFC4071 || R. Austein, Ed., B. Wijnen, Ed. || sra@isc.org, bwijnen@lucent.com +# RFC4072 || P. Eronen, Ed., T. Hiller, G. Zorn || pe@iki.fi, tomhiller@lucent.com, gwz@cisco.com +# RFC4073 || R. Housley || housley@vigilsec.com +# RFC4074 || Y. Morishita, T. Jinmei || yasuhiro@jprs.co.jp, jinmei@isl.rdc.toshiba.co.jp +# RFC4075 || V. Kalusivalingam || vibhaska@cisco.com +# RFC4076 || T. Chown, S. Venaas, A. Vijayabhaskar || tjc@ecs.soton.ac.uk, venaas@uninett.no, vibhaska@cisco.com +# RFC4077 || A.B. Roach || adam@estacado.net +# RFC4078 || N. Earnshaw, S. Aoki, A. Ashley, W. Kameyama || nigel.earnshaw@rd.bbc.co.uk, shig@center.jfn.co.jp, aashley@ndsuk.com, wataru@waseda.jp +# RFC4079 || J. Peterson || jon.peterson@neustar.biz +# RFC4080 || R. Hancock, G. Karagiannis, J. Loughney, S. Van den Bosch || robert.hancock@roke.co.uk, g.karagiannis@ewi.utwente.nl, john.loughney@nokia.com, sven.van_den_bosch@alcatel.be +# RFC4081 || H. Tschofenig, D. Kroeselberg || Hannes.Tschofenig@siemens.com, Dirk.Kroeselberg@siemens.com +# RFC4082 || A. Perrig, D. Song, R. Canetti, J. D. Tygar, B. Briscoe || perrig@cmu.edu, dawnsong@cmu.edu, canetti@watson.ibm.com, doug.tygar@gmail.com, bob.briscoe@bt.com +# RFC4083 || M. Garcia-Martin || miguel.an.garcia@nokia.com +# RFC4084 || J. Klensin || john-ietf@jck.com +# RFC4085 || D. Plonka || plonka@doit.wisc.edu +# RFC4086 || D. Eastlake 3rd, J. Schiller, S. Crocker || Donald.Eastlake@motorola.com, jis@mit.edu, steve@stevecrocker.com +# RFC4087 || D. Thaler || dthaler@microsoft.com +# RFC4088 || D. Black, K. McCloghrie, J. Schoenwaelder || black_david@emc.com, kzm@cisco.com, j.schoenwaelder@iu-bremen.de +# RFC4089 || S. Hollenbeck, Ed., IAB and IESG || sah@428cobrajet.net, none, none +# RFC4090 || P. Pan, Ed., G. Swallow, Ed., A. Atlas, Ed. || ppan@hammerheadsystems.com, swallow@cisco.com, aatlas@avici.com +# RFC4091 || G. Camarillo, J. Rosenberg || Gonzalo.Camarillo@ericsson.com, jdrosen@cisco.com +# RFC4092 || G. Camarillo, J. Rosenberg || Gonzalo.Camarillo@ericsson.com, jdrosen@cisco.com +# RFC4093 || F. Adrangi, Ed., H. Levkowetz, Ed. || farid.adrangi@intel.com, henrik@levkowetz.com +# RFC4094 || J. Manner, X. Fu || jmanner@cs.helsinki.fi, fu@cs.uni-goettingen.de +# RFC4095 || C. Malamud || carl@media.org +# RFC4096 || C. Malamud || carl@media.org +# RFC4097 || M. Barnes, Ed. || mary.barnes@nortel.com +# RFC4098 || H. Berkowitz, E. Davies, Ed., S. Hares, P. Krishnaswamy, M. Lepp || hcb@gettcomm.com, elwynd@dial.pipex.com, skh@nexthop.com, padma.krishnaswamy@saic.com, mlepp@lepp.com +# RFC4101 || E. Rescorla, IAB || ekr@rtfm.com, iab@iab.org +# RFC4102 || P. Jones || paulej@packetizer.com +# RFC4103 || G. Hellstrom, P. Jones || gunnar.hellstrom@omnitor.se, paulej@packetizer.com +# RFC4104 || M. Pana, Ed., A. Reyes, A. Barba, D. Moron, M. Brunner || mpana@metasolv.com, mreyes@ac.upc.edu, telabm@mat.upc.es, dmor4477@hotmail.com, brunner@netlab.nec.de +# RFC4105 || J.-L. Le Roux, Ed., J.-P. Vasseur, Ed., J. Boyle, Ed. || jeanlouis.leroux@francetelecom.com, jpv@cisco.com, jboyle@pdnets.com +# RFC4106 || J. Viega, D. McGrew || viega@securesoftware.com, mcgrew@cisco.com +# RFC4107 || S. Bellovin, R. Housley || bellovin@acm.org, housley@vigilsec.com +# RFC4108 || R. Housley || housley@vigilsec.com +# RFC4109 || P. Hoffman || paul.hoffman@vpnc.org +# RFC4110 || R. Callon, M. Suzuki || rcallon@juniper.net, suzuki.muneyoshi@lab.ntt.co.jp +# RFC4111 || L. Fang, Ed. || luyuanfang@att.com +# RFC4112 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC4113 || B. Fenner, J. Flick || fenner@research.att.com, john.flick@hp.com +# RFC4114 || S. Hollenbeck || shollenbeck@verisign.com +# RFC4115 || O. Aboul-Magd, S. Rabie || osama@nortel.com, rabie@nortel.com +# RFC4116 || J. Abley, K. Lindqvist, E. Davies, B. Black, V. Gill || jabley@isc.org, kurtis@kurtis.pp.se, elwynd@dial.pipex.com, ben@layer8.net, vgill@vijaygill.com +# RFC4117 || G. Camarillo, E. Burger, H. Schulzrinne, A. van Wijk || Gonzalo.Camarillo@ericsson.com, eburger@brooktrout.com, schulzrinne@cs.columbia.edu, a.vwijk@viataal.nl +# RFC4118 || L. Yang, P. Zerfos, E. Sadot || lily.l.yang@intel.com, pzerfos@cs.ucla.edu, esadot@avaya.com +# RFC4119 || J. Peterson || jon.peterson@neustar.biz +# RFC4120 || C. Neuman, T. Yu, S. Hartman, K. Raeburn || bcn@isi.edu, tlyu@mit.edu, hartmans-ietf@mit.edu, raeburn@mit.edu +# RFC4121 || L. Zhu, K. Jaganathan, S. Hartman || LZhu@microsoft.com, karthikj@microsoft.com, hartmans-ietf@mit.edu +# RFC4122 || P. Leach, M. Mealling, R. Salz || paulle@microsoft.com, michael@refactored-networks.com, rsalz@datapower.com +# RFC4123 || H. Schulzrinne, C. Agboh || hgs@cs.columbia.edu, charles.agboh@packetizer.com +# RFC4124 || F. Le Faucheur, Ed. || flefauch@cisco.com +# RFC4125 || F. Le Faucheur, W. Lai || flefauch@cisco.com, wlai@att.com +# RFC4126 || J. Ash || gash@att.com +# RFC4127 || F. Le Faucheur, Ed. || flefauch@cisco.com +# RFC4128 || W. Lai || wlai@att.com +# RFC4129 || R. Mukundan, K. Morneault, N. Mangalpally || ranjith.mukundan@wipro.com, kmorneau@cisco.com, narsim@nortelnetworks.com +# RFC4130 || D. Moberg, R. Drummond || dmoberg@cyclonecommerce.com, rvd2@drummondgroup.com +# RFC4131 || S. Green, K. Ozawa, E. Cardona, Ed., A. Katsnelson || rubbersoul3@yahoo.com, Kazuyoshi.Ozawa@toshiba.co.jp, katsnelson6@peoplepc.com, e.cardona@cablelabs.com +# RFC4132 || S. Moriai, A. Kato, M. Kanda || shiho@rd.scei.sony.co.jp, akato@po.ntts.co.jp, kanda.masayuki@lab.ntt.co.jp +# RFC4133 || A. Bierman, K. McCloghrie || andy@yumaworks.com, kzm@cisco.com +# RFC4134 || P. Hoffman, Ed. || phoffman@imc.org +# RFC4135 || JH. Choi, G. Daley || jinchoe@samsung.com, greg.daley@eng.monash.edu.au +# RFC4136 || P. Pillay-Esnault || ppe@cisco.com +# RFC4137 || J. Vollbrecht, P. Eronen, N. Petroni, Y. Ohba || jrv@mtghouse.com, pe@iki.fi, npetroni@cs.umd.edu, yohba@tari.toshiba.com +# RFC4138 || P. Sarolahti, M. Kojo || pasi.sarolahti@nokia.com, kojo@cs.helsinki.fi +# RFC4139 || D. Papadimitriou, J. Drake, J. Ash, A. Farrel, L. Ong || dimitri.papadimitriou@alcatel.be, John.E.Drake2@boeing.com, gash@att.com, adrian@olddog.co.uk, lyong@ciena.com +# RFC4140 || H. Soliman, C. Castelluccia, K. El Malki, L. Bellier || h.soliman@flarion.com, claude.castelluccia@inria.fr, karim@elmalki.homeip.net, ludovic.bellier@inria.fr +# RFC4141 || K. Toyoda, D. Crocker || toyoda.kiyoshi@jp.panasonic.com, dcrocker@bbiw.net +# RFC4142 || D. Crocker, G. Klyne || dcrocker@bbiw.net, GK-IETF@ninebynine.org +# RFC4143 || K. Toyoda, D. Crocker || toyoda.kiyoshi@jp.panasonic.com, dcrocker@bbiw.net +# RFC4144 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC4145 || D. Yon, G. Camarillo || yon-comedia@rfdsoftware.com, Gonzalo.Camarillo@ericsson.com +# RFC4146 || R. Gellens || randy@qualcomm.com +# RFC4147 || G. Huston || gih@apnic.net +# RFC4148 || E. Stephan || emile.stephan@francetelecom.com +# RFC4149 || C. Kalbfleisch, R. Cole, D. Romascanu || ietf@kalbfleisch.us, robert.cole@jhuapl.edu, dromasca@gmail.com +# RFC4150 || R. Dietz, R. Cole || rdietz@hifn.com, robert.cole@jhuapl.edu +# RFC4151 || T. Kindberg, S. Hawke || timothy@hpl.hp.com, sandro@w3.org +# RFC4152 || K. Tesink, R. Fox || kaj@research.telcordia.com, rfox@telcordia.com +# RFC4153 || K. Fujimura, M. Terada, D. Eastlake 3rd || fujimura.ko@lab.ntt.co.jp, te@rex.yrp.nttdocomo.co.jp, Donald.Eastlake@motorola.com +# RFC4154 || M. Terada, K. Fujimura || te@rex.yrp.nttdocomo.co.jp, fujimura.ko@lab.ntt.co.jp +# RFC4155 || E. Hall || ehall@ntrg.com +# RFC4156 || P. Hoffman || paul.hoffman@vpnc.org +# RFC4157 || P. Hoffman || paul.hoffman@vpnc.org +# RFC4158 || M. Cooper, Y. Dzambasow, P. Hesse, S. Joseph, R. Nicholas || mcooper@orionsec.com, yuriy@anassoc.com, pmhesse@geminisecurity.com, susan.joseph@vdtg.com, richard.nicholas@it.baesystems.com +# RFC4159 || G. Huston || gih@apnic.net +# RFC4160 || K. Mimura, K. Yokoyama, T. Satoh, C. Kanaide, C. Allocchio || mimu@miyabi-labo.net, keiyoko@msn.com, zsatou@t-ns.co.jp, icemilk77@yahoo.co.jp, Claudio.Allocchio@garr.it +# RFC4161 || K. Mimura, K. Yokoyama, T. Satoh, K. Watanabe, C. Kanaide || mimu@miyabi-labo.net, keiyoko@msn.com, zsatou@t-ns.co.jp, knabe@ad.cyberhome.ne.jp, icemilk77@yahoo.co.jp +# RFC4162 || H.J. Lee, J.H. Yoon, J.I. Lee || jiinii@kisa.or.kr, jhyoon@kisa.or.kr, jilee@kisa.or.kr +# RFC4163 || L-E. Jonsson || lars-erik.jonsson@ericsson.com +# RFC4164 || G. Pelletier || ghyslain.pelletier@ericsson.com +# RFC4165 || T. George, B. Bidulock, R. Dantu, H. Schwarzbauer, K. Morneault || tgeorge_tx@verizon.net, bidulock@openss7.org, rdantu@unt.edu, HannsJuergen.Schwarzbauer@Siemens.com, kmorneau@cisco.com +# RFC4166 || L. Coene, J. Pastor-Balbas || lode.coene@siemens.com, J.Javier.Pastor@ericsson.com +# RFC4167 || A. Lindem || acee@cisco.com +# RFC4168 || J. Rosenberg, H. Schulzrinne, G. Camarillo || jdrosen@cisco.com, schulzrinne@cs.columbia.edu, Gonzalo.Camarillo@ericsson.com +# RFC4169 || V. Torvinen, J. Arkko, M. Naslund || vesa.torvinen@turkuamk.fi, jari.arkko@ericsson.com, mats.naslund@ericsson.com +# RFC4170 || B. Thompson, T. Koren, D. Wing || brucet@cisco.com, tmima@cisco.com, dwing-ietf@fuggles.com +# RFC4171 || J. Tseng, K. Gibbons, F. Travostino, C. Du Laney, J. Souza || joshtseng@yahoo.com, kevin.gibbons@mcdata.com, travos@nortel.com, cdl@rincon.com, joes@exmsft.com +# RFC4172 || C. Monia, R. Mullendore, F. Travostino, W. Jeong, M. Edwards || charles_monia@yahoo.com, Rod.Mullendore@MCDATA.com, travos@nortel.com, wayland@TroikaNetworks.com, mark_edwards@adaptec.com +# RFC4173 || P. Sarkar, D. Missimer, C. Sapuntzakis || psarkar@almaden.ibm.com, duncan.missimer@ieee.org, csapuntz@alum.mit.edu +# RFC4174 || C. Monia, J. Tseng, K. Gibbons || charles_monia@yahoo.com, joshtseng@yahoo.com, kevin.gibbons@mcdata.com +# RFC4175 || L. Gharai, C. Perkins || ladan@isi.edu, csp@csperkins.org +# RFC4176 || Y. El Mghazli, Ed., T. Nadeau, M. Boucadair, K. Chan, A. Gonguet || yacine.el_mghazli@alcatel.fr, tnadeau@cisco.com, mohamed.boucadair@francetelecom.com, khchan@nortel.com, arnaud.gonguet@alcatel.fr +# RFC4177 || G. Huston || gih@apnic.net +# RFC4178 || L. Zhu, P. Leach, K. Jaganathan, W. Ingersoll || lzhu@microsoft.com, paulle@microsoft.com, karthikj@microsoft.com, wyllys.ingersoll@sun.com +# RFC4179 || S. Kang || sukang@nca.or.kr +# RFC4180 || Y. Shafranovich || ietf@shaftek.org +# RFC4181 || C. Heard, Ed. || heard@pobox.com +# RFC4182 || E. Rosen || erosen@cisco.com +# RFC4183 || E. Warnicke || eaw@cisco.com +# RFC4184 || B. Link, T. Hager, J. Flaks || bdl@dolby.com, thh@dolby.com, jasonfl@microsoft.com +# RFC4185 || J. Klensin || john-ietf@jck.com +# RFC4186 || H. Haverinen, Ed., J. Salowey, Ed. || henry.haverinen@nokia.com, jsalowey@cisco.com +# RFC4187 || J. Arkko, H. Haverinen || jari.Arkko@ericsson.com, henry.haverinen@nokia.com +# RFC4188 || K. Norseth, Ed., E. Bell, Ed. || kenyon.c.norseth@L-3com.com, elbell@ntlworld.com +# RFC4189 || K. Ono, S. Tachimoto || ono.kumiko@lab.ntt.co.jp, kumiko@cs.columbia.edu, tachimoto.shinya@lab.ntt.co.jp +# RFC4190 || K. Carlberg, I. Brown, C. Beard || k.carlberg@cs.ucl.ac.uk, I.Brown@cs.ucl.ac.uk, BeardC@umkc.edu +# RFC4191 || R. Draves, D. Thaler || richdr@microsoft.com, dthaler@microsoft.com +# RFC4192 || F. Baker, E. Lear, R. Droms || fred@cisco.com, lear@cisco.com, rdroms@cisco.com +# RFC4193 || R. Hinden, B. Haberman || bob.hinden@gmail.com, brian@innovationslab.net +# RFC4194 || J. Strombergson, L. Walleij, P. Faltstrom || Joachim.Strombergson@InformAsic.com, triad@df.lth.se, paf@cisco.com +# RFC4195 || W. Kameyama || wataru@waseda.jp +# RFC4196 || H.J. Lee, J.H. Yoon, S.L. Lee, J.I. Lee || jiinii@kisa.or.kr, jhyoon@kisa.or.kr, sllee@kisa.or.kr, jilee@kisa.or.kr +# RFC4197 || M. Riegel, Ed. || maximilian.riegel@siemens.com +# RFC4198 || D. Tessman || dtessman@zelestra.com +# RFC4201 || K. Kompella, Y. Rekhter, L. Berger || kireeti@juniper.net, yakov@juniper.net, lberger@movaz.com +# RFC4202 || K. Kompella, Ed., Y. Rekhter, Ed. || kireeti@juniper.net, yakov@juniper.net +# RFC4203 || K. Kompella, Ed., Y. Rekhter, Ed. || kireeti@juniper.net, yakov@juniper.net +# RFC4204 || J. Lang, Ed. || jplang@ieee.org +# RFC4205 || K. Kompella, Ed., Y. Rekhter, Ed. || kireeti@juniper.net, yakov@juniper.net +# RFC4206 || K. Kompella, Y. Rekhter || kireeti@juniper.net, yakov@juniper.net +# RFC4207 || J. Lang, D. Papadimitriou || jplang@ieee.org, dimitri.papadimitriou@alcatel.be +# RFC4208 || G. Swallow, J. Drake, H. Ishimatsu, Y. Rekhter || swallow@cisco.com, John.E.Drake2@boeing.com, hirokazu.ishimatsu@g1m.jp, yakov@juniper.net +# RFC4209 || A. Fredette, Ed., J. Lang, Ed. || Afredette@HatterasNetworks.com, jplang@ieee.org +# RFC4210 || C. Adams, S. Farrell, T. Kause, T. Mononen || cadams@site.uottawa.ca, stephen.farrell@cs.tcd.ie, toka@ssh.com, tmononen@safenet-inc.com +# RFC4211 || J. Schaad || jimsch@exmsft.com +# RFC4212 || M. Blinov, C. Adams || mikblinov@online.ie, cadams@site.uottawa.ca +# RFC4213 || E. Nordmark, R. Gilligan || erik.nordmark@sun.com, bob.gilligan@acm.org +# RFC4214 || F. Templin, T. Gleeson, M. Talwar, D. Thaler || fltemplin@acm.org, tgleeson@cisco.com, mohitt@microsoft.com, dthaler@microsoft.com +# RFC4215 || J. Wiljakka, Ed. || juha.wiljakka@nokia.com +# RFC4216 || R. Zhang, Ed., J.-P. Vasseur, Ed. || raymond_zhang@infonet.com, jpv@cisco.com +# RFC4217 || P. Ford-Hutchinson || rfc4217@ford-hutchinson.com +# RFC4218 || E. Nordmark, T. Li || erik.nordmark@sun.com, Tony.Li@tony.li +# RFC4219 || E. Lear || lear@cisco.com +# RFC4220 || M. Dubuc, T. Nadeau, J. Lang || mdubuc@ncf.ca, tnadeau@cisco.com, jplang@ieee.org +# RFC4221 || T. Nadeau, C. Srinivasan, A. Farrel || tnadeau@cisco.com, cheenu@bloomberg.net, adrian@olddog.co.uk +# RFC4222 || G. Choudhury, Ed. || gchoudhury@att.com +# RFC4223 || P. Savola || psavola@funet.fi +# RFC4224 || G. Pelletier, L-E. Jonsson, K. Sandlund || ghyslain.pelletier@ericsson.com, lars-erik.jonsson@ericsson.com, kristofer.sandlund@ericsson.com +# RFC4225 || P. Nikander, J. Arkko, T. Aura, G. Montenegro, E. Nordmark || pekka.nikander@nomadiclab.com, jari.arkko@ericsson.com, Tuomaura@microsoft.com, gabriel_montenegro_2000@yahoo.com, erik.nordmark@sun.com +# RFC4226 || D. M'Raihi, M. Bellare, F. Hoornaert, D. Naccache, O. Ranen || davidietf@gmail.com, mihir@cs.ucsd.edu, frh@vasco.com, david.naccache@gemplus.com, Ohad.Ranen@ealaddin.com +# RFC4227 || E. O'Tuathail, M. Rose || eamon.otuathail@clipcode.com, mrose17@gmail.com +# RFC4228 || A. Rousskov || rousskov@measurement-factory.com +# RFC4229 || M. Nottingham, J. Mogul || mnot@pobox.com, JeffMogul@acm.org +# RFC4230 || H. Tschofenig, R. Graveman || Hannes.Tschofenig@siemens.com, rfg@acm.org +# RFC4231 || M. Nystrom || magnus@rsasecurity.com +# RFC4233 || K. Morneault, S. Rengasami, M. Kalla, G. Sidebottom || kmorneau@cisco.com, mkalla@telcordia.com, selvam@trideaworks.com, greg@signatustechnologies.com +# RFC4234 || D. Crocker, Ed., P. Overell || dcrocker@bbiw.net, paul@bayleaf.org.uk +# RFC4235 || J. Rosenberg, H. Schulzrinne, R. Mahy, Ed. || jdrosen@cisco.com, schulzrinne@cs.columbia.edu, rohan@ekabal.com +# RFC4236 || A. Rousskov, M. Stecher || rousskov@measurement-factory.com, martin.stecher@webwasher.com +# RFC4237 || G. Vaudreuil || GregV@ieee.org +# RFC4238 || G. Vaudreuil || GregV@ieee.org +# RFC4239 || S. McRae, G. Parsons || stuart.mcrae@uk.ibm.com, gparsons@nortel.com +# RFC4240 || E. Burger, Ed., J. Van Dyke, A. Spitzer || eburger@brooktrout.com, jvandyke@brooktrout.com, woof@brooktrout.com +# RFC4241 || Y. Shirasaki, S. Miyakawa, T. Yamasaki, A. Takenouchi || yasuhiro@nttv6.jp, miyakawa@nttv6.jp, t.yamasaki@ntt.com, takenouchi.ayako@lab.ntt.co.jp +# RFC4242 || S. Venaas, T. Chown, B. Volz || venaas@uninett.no, tjc@ecs.soton.ac.uk, volz@cisco.com +# RFC4243 || M. Stapp, R. Johnson, T. Palaniappan || mjs@cisco.com, raj@cisco.com, athenmoz@cisco.com +# RFC4244 || M. Barnes, Ed. || mary.barnes@nortel.com +# RFC4245 || O. Levin, R. Even || oritl@microsoft.com, roni.even@polycom.co.il +# RFC4246 || M. Dolan || md.1@newtbt.com +# RFC4247 || J. Ash, B. Goode, J. Hand, R. Zhang || gash@att.com, bgoode@att.com, jameshand@att.com, raymond.zhang@bt.infonet.com +# RFC4248 || P. Hoffman || paul.hoffman@vpnc.org +# RFC4249 || B. Lilly || blilly@erols.com +# RFC4250 || S. Lehtinen, C. Lonvick, Ed. || sjl@ssh.com, clonvick@cisco.com +# RFC4251 || T. Ylonen, C. Lonvick, Ed. || ylo@ssh.com, clonvick@cisco.com +# RFC4252 || T. Ylonen, C. Lonvick, Ed. || ylo@ssh.com, clonvick@cisco.com +# RFC4253 || T. Ylonen, C. Lonvick, Ed. || ylo@ssh.com, clonvick@cisco.com +# RFC4254 || T. Ylonen, C. Lonvick, Ed. || ylo@ssh.com, clonvick@cisco.com +# RFC4255 || J. Schlyter, W. Griffin || jakob@openssh.com, wgriffin@sparta.com +# RFC4256 || F. Cusack, M. Forssen || frank@savecore.net, maf@appgate.com +# RFC4257 || G. Bernstein, E. Mannie, V. Sharma, E. Gray || gregb@grotto-networking.com, eric.mannie@perceval.net, v.sharma@ieee.org, Eric.Gray@Marconi.com +# RFC4258 || D. Brungard, Ed. || dbrungard@att.com +# RFC4259 || M.-J. Montpetit, G. Fairhurst, H. Clausen, B. Collini-Nocker, H. Linder || mmontpetit@motorola.com, gorry@erg.abdn.ac.uk, h.d.clausen@ieee.org, bnocker@cosy.sbg.ac.at, hlinder@cosy.sbg.ac.at +# RFC4260 || P. McCann || mccap@lucent.com +# RFC4261 || J. Walker, A. Kulkarni, Ed. || jesse.walker@intel.com, amol.kulkarni@intel.com +# RFC4262 || S. Santesson || stefans@microsoft.com +# RFC4263 || B. Lilly || blilly@erols.com +# RFC4264 || T. Griffin, G. Huston || Timothy.Griffin@cl.cam.ac.uk, gih@apnic.net +# RFC4265 || B. Schliesser, T. Nadeau || bensons@savvis.net, tnadeau@cisco.com +# RFC4266 || P. Hoffman || paul.hoffman@vpnc.org +# RFC4267 || M. Froumentin || mf@w3.org +# RFC4268 || S. Chisholm, D. Perkins || schishol@nortel.com, dperkins@snmpinfo.com +# RFC4269 || H.J. Lee, S.J. Lee, J.H. Yoon, D.H. Cheon, J.I. Lee || jiinii@kisa.or.kr, sjlee@kisa.or.kr, jhyoon@kisa.or.kr, dhcheon@mmaa.or.kr, jilee@kisa.or.kr +# RFC4270 || P. Hoffman, B. Schneier || paul.hoffman@vpnc.org, schneier@counterpane.com +# RFC4271 || Y. Rekhter, Ed., T. Li, Ed., S. Hares, Ed. || yakov@juniper.net, tony.li@tony.li, skh@nexthop.com +# RFC4272 || S. Murphy || Sandy@tislabs.com +# RFC4273 || J. Haas, Ed., S. Hares, Ed. || jhaas@nexthop.com, skh@nexthop.com +# RFC4274 || D. Meyer, K. Patel || dmm@1-4-5.net, keyupate@cisco.com +# RFC4275 || S. Hares, D. Hares || skh@nexthop.com, dhares@hickoryhill-consulting.com +# RFC4276 || S. Hares, A. Retana || skh@nexthop.com, aretana@cisco.com +# RFC4277 || D. McPherson, K. Patel || danny@arbor.net, keyupate@cisco.com +# RFC4278 || S. Bellovin, A. Zinin || bellovin@acm.org, zinin@psg.com +# RFC4279 || P. Eronen, Ed., H. Tschofenig, Ed. || pe@iki.fi, Hannes.Tschofenig@siemens.com +# RFC4280 || K. Chowdhury, P. Yegani, L. Madour || kchowdhury@starentnetworks.com, pyegani@cisco.com, Lila.Madour@ericsson.com +# RFC4281 || R. Gellens, D. Singer, P. Frojdh || randy@qualcomm.com, singer@apple.com, Per.Frojdh@ericsson.com +# RFC4282 || B. Aboba, M. Beadles, J. Arkko, P. Eronen || bernarda@microsoft.com, mbeadles@endforce.com, jari.arkko@ericsson.com, pe@iki.fi +# RFC4283 || A. Patel, K. Leung, M. Khalil, H. Akhtar, K. Chowdhury || alpesh@cisco.com, kleung@cisco.com, mkhalil@nortel.com, haseebak@nortel.com, kchowdhury@starentnetworks.com +# RFC4284 || F. Adrangi, V. Lortz, F. Bari, P. Eronen || farid.adrangi@intel.com, victor.lortz@intel.com, farooq.bari@cingular.com, pe@iki.fi +# RFC4285 || A. Patel, K. Leung, M. Khalil, H. Akhtar, K. Chowdhury || alpesh@cisco.com, kleung@cisco.com, mkhalil@nortel.com, haseebak@nortel.com, kchowdhury@starentnetworks.com +# RFC4286 || B. Haberman, J. Martin || brian@innovationslab.net, jim@netzwert.ag +# RFC4287 || M. Nottingham, Ed., R. Sayre, Ed. || mnot@pobox.com, rfsayre@boswijck.com +# RFC4288 || N. Freed, J. Klensin || ned.freed@mrochek.com, klensin+ietf@jck.com +# RFC4289 || N. Freed, J. Klensin || ned.freed@mrochek.com, klensin+ietf@jck.com +# RFC4290 || J. Klensin || john-ietf@jck.com +# RFC4291 || R. Hinden, S. Deering || bob.hinden@gmail.com +# RFC4292 || B. Haberman || brian@innovationslab.net +# RFC4293 || S. Routhier, Ed. || sar@iwl.com +# RFC4294 || J. Loughney, Ed. || john.loughney@nokia.com +# RFC4295 || G. Keeni, K. Koide, K. Nagami, S. Gundavelli || glenn@cysols.com, koide@shiratori.riec.tohoku.ac.jp, nagami@inetcore.com, sgundave@cisco.com +# RFC4296 || S. Bailey, T. Talpey || steph@sandburst.com, thomas.talpey@netapp.com +# RFC4297 || A. Romanow, J. Mogul, T. Talpey, S. Bailey || allyn@cisco.com, JeffMogul@acm.org, thomas.talpey@netapp.com, steph@sandburst.com +# RFC4298 || J.-H. Chen, W. Lee, J. Thyssen || rchen@broadcom.com, wlee@broadcom.com, jthyssen@broadcom.com +# RFC4301 || S. Kent, K. Seo || kent@bbn.com, kseo@bbn.com +# RFC4302 || S. Kent || kent@bbn.com +# RFC4303 || S. Kent || kent@bbn.com +# RFC4304 || S. Kent || kent@bbn.com +# RFC4305 || D. Eastlake 3rd || Donald.Eastlake@Motorola.com +# RFC4306 || C. Kaufman, Ed. || charliek@microsoft.com +# RFC4307 || J. Schiller || jis@mit.edu +# RFC4308 || P. Hoffman || paul.hoffman@vpnc.org +# RFC4309 || R. Housley || housley@vigilsec.com +# RFC4310 || S. Hollenbeck || shollenbeck@verisign.com +# RFC4311 || R. Hinden, D. Thaler || bob.hinden@gmail.com, dthaler@microsoft.com +# RFC4312 || A. Kato, S. Moriai, M. Kanda || akato@po.ntts.co.jp, shiho@rd.scei.sony.co.jp, kanda@isl.ntt.co.jp +# RFC4313 || D. Oran || oran@cisco.com +# RFC4314 || A. Melnikov || alexey.melnikov@isode.com +# RFC4315 || M. Crispin || MRC@CAC.Washington.EDU +# RFC4316 || J. Reschke || julian.reschke@greenbytes.de +# RFC4317 || A. Johnston, R. Sparks || ajohnston@tello.com, rjsparks@estacado.net +# RFC4318 || D. Levi, D. Harrington || dlevi@nortel.com, ietfdbh@comcast.net +# RFC4319 || C. Sikes, B. Ray, R. Abbi || csikes@zhone.com, rray@pesa.com, Rajesh.Abbi@alcatel.com +# RFC4320 || R. Sparks || rjsparks@estacado.net +# RFC4321 || R. Sparks || rjsparks@estacado.net +# RFC4322 || M. Richardson, D.H. Redelmeier || mcr@sandelman.ottawa.on.ca, hugh@mimosa.com +# RFC4323 || M. Patrick, W. Murwin || michael.patrick@motorola.com, w.murwin@motorola.com +# RFC4324 || D. Royer, G. Babics, S. Mansour || Doug@IntelliCal.com, george.babics@oracle.com, smansour@ebay.com +# RFC4325 || S. Santesson, R. Housley || stefans@microsoft.com, housley@vigilsec.com +# RFC4326 || G. Fairhurst, B. Collini-Nocker || gorry@erg.abdn.ac.uk, bnocker@cosy.sbg.ac.at +# RFC4327 || M. Dubuc, T. Nadeau, J. Lang, E. McGinnis || dubuc.consulting@sympatico.ca, tnadeau@cisco.com, jplang@ieee.org, emcginnis@hammerheadsystems.com +# RFC4328 || D. Papadimitriou, Ed. || dimitri.papadimitriou@alcatel.be +# RFC4329 || B. Hoehrmann || bjoern@hoehrmann.de +# RFC4330 || D. Mills || mills@udel.edu +# RFC4331 || B. Korver, L. Dusseault || briank@networkresonance.com, lisa.dusseault@gmail.com +# RFC4332 || K. Leung, A. Patel, G. Tsirtsis, E. Klovning || kleung@cisco.com, alpesh@cisco.com, g.tsirtsis@flarion.com, espen@birdstep.com +# RFC4333 || G. Huston, Ed., B. Wijnen, Ed. || gih@apnic.net, bwijnen@lucent.com +# RFC4334 || R. Housley, T. Moore || housley@vigilsec.com, timmoore@microsoft.com +# RFC4335 || J. Galbraith, P. Remaker || galb-list@vandyke.com, remaker@cisco.com +# RFC4336 || S. Floyd, M. Handley, E. Kohler || floyd@icir.org, M.Handley@cs.ucl.ac.uk, kohler@cs.ucla.edu +# RFC4337 || Y Lim, D. Singer || young@netntv.co.kr, singer@apple.com +# RFC4338 || C. DeSanti, C. Carlson, R. Nixon || cds@cisco.com, craig.carlson@qlogic.com, bob.nixon@emulex.com +# RFC4339 || J. Jeong, Ed. || jjeong@cs.umn.edu +# RFC4340 || E. Kohler, M. Handley, S. Floyd || kohler@cs.ucla.edu, M.Handley@cs.ucl.ac.uk, floyd@icir.org +# RFC4341 || S. Floyd, E. Kohler || floyd@icir.org, kohler@cs.ucla.edu +# RFC4342 || S. Floyd, E. Kohler, J. Padhye || floyd@icir.org, kohler@cs.ucla.edu, padhye@microsoft.com +# RFC4343 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC4344 || M. Bellare, T. Kohno, C. Namprempre || mihir@cs.ucsd.edu, tkohno@cs.ucsd.edu, meaw@alum.mit.edu +# RFC4345 || B. Harris || bjh21@bjh21.me.uk +# RFC4346 || T. Dierks, E. Rescorla || tim@dierks.org, ekr@rtfm.com +# RFC4347 || E. Rescorla, N. Modadugu || ekr@rtfm.com, nagendra@cs.stanford.edu +# RFC4348 || S. Ahmadi || sassan.ahmadi@ieee.org +# RFC4349 || C. Pignataro, M. Townsley || cpignata@cisco.com, mark@townsley.net +# RFC4350 || F. Hendrikx, C. Wallis || ferry.hendrikx@ssc.govt.nz, colin.wallis@ssc.govt.nz +# RFC4351 || G. Hellstrom, P. Jones || gunnar.hellstrom@omnitor.se, paulej@packetizer.com +# RFC4352 || J. Sjoberg, M. Westerlund, A. Lakaniemi, S. Wenger || Johan.Sjoberg@ericsson.com, Magnus.Westerlund@ericsson.com, ari.lakaniemi@nokia.com, Stephan.Wenger@nokia.com +# RFC4353 || J. Rosenberg || jdrosen@cisco.com +# RFC4354 || M. Garcia-Martin || miguel.an.garcia@nokia.com +# RFC4355 || R. Brandner, L. Conroy, R. Stastny || rudolf.brandner@siemens.com, lwc@roke.co.uk, Richard.stastny@oefeg.at +# RFC4356 || R. Gellens || randy@qualcomm.com +# RFC4357 || V. Popov, I. Kurepkin, S. Leontiev || vpopov@cryptopro.ru, kure@cryptopro.ru, lse@cryptopro.ru +# RFC4358 || D. Smith || dwight.smith@motorola.com +# RFC4359 || B. Weis || bew@cisco.com +# RFC4360 || S. Sangli, D. Tappan, Y. Rekhter || rsrihari@cisco.com, tappan@cisco.com, yakov@juniper.net +# RFC4361 || T. Lemon, B. Sommerfeld || mellon@nominum.com, sommerfeld@sun.com +# RFC4362 || L-E. Jonsson, G. Pelletier, K. Sandlund || lars-erik.jonsson@ericsson.com, ghyslain.pelletier@ericsson.com, kristofer.sandlund@ericsson.com +# RFC4363 || D. Levi, D. Harrington || dlevi@nortel.com, ietfdbh@comcast.net +# RFC4364 || E. Rosen, Y. Rekhter || erosen@cisco.com, yakov@juniper.net +# RFC4365 || E. Rosen || erosen@cisco.com +# RFC4366 || S. Blake-Wilson, M. Nystrom, D. Hopwood, J. Mikkelsen, T. Wright || sblakewilson@bcisse.com, magnus@rsasecurity.com, david.hopwood@blueyonder.co.uk, janm@transactionware.com, timothy.wright@vodafone.com +# RFC4367 || J. Rosenberg, Ed., IAB || jdrosen@cisco.com +# RFC4368 || T. Nadeau, S. Hegde || tnadeau@cisco.com, subrah@cisco.com +# RFC4369 || K. Gibbons, C. Monia, J. Tseng, F. Travostino || kevin.gibbons@mcdata.com, charles_monia@yahoo.com, joshtseng@yahoo.com, travos@nortel.com +# RFC4370 || R. Weltman || robw@worldspot.com +# RFC4371 || B. Carpenter, Ed., L. Lynch, Ed. || brc@zurich.ibm.com, llynch@darkwing.uoregon.edu +# RFC4372 || F. Adrangi, A. Lior, J. Korhonen, J. Loughney || farid.adrangi@intel.com, avi@bridgewatersystems.com, jouni.korhonen@teliasonera.com, john.loughney@nokia.com +# RFC4373 || R. Harrison, J. Sermersheim, Y. Dong || rharrison@novell.com, jimse@novell.com, yulindong@gmail.com +# RFC4374 || G. McCobb || mccobb@us.ibm.com +# RFC4375 || K. Carlberg || carlberg@g11.org.uk +# RFC4376 || P. Koskelainen, J. Ott, H. Schulzrinne, X. Wu || petri.koskelainen@nokia.com, jo@netlab.hut.fi, hgs@cs.columbia.edu, xiaotaow@cs.columbia.edu +# RFC4377 || T. Nadeau, M. Morrow, G. Swallow, D. Allan, S. Matsushima || tnadeau@cisco.com, mmorrow@cisco.com, swallow@cisco.com, dallan@nortel.com, satoru@ft.solteria.net +# RFC4378 || D. Allan, Ed., T. Nadeau, Ed. || dallan@nortel.com, tnadeau@cisco.com +# RFC4379 || K. Kompella, G. Swallow || kireeti@juniper.net, swallow@cisco.com +# RFC4380 || C. Huitema || huitema@microsoft.com +# RFC4381 || M. Behringer || mbehring@cisco.com +# RFC4382 || T. Nadeau, Ed., H. van der Linde, Ed. || tnadeau@cisco.com, havander@cisco.com +# RFC4383 || M. Baugher, E. Carrara || mbaugher@cisco.com, carrara@kth.se +# RFC4384 || D. Meyer || dmm@1-4-5.net +# RFC4385 || S. Bryant, G. Swallow, L. Martini, D. McPherson || stbryant@cisco.com, swallow@cisco.com, lmartini@cisco.com, danny@arbor.net +# RFC4386 || S. Boeyen, P. Hallam-Baker || sharon.boeyen@entrust.com, pbaker@VeriSign.com +# RFC4387 || P. Gutmann, Ed. || pgut001@cs.auckland.ac.nz +# RFC4388 || R. Woundy, K. Kinnear || richard_woundy@cable.comcast.com, kkinnear@cisco.com +# RFC4389 || D. Thaler, M. Talwar, C. Patel || dthaler@microsoft.com, mohitt@microsoft.com, chirayu@chirayu.org +# RFC4390 || V. Kashyap || vivk@us.ibm.com +# RFC4391 || J. Chu, V. Kashyap || jerry.chu@sun.com, vivk@us.ibm.com +# RFC4392 || V. Kashyap || vivk@us.ibm.com +# RFC4393 || H. Garudadri || hgarudadri@qualcomm.com +# RFC4394 || D. Fedyk, O. Aboul-Magd, D. Brungard, J. Lang, D. Papadimitriou || dwfedyk@nortel.com, osama@nortel.com, dbrungard@att.com, jplang@ieee.org, dimitri.papadimitriou@alcatel.be +# RFC4395 || T. Hansen, T. Hardie, L. Masinter || tony+urireg@maillennium.att.com, hardie@qualcomm.com, LMM@acm.org +# RFC4396 || J. Rey, Y. Matsui || jose.rey@eu.panasonic.com, matsui.yoshinori@jp.panasonic.com +# RFC4397 || I. Bryskin, A. Farrel || i_bryskin@yahoo.com, adrian@olddog.co.uk +# RFC4398 || S. Josefsson || simon@josefsson.org +# RFC4401 || N. Williams || Nicolas.Williams@sun.com +# RFC4402 || N. Williams || Nicolas.Williams@sun.com +# RFC4403 || B. Bergeson, K. Boogert, V. Nanjundaswamy || bruce.bergeson@novell.com, kent.boogert@novell.com, vijay.nanjundaswamy@oracle.com +# RFC4404 || R. Natarajan, A. Rijhsinghani || anil@charter.net, r.natarajan@f5.com +# RFC4405 || E. Allman, H. Katz || eric@sendmail.com, hkatz@microsoft.com +# RFC4406 || J. Lyon, M. Wong || jimlyon@microsoft.com, mengwong@dumbo.pobox.com +# RFC4407 || J. Lyon || jimlyon@microsoft.com +# RFC4408 || M. Wong, W. Schlitt || mengwong+spf@pobox.com, wayne@schlitt.net +# RFC4409 || R. Gellens, J. Klensin || g+ietf@qualcomm.com, john+ietf@jck.com +# RFC4410 || M. Pullen, F. Zhao, D. Cohen || mpullen@gmu.edu, fzhao@netlab.gmu.edu, danny.cohen@sun.com +# RFC4411 || J. Polk || jmpolk@cisco.com +# RFC4412 || H. Schulzrinne, J. Polk || hgs@cs.columbia.edu, jmpolk@cisco.com +# RFC4413 || M. West, S. McCann || mark.a.west@roke.co.uk, stephen.mccann@roke.co.uk +# RFC4414 || A. Newton || andy@hxr.us +# RFC4415 || R. Brandner, L. Conroy, R. Stastny || rudolf.brandner@siemens.com, lwc@roke.co.uk, Richard.stastny@oefeg.at +# RFC4416 || J. Wong, Ed. || j.k.wong@sympatico.ca +# RFC4417 || P. Resnick, Ed., P. Saint-Andre, Ed. || presnick@qti.qualcomm.com, ietf@stpeter.im +# RFC4418 || T. Krovetz, Ed. || tdk@acm.org +# RFC4419 || M. Friedl, N. Provos, W. Simpson || markus@openbsd.org, provos@citi.umich.edu, wsimpson@greendragon.com +# RFC4420 || A. Farrel, Ed., D. Papadimitriou, J.-P. Vasseur, A. Ayyangar || adrian@olddog.co.uk, dimitri.papadimitriou@alcatel.be, jpv@cisco.com, arthi@juniper.net +# RFC4421 || C. Perkins || csp@csperkins.org +# RFC4422 || A. Melnikov, Ed., K. Zeilenga, Ed. || Alexey.Melnikov@isode.com, Kurt@OpenLDAP.org +# RFC4423 || R. Moskowitz, P. Nikander || rgm@icsalabs.com, pekka.nikander@nomadiclab.com +# RFC4424 || S. Ahmadi || sassan.ahmadi@ieee.org +# RFC4425 || A. Klemets || Anders.Klemets@microsoft.com +# RFC4426 || J. Lang, Ed., B. Rajagopalan, Ed., D. Papadimitriou, Ed. || jplang@ieee.org, balar@microsoft.com, dimitri.papadimitriou@alcatel.be +# RFC4427 || E. Mannie, Ed., D. Papadimitriou, Ed. || eric.mannie@perceval.net, dimitri.papadimitriou@alcatel.be +# RFC4428 || D. Papadimitriou, Ed., E. Mannie, Ed. || dimitri.papadimitriou@alcatel.be, eric.mannie@perceval.net +# RFC4429 || N. Moore || sharkey@zoic.org +# RFC4430 || S. Sakane, K. Kamada, M. Thomas, J. Vilhuber || Shouichi.Sakane@jp.yokogawa.com, Ken-ichi.Kamada@jp.yokogawa.com, mat@cisco.com, vilhuber@cisco.com +# RFC4431 || M. Andrews, S. Weiler || Mark_Andrews@isc.org, weiler@tislabs.com +# RFC4432 || B. Harris || bjh21@bjh21.me.uk +# RFC4433 || M. Kulkarni, A. Patel, K. Leung || mkulkarn@cisco.com, alpesh@cisco.com, kleung@cisco.com +# RFC4434 || P. Hoffman || paul.hoffman@vpnc.org +# RFC4435 || Y. Nomura, R. Walsh, J-P. Luoma, H. Asaeda, H. Schulzrinne || nom@flab.fujitsu.co.jp, rod.walsh@nokia.com, juha-pekka.luoma@nokia.com, asaeda@wide.ad.jp, schulzrinne@cs.columbia.edu +# RFC4436 || B. Aboba, J. Carlson, S. Cheshire || bernarda@microsoft.com, james.d.carlson@sun.com, rfc@stuartcheshire.org +# RFC4437 || J. Whitehead, G. Clemm, J. Reschke, Ed. || ejw@cse.ucsc.edu, julian.reschke@greenbytes.degeoffrey.clemm@us.ibm.com, +# RFC4438 || C. DeSanti, V. Gaonkar, H.K. Vivek, K. McCloghrie, S. Gai || cds@cisco.com, vgaonkar@cisco.com, hvivek@cisco.com, kzm@cisco.com, none +# RFC4439 || C. DeSanti, V. Gaonkar, K. McCloghrie, S. Gai || cds@cisco.com, vgaonkar@cisco.com, kzm@cisco.com, none +# RFC4440 || S. Floyd, Ed., V. Paxson, Ed., A. Falk, Ed., IAB || floyd@acm.org, vern@icir.org, falk@isi.edu +# RFC4441 || B. Aboba, Ed. || bernarda@microsoft.com +# RFC4442 || S. Fries, H. Tschofenig || steffen.fries@siemens.com, Hannes.Tschofenig@siemens.com +# RFC4443 || A. Conta, S. Deering, M. Gupta, Ed. || aconta@txc.com, none, mukesh.gupta@tropos.com +# RFC4444 || J. Parker, Ed. || jeffp@middlebury.edu +# RFC4445 || J. Welch, J. Clark || Jim.Welch@ineoquest.com, jiclark@cisco.com +# RFC4446 || L. Martini || lmartini@cisco.com +# RFC4447 || L. Martini, Ed., E. Rosen, N. El-Aawar, T. Smith, G. Heron || lmartini@cisco.com, nna@level3.net, giles.heron@tellabs.com, erosen@cisco.com, tob@netapp.com +# RFC4448 || L. Martini, Ed., E. Rosen, N. El-Aawar, G. Heron || lmartini@cisco.com, nna@level3.net, giles.heron@tellabs.com, erosen@cisco.com +# RFC4449 || C. Perkins || charles.perkins@nokia.com +# RFC4450 || E. Lear, H. Alvestrand || lear@cisco.com, harald@alvestrand.no +# RFC4451 || D. McPherson, V. Gill || danny@arbor.net, VijayGill9@aol.com +# RFC4452 || H. Van de Sompel, T. Hammond, E. Neylon, S. Weibel || herbertv@lanl.gov, t.hammond@nature.com, eneylon@manifestsolutions.com, weibel@oclc.org +# RFC4453 || J. Rosenberg, G. Camarillo, Ed., D. Willis || jdrosen@cisco.com, Gonzalo.Camarillo@ericsson.com, dean.willis@softarmor.com +# RFC4454 || S. Singh, M. Townsley, C. Pignataro || sanjeevs@cisco.com, mark@townsley.net, cpignata@cisco.com +# RFC4455 || M. Hallak-Stamler, M. Bakke, Y. Lederman, M. Krueger, K. McCloghrie || michele@sanrad.com, mbakke@cisco.com, yaronled@bezeqint.net, marjorie_krueger@hp.com, kzm@cisco.com +# RFC4456 || T. Bates, E. Chen, R. Chandra || tbates@cisco.com, enkechen@cisco.com, rchandra@sonoasystems.com +# RFC4457 || G. Camarillo, G. Blanco || Gonzalo.Camarillo@ericsson.com, german.blanco@ericsson.com +# RFC4458 || C. Jennings, F. Audet, J. Elwell || fluffy@cisco.com, audet@nortel.com, john.elwell@siemens.com +# RFC4459 || P. Savola || psavola@funet.fi +# RFC4460 || R. Stewart, I. Arias-Rodriguez, K. Poon, A. Caro, M. Tuexen || randall@lakerest.net, ivan.arias-rodriguez@nokia.com, kacheong.poon@sun.com, acaro@bbn.com, tuexen@fh-muenster.de +# RFC4461 || S. Yasukawa, Ed. || yasukawa.seisho@lab.ntt.co.jp +# RFC4462 || J. Hutzelman, J. Salowey, J. Galbraith, V. Welch || jhutz+@cmu.edu, jsalowey@cisco.com, galb@vandyke.com, welch@mcs.anl.gov +# RFC4463 || S. Shanmugham, P. Monaco, B. Eberman || sarvi@cisco.com, peter.monaco@nuasis.com, brian.eberman@speechworks.com +# RFC4464 || A. Surtees, M. West || abigail.surtees@roke.co.uk, mark.a.west@roke.co.uk +# RFC4465 || A. Surtees, M. West || abigail.surtees@roke.co.uk, mark.a.west@roke.co.uk +# RFC4466 || A. Melnikov, C. Daboo || Alexey.Melnikov@isode.com, cyrus@daboo.name +# RFC4467 || M. Crispin || MRC@CAC.Washington.EDU +# RFC4468 || C. Newman || chris.newman@sun.com +# RFC4469 || P. Resnick || presnick@qti.qualcomm.com +# RFC4470 || S. Weiler, J. Ihren || weiler@tislabs.com, johani@autonomica.se +# RFC4471 || G. Sisson, B. Laurie || geoff@nominet.org.uk, ben@algroup.co.uk +# RFC4472 || A. Durand, J. Ihren, P. Savola || Alain_Durand@cable.comcast.com, johani@autonomica.se, psavola@funet.fi +# RFC4473 || Y. Nomura, R. Walsh, J-P. Luoma, J. Ott, H. Schulzrinne || nom@flab.fujitsu.co.jp, rod.walsh@nokia.com, juha-pekka.luoma@nokia.com, jo@netlab.tkk.fi, schulzrinne@cs.columbia.edu +# RFC4474 || J. Peterson, C. Jennings || jon.peterson@neustar.biz, fluffy@cisco.com +# RFC4475 || R. Sparks, Ed., A. Hawrylyshen, A. Johnston, J. Rosenberg, H. Schulzrinne || RjS@estacado.net, ahawrylyshen@ditechnetworks.com, alan@sipstation.com, jdrosen@cisco.com, hgs@cs.columbia.edu +# RFC4476 || C. Francis, D. Pinkas || Chris_S_Francis@Raytheon.com, Denis.Pinkas@bull.net +# RFC4477 || T. Chown, S. Venaas, C. Strauf || tjc@ecs.soton.ac.uk, venaas@uninett.no, strauf@rz.tu-clausthal.de +# RFC4478 || Y. Nir || ynir@checkpoint.com +# RFC4479 || J. Rosenberg || jdrosen@cisco.com +# RFC4480 || H. Schulzrinne, V. Gurbani, P. Kyzivat, J. Rosenberg || hgs+simple@cs.columbia.edu, vkg@lucent.com, pkyzivat@cisco.com, jdrosen@cisco.com +# RFC4481 || H. Schulzrinne || hgs+simple@cs.columbia.edu +# RFC4482 || H. Schulzrinne || hgs+simple@cs.columbia.edu +# RFC4483 || E. Burger, Ed. || eburger@cantata.com +# RFC4484 || J. Peterson, J. Polk, D. Sicker, H. Tschofenig || jon.peterson@neustar.biz, jmpolk@cisco.com, douglas.sicker@colorado.edu, Hannes.Tschofenig@siemens.com +# RFC4485 || J. Rosenberg, H. Schulzrinne || jdrosen@cisco.com, schulzrinne@cs.columbia.edu +# RFC4486 || E. Chen, V. Gillet || enkechen@cisco.com, vgi@opentransit.net +# RFC4487 || F. Le, S. Faccin, B. Patil, H. Tschofenig || franckle@cmu.edu, sfaccinstd@gmail.com, Basavaraj.Patil@nokia.com, Hannes.Tschofenig@siemens.com +# RFC4488 || O. Levin || oritl@microsoft.com +# RFC4489 || J-S. Park, M-K. Shin, H-J. Kim || pjs@etri.re.kr, myungki.shin@gmail.com, khj@etri.re.kr +# RFC4490 || S. Leontiev, Ed., G. Chudov, Ed. || lse@cryptopro.ru, chudov@cryptopro.ru +# RFC4491 || S. Leontiev, Ed., D. Shefanovski, Ed. || lse@cryptopro.ru, dbs@mts.ru +# RFC4492 || S. Blake-Wilson, N. Bolyard, V. Gupta, C. Hawk, B. Moeller || sblakewilson@safenet-inc.com, nelson@bolyard.com, vipul.gupta@sun.com, chris@corriente.net, bodo@openssl.org +# RFC4493 || JH. Song, R. Poovendran, J. Lee, T. Iwata || songlee@ee.washington.edu, radha@ee.washington.edu, icheol.lee@samsung.com, iwata@cse.nagoya-u.ac.jp +# RFC4494 || JH. Song, R. Poovendran, J. Lee || songlee@ee.washington.edu, radha@ee.washington.edu, jicheol.lee@samsung.com +# RFC4495 || J. Polk, S. Dhesikan || jmpolk@cisco.com, sdhesika@cisco.com +# RFC4496 || M. Stecher, A. Barbir || martin.stecher@webwasher.com, abbieb@nortel.com +# RFC4497 || J. Elwell, F. Derks, P. Mourot, O. Rousseau || john.elwell@siemens.com, frank.derks@nec-philips.com, Patrick.Mourot@alcatel.fr, Olivier.Rousseau@alcatel.fr +# RFC4498 || G. Keeni || glenn@cysols.com +# RFC4501 || S. Josefsson || simon@josefsson.org +# RFC4502 || S. Waldbusser || waldbusser@nextbeacon.com +# RFC4503 || M. Boesgaard, M. Vesterager, E. Zenner || mab@cryptico.com, mvp@cryptico.com, ez@cryptico.com +# RFC4504 || H. Sinnreich, Ed., S. Lass, C. Stredicke || henry@pulver.com, steven.lass@verizonbusiness.com, cs@snom.de +# RFC4505 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4506 || M. Eisler, Ed. || email2mre-rfc4506@yahoo.com +# RFC4507 || J. Salowey, H. Zhou, P. Eronen, H. Tschofenig || jsalowey@cisco.com, hzhou@cisco.com, pe@iki.fi, Hannes.Tschofenig@siemens.com +# RFC4508 || O. Levin, A. Johnston || oritl@microsoft.com, ajohnston@ipstation.com +# RFC4509 || W. Hardaker || hardaker@tislabs.com +# RFC4510 || K. Zeilenga, Ed. || Kurt@OpenLDAP.org +# RFC4511 || J. Sermersheim, Ed. || jimse@novell.com +# RFC4512 || K. Zeilenga, Ed. || Kurt@OpenLDAP.org +# RFC4513 || R. Harrison, Ed. || roger_harrison@novell.com +# RFC4514 || K. Zeilenga, Ed. || Kurt@OpenLDAP.org +# RFC4515 || M. Smith, Ed., T. Howes || mcs@pearlcrescent.com, howes@opsware.com +# RFC4516 || M. Smith, Ed., T. Howes || mcs@pearlcrescent.com, howes@opsware.com +# RFC4517 || S. Legg, Ed. || steven.legg@eb2bcom.com +# RFC4518 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4519 || A. Sciberras, Ed. || andrew.sciberras@eb2bcom.com +# RFC4520 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4521 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4522 || S. Legg || steven.legg@eb2bcom.com +# RFC4523 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4524 || K. Zeilenga, Ed. || Kurt@OpenLDAP.org +# RFC4525 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4526 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4527 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4528 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4529 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4530 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4531 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4532 || K. Zeilenga || Kurt@OpenLDAP.org +# RFC4533 || K. Zeilenga, J.H. Choi || Kurt@OpenLDAP.org, jongchoi@us.ibm.com +# RFC4534 || A Colegrove, H Harney || acc@sparta.com, hh@sparta.com +# RFC4535 || H. Harney, U. Meth, A. Colegrove, G. Gross || hh@sparta.com, umeth@sparta.com, acc@sparta.com, gmgross@identaware.com +# RFC4536 || P. Hoschka || ph@w3.org +# RFC4537 || L. Zhu, P. Leach, K. Jaganathan || lzhu@microsoft.com, paulle@microsoft.com, karthikj@microsoft.com +# RFC4538 || J. Rosenberg || jdrosen@cisco.com +# RFC4539 || T. Edwards || tedwards@pbs.org +# RFC4540 || M. Stiemerling, J. Quittek, C. Cadar || stiemerling@netlab.nec.de, quittek@netlab.nec.de, ccadar2@yahoo.com +# RFC4541 || M. Christensen, K. Kimball, F. Solensky || mjc@tt.dk, karen.kimball@hp.com, frank.solensky@calix.com +# RFC4542 || F. Baker, J. Polk || fred@cisco.com, jmpolk@cisco.com +# RFC4543 || D. McGrew, J. Viega || mcgrew@cisco.com, viega@list.org +# RFC4544 || M. Bakke, M. Krueger, T. McSweeney, J. Muchow || mbakke@cisco.com, marjorie_krueger@hp.com, tommcs@us.ibm.com, james.muchow@qlogic.com +# RFC4545 || M. Bakke, J. Muchow || mbakke@cisco.com, james.muchow@qlogic.com +# RFC4546 || D. Raftus, E. Cardona || david.raftus@ati.com, e.cardona@cablelabs.com +# RFC4547 || A. Ahmad, G. Nakanishi || azlina@cisco.com, gnakanishi@motorola.com +# RFC4548 || E. Gray, J. Rutemiller, G. Swallow || Eric.Gray@Marconi.com, John.Rutemiller@Marconi.com, swallow@cisco.com +# RFC4549 || A. Melnikov, Ed. || alexey.melnikov@isode.com +# RFC4550 || S. Maes, A. Melnikov || stephane.maes@oracle.com, Alexey.melnikov@isode.com +# RFC4551 || A. Melnikov, S. Hole || Alexey.Melnikov@isode.com, Steve.Hole@messagingdirect.com +# RFC4552 || M. Gupta, N. Melam || mukesh.gupta@tropos.com, nmelam@juniper.net +# RFC4553 || A. Vainshtein, Ed., YJ. Stein, Ed. || sasha@axerra.com, yaakov_s@rad.com +# RFC4554 || T. Chown || tjc@ecs.soton.ac.uk +# RFC4555 || P. Eronen || pe@iki.fi +# RFC4556 || L. Zhu, B. Tung || lzhu@microsoft.com, brian@aero.org +# RFC4557 || L. Zhu, K. Jaganathan, N. Williams || lzhu@microsoft.com, karthikj@microsoft.com, Nicolas.Williams@sun.com +# RFC4558 || Z. Ali, R. Rahman, D. Prairie, D. Papadimitriou || zali@cisco.com, rrahman@cisco.com, dprairie@cisco.com, dimitri.papadimitriou@alcatel.be +# RFC4559 || K. Jaganathan, L. Zhu, J. Brezak || karthikj@microsoft.com, lzhu@microsoft.com, jbrezak@microsoft.com +# RFC4560 || J. Quittek, Ed., K. White, Ed. || quittek@netlab.nec.de, wkenneth@us.ibm.com +# RFC4561 || J.-P. Vasseur, Ed., Z. Ali, S. Sivabalan || jpv@cisco.com, zali@cisco.com, msiva@cisco.com +# RFC4562 || T. Melsen, S. Blake || Torben.Melsen@ericsson.com, steven.blake@ericsson.com +# RFC4563 || E. Carrara, V. Lehtovirta, K. Norrman || carrara@kth.se, vesa.lehtovirta@ericsson.com, karl.norrman@ericsson.com +# RFC4564 || S. Govindan, Ed., H. Cheng, ZH. Yao, WH. Zhou, L. Yang || saravanan.govindan@sg.panasonic.com, hong.cheng@sg.panasonic.com, yaoth@huawei.com, zhouwenhui@chinamobile.com, lily.l.yang@intel.com +# RFC4565 || D. Loher, D. Nelson, O. Volinsky, B. Sarikaya || dplore@gmail.com, dnelson@enterasys.com, ovolinsky@colubris.com, sarikaya@ieee.org +# RFC4566 || M. Handley, V. Jacobson, C. Perkins || M.Handley@cs.ucl.ac.uk, van@packetdesign.com, csp@csperkins.org +# RFC4567 || J. Arkko, F. Lindholm, M. Naslund, K. Norrman, E. Carrara || jari.arkko@ericsson.com, fredrik.lindholm@ericsson.com, mats.naslund@ericsson.com, karl.norrman@ericsson.com, carrara@kth.se +# RFC4568 || F. Andreasen, M. Baugher, D. Wing || fandreas@cisco.com, mbaugher@cisco.com, dwing-ietf@fuggles.com +# RFC4569 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC4570 || B. Quinn, R. Finlayson || rcq@boxnarrow.com, finlayson@live555.com +# RFC4571 || J. Lazzaro || lazzaro@cs.berkeley.edu +# RFC4572 || J. Lennox || lennox@cs.columbia.edu +# RFC4573 || R. Even, A. Lochbaum || roni.even@polycom.co.il, alochbaum@polycom.com +# RFC4574 || O. Levin, G. Camarillo || oritl@microsoft.com, Gonzalo.Camarillo@ericsson.com +# RFC4575 || J. Rosenberg, H. Schulzrinne, O. Levin, Ed. || jdrosen@cisco.com, schulzrinne@cs.columbia.edu, oritl@microsoft.com +# RFC4576 || E. Rosen, P. Psenak, P. Pillay-Esnault || erosen@cisco.com, ppsenak@cisco.com, ppe@cisco.com +# RFC4577 || E. Rosen, P. Psenak, P. Pillay-Esnault || erosen@cisco.com, ppsenak@cisco.com, ppe@cisco.com +# RFC4578 || M. Johnston, S. Venaas, Ed. || michael.johnston@intel.com, venaas@uninett.no +# RFC4579 || A. Johnston, O. Levin || alan@sipstation.com, oritl@microsoft.com +# RFC4580 || B. Volz || volz@cisco.com +# RFC4581 || M. Bagnulo, J. Arkko || marcelo@it.uc3m.es, jari.arkko@ericsson.com +# RFC4582 || G. Camarillo, J. Ott, K. Drage || Gonzalo.Camarillo@ericsson.com, jo@netlab.hut.fi, drage@lucent.com +# RFC4583 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC4584 || S. Chakrabarti, E. Nordmark || samitac2@gmail.com, erik.nordmark@sun.com +# RFC4585 || J. Ott, S. Wenger, N. Sato, C. Burmeister, J. Rey || jo@acm.org, stewe@stewe.org, sato652@oki.com, carsten.burmeister@eu.panasonic.com, jose.rey@eu.panasonic.com +# RFC4586 || C. Burmeister, R. Hakenberg, A. Miyazaki, J. Ott, N. Sato, S. Fukunaga || carsten.burmeister@eu.panasonic.com, rolf.hakenberg@eu.panasonic.com, miyazaki.akihiro@jp.panasonic.com, jo@acm.org, sato652@oki.com, fukunaga444@oki.com +# RFC4587 || R. Even || roni.even@polycom.co.il +# RFC4588 || J. Rey, D. Leon, A. Miyazaki, V. Varsa, R. Hakenberg || jose.rey@eu.panasonic.com, davidleon123@yahoo.com, miyazaki.akihiro@jp.panasonic.com, viktor.varsa@nokia.com, rolf.hakenberg@eu.panasonic.com +# RFC4589 || H. Schulzrinne, H. Tschofenig || schulzrinne@cs.columbia.edu, Hannes.Tschofenig@siemens.com +# RFC4590 || B. Sterman, D. Sadolevsky, D. Schwartz, D. Williams, W. Beck || baruch@kayote.com, dscreat@dscreat.com, david@kayote.com, dwilli@cisco.com, beckw@t-systems.com +# RFC4591 || M. Townsley, G. Wilkie, S. Booth, S. Bryant, J. Lau || mark@townsley.net, gwilkie@cisco.com, jebooth@cisco.com, stbryant@cisco.com, jedlau@gmail.com +# RFC4592 || E. Lewis || ed.lewis@neustar.biz +# RFC4593 || A. Barbir, S. Murphy, Y. Yang || abbieb@nortel.com, sandy@sparta.com, yiya@cisco.com +# RFC4594 || J. Babiarz, K. Chan, F. Baker || babiarz@nortel.com, khchan@nortel.com, fred@cisco.com +# RFC4595 || F. Maino, D. Black || fmaino@cisco.com, black_david@emc.com +# RFC4596 || J. Rosenberg, P. Kyzivat || jdrosen@cisco.com, pkyzivat@cisco.com +# RFC4597 || R. Even, N. Ismail || roni.even@polycom.co.il, nismail@cisco.com +# RFC4598 || B. Link || bdl@dolby.com +# RFC4601 || B. Fenner, M. Handley, H. Holbrook, I. Kouvelas || fenner@research.att.com, M.Handley@cs.ucl.ac.uk, holbrook@arastra.com, kouvelas@cisco.com +# RFC4602 || T. Pusateri || pusateri@juniper.net +# RFC4603 || G. Zorn, G. Weber, R. Foltak || gwz@cisco.com, gdweber@cisco.com, rfoltak@cisco.com +# RFC4604 || H. Holbrook, B. Cain, B. Haberman || holbrook@cisco.com, bcain99@gmail.com, brian@innovationslab.net +# RFC4605 || B. Fenner, H. He, B. Haberman, H. Sandick || fenner@research.att.com, haixiang@nortelnetworks.com, brian@innovationslab.net, sandick@nc.rr.com +# RFC4606 || E. Mannie, D. Papadimitriou || eric.mannie@perceval.net, dimitri.papadimitriou@alcatel.be +# RFC4607 || H. Holbrook, B. Cain || holbrook@arastra.com, bcain99@gmail.com +# RFC4608 || D. Meyer, R. Rockell, G. Shepherd || dmm@1-4-5.net, rrockell@sprint.net, gjshep@gmail.com +# RFC4609 || P. Savola, R. Lehtonen, D. Meyer || psavola@funet.fi, rami.lehtonen@teliasonera.com, dmm@1-4-5.net +# RFC4610 || D. Farinacci, Y. Cai || dino@cisco.com, ycai@cisco.com +# RFC4611 || M. McBride, J. Meylor, D. Meyer || mcbride@cisco.com, jmeylor@cisco.com, dmm@1-4-5.net +# RFC4612 || P. Jones, H. Tamura || paulej@packetizer.com, tamura@cs.ricoh.co.jp +# RFC4613 || P. Frojdh, U. Lindgren, M. Westerlund || per.frojdh@ericsson.com, ulf.a.lindgren@ericsson.com, magnus.westerlund@ericsson.com +# RFC4614 || M. Duke, R. Braden, W. Eddy, E. Blanton || martin.duke@boeing.com, braden@isi.edu, weddy@grc.nasa.gov, eblanton@cs.purdue.edu +# RFC4615 || J. Song, R. Poovendran, J. Lee, T. Iwata || junhyuk.song@gmail.com, radha@ee.washington.edu, jicheol.lee@samsung.com, iwata@cse.nagoya-u.ac.jp +# RFC4616 || K. Zeilenga, Ed. || Kurt@OpenLDAP.org +# RFC4617 || J. Kornijenko || j.kornienko@abcsoftware.lv +# RFC4618 || L. Martini, E. Rosen, G. Heron, A. Malis || lmartini@cisco.com, erosen@cisco.com, giles.heron@tellabs.com, Andy.Malis@tellabs.com +# RFC4619 || L. Martini, Ed., C. Kawa, Ed., A. Malis, Ed. || lmartini@cisco.com, claude.kawa@oz.com, Andy.Malis@tellabs.com +# RFC4620 || M. Crawford, B. Haberman, Ed. || crawdad@fnal.gov, brian@innovationslab.net +# RFC4621 || T. Kivinen, H. Tschofenig || kivinen@safenet-inc.com, Hannes.Tschofenig@siemens.com +# RFC4622 || P. Saint-Andre || ietf@stpeter.im +# RFC4623 || A. Malis, M. Townsley || Andy.Malis@tellabs.com, mark@townsley.net +# RFC4624 || B. Fenner, D. Thaler || fenner@research.att.com, dthaler@microsoft.com +# RFC4625 || C. DeSanti, K. McCloghrie, S. Kode, S. Gai || cds@cisco.com, srinikode@yahoo.com, kzm@cisco.com, none +# RFC4626 || C. DeSanti, V. Gaonkar, K. McCloghrie, S. Gai || cds@cisco.com, vgaonkar@cisco.com, kzm@cisco.com, none +# RFC4627 || D. Crockford || douglas@crockford.com +# RFC4628 || R. Even || roni.even@polycom.co.il +# RFC4629 || J. Ott, C. Bormann, G. Sullivan, S. Wenger, R. Even, Ed. || jo@netlab.tkk.fi, cabo@tzi.org, garysull@microsoft.com, stewe@stewe.org, roni.even@polycom.co.il +# RFC4630 || R. Housley, S. Santesson || housley@vigilsec.com, stefans@microsoft.com +# RFC4631 || M. Dubuc, T. Nadeau, J. Lang, E. McGinnis, A. Farrel || dubuc.consulting@sympatico.ca, tnadeau@cisco.com, jplang@ieee.org, emcginnis@hammerheadsystems.com, adrian@olddog.co.uk +# RFC4632 || V. Fuller, T. Li || vaf@cisco.com, tli@tropos.com +# RFC4633 || S. Hartman || hartmans-ietf@mit.edu +# RFC4634 || D. Eastlake 3rd, T. Hansen || donald.eastlake@motorola.com, tony+shs@maillennium.att.com +# RFC4635 || D. Eastlake 3rd || Donald.Eastlake@motorola.com +# RFC4636 || C. Perkins || charles.perkins@nokia.com +# RFC4637 || || +# RFC4638 || P. Arberg, D. Kourkouzelis, M. Duckett, T. Anschutz, J. Moisand || parberg@redback.com, diamondk@redback.com, mike.duckett@bellsouth.com, tom.anschutz@bellsouth.com, jmoisand@juniper.net +# RFC4639 || R. Woundy, K. Marez || richard_woundy@cable.comcast.com, kevin.marez@motorola.com +# RFC4640 || A. Patel, Ed., G. Giaretta, Ed. || alpesh@cisco.com, gerardo.giaretta@telecomitalia.it +# RFC4641 || O. Kolkman, R. Gieben || olaf@nlnetlabs.nl, miek@miek.nl +# RFC4642 || K. Murchison, J. Vinocur, C. Newman || murch@andrew.cmu.edu, vinocur@cs.cornell.edu, Chris.Newman@sun.com +# RFC4643 || J. Vinocur, K. Murchison || vinocur@cs.cornell.edu, murch@andrew.cmu.edu +# RFC4644 || J. Vinocur, K. Murchison || vinocur@cs.cornell.edu, murch@andrew.cmu.edu +# RFC4645 || D. Ewell || dewell@adelphia.net +# RFC4646 || A. Phillips, M. Davis || addison@inter-locale.com, mark.davis@macchiato.com +# RFC4647 || A. Phillips, M. Davis || addison@inter-locale.com, mark.davis@macchiato.com +# RFC4648 || S. Josefsson || simon@josefsson.org +# RFC4649 || B. Volz || volz@cisco.com +# RFC4650 || M. Euchner || martin_euchner@hotmail.com +# RFC4651 || C. Vogt, J. Arkko || chvogt@tm.uka.de, jari.arkko@ericsson.com +# RFC4652 || D. Papadimitriou, Ed., L.Ong, J. Sadler, S. Shew, D. Ward || dimitri.papadimitriou@alcatel.be, lyong@ciena.com, jonathan.sadler@tellabs.com, sdshew@nortel.com, dward@cisco.com +# RFC4653 || S. Bhandarkar, A. L. N. Reddy, M. Allman, E. Blanton || sumitha@tamu.edu, reddy@ee.tamu.edu, mallman@icir.org, eblanton@cs.purdue.edu +# RFC4654 || J. Widmer, M. Handley || widmer@acm.org, m.handley@cs.ucl.ac.uk +# RFC4655 || A. Farrel, J.-P. Vasseur, J. Ash || adrian@olddog.co.uk, jpv@cisco.com, gash@att.com +# RFC4656 || S. Shalunov, B. Teitelbaum, A. Karp, J. Boote, M. Zekauskas || shalunov@internet2.edu, ben@internet2.edu, akarp@cs.wisc.edu, boote@internet2.edu, matt@internet2.edu +# RFC4657 || J. Ash, Ed., J.L. Le Roux, Ed. || gash@att.com, jeanlouis.leroux@orange-ft.com +# RFC4659 || J. De Clercq, D. Ooms, M. Carugi, F. Le Faucheur || jeremy.de_clercq@alcatel.be, dirk@onesparrow.com, marco.carugi@nortel.com, flefauch@cisco.com +# RFC4660 || H. Khartabil, E. Leppanen, M. Lonnfors, J. Costa-Requena || hisham.khartabil@telio.no, eva-maria.leppanen@nokia.com, mikko.lonnfors@nokia.com, jose.costa-requena@nokia.com +# RFC4661 || H. Khartabil, E. Leppanen, M. Lonnfors, J. Costa-Requena || hisham.khartabil@telio.no, eva-maria.leppanen@nokia.com, mikko.lonnfors@nokia.com, jose.costa-requena@nokia.com +# RFC4662 || A. B. Roach, B. Campbell, J. Rosenberg || adam@estacado.net, ben@estacado.net, jdrosen@cisco.com +# RFC4663 || D. Harrington || dbharrington@comcast.net +# RFC4664 || L. Andersson, Ed., E. Rosen, Ed. || loa@pi.se, erosen@cisco.com +# RFC4665 || W. Augustyn, Ed., Y. Serbest, Ed. || waldemar@wdmsys.com, yetik_serbest@labs.att.com +# RFC4666 || K. Morneault, Ed., J. Pastor-Balbas, Ed. || kmorneau@cisco.com, j.javier.pastor@ericsson.com +# RFC4667 || W. Luo || luo@cisco.com +# RFC4668 || D. Nelson || dnelson@enterasys.com +# RFC4669 || D. Nelson || dnelson@enterasys.com +# RFC4670 || D. Nelson || dnelson@enterasys.com +# RFC4671 || D. Nelson || dnelson@enterasys.com +# RFC4672 || S. De Cnodder, N. Jonnala, M. Chiba || stefaan.de_cnodder@alcatel.be, njonnala@cisco.com, mchiba@cisco.com +# RFC4673 || S. De Cnodder, N. Jonnala, M. Chiba || stefaan.de_cnodder@alcatel.be, njonnala@cisco.com, mchiba@cisco.com +# RFC4674 || J.L. Le Roux, Ed. || jeanlouis.leroux@francetelecom.com +# RFC4675 || P. Congdon, M. Sanchez, B. Aboba || paul.congdon@hp.com, mauricio.sanchez@hp.com, bernarda@microsoft.com +# RFC4676 || H. Schulzrinne || hgs+geopriv@cs.columbia.edu +# RFC4677 || P. Hoffman, S. Harris || paul.hoffman@vpnc.org, srh@umich.edu +# RFC4678 || A. Bivens || jbivens@us.ibm.com +# RFC4679 || V. Mammoliti, G. Zorn, P. Arberg, R. Rennison || vince@cisco.com, gwz@cisco.com, parberg@redback.com, robert.rennison@ecitele.com +# RFC4680 || S. Santesson || stefans@microsoft.com +# RFC4681 || S. Santesson, A. Medvinsky, J. Ball || stefans@microsoft.com, arimed@microsoft.com, joshball@microsoft.com +# RFC4682 || E. Nechamkin, J-F. Mule || enechamkin@broadcom.com, jf.mule@cablelabs.com +# RFC4683 || J. Park, J. Lee, H.. Lee, S. Park, T. Polk || khopri@kisa.or.kr, jilee@kisa.or.kr, hslee@kisa.or.kr, sjpark@bcqre.com, tim.polk@nist.gov +# RFC4684 || P. Marques, R. Bonica, L. Fang, L. Martini, R. Raszuk, K. Patel, J. Guichard || roque@juniper.net, rbonica@juniper.net, luyuanfang@att.com, lmartini@cisco.com, rraszuk@cisco.com, keyupate@cisco.com, jguichar@cisco.com +# RFC4685 || J. Snell || jasnell@gmail.com +# RFC4686 || J. Fenton || fenton@bluepopcorn.net +# RFC4687 || S. Yasukawa, A. Farrel, D. King, T. Nadeau || s.yasukawa@hco.ntt.co.jp, adrian@olddog.co.uk, daniel.king@aria-networks.com, tnadeau@cisco.com +# RFC4688 || S. Rushing || srushing@inmedius.com +# RFC4689 || S. Poretsky, J. Perser, S. Erramilli, S. Khurana || sporetsky@reefpoint.com, jerry@perser.org, shobha@research.telcordia.com, skhurana@motorola.com +# RFC4690 || J. Klensin, P. Faltstrom, C. Karp, IAB || john-ietf@jck.com, paf@cisco.com, ck@nic.museum, iab@iab.org +# RFC4691 || L. Andersson, Ed. || loa@pi.se +# RFC4692 || G. Huston || gih@apnic.net +# RFC4693 || H. Alvestrand || harald@alvestrand.no +# RFC4694 || J. Yu || james.yu@neustar.biz +# RFC4695 || J. Lazzaro, J. Wawrzynek || lazzaro@cs.berkeley.edu, johnw@cs.berkeley.edu +# RFC4696 || J. Lazzaro, J. Wawrzynek || lazzaro@cs.berkeley.edu, johnw@cs.berkeley.edu +# RFC4697 || M. Larson, P. Barber || mlarson@verisign.com, pbarber@verisign.com +# RFC4698 || E. Gunduz, A. Newton, S. Kerr || e.gunduz@computer.org, andy@hxr.us, shane@time-travellers.org +# RFC4701 || M. Stapp, T. Lemon, A. Gustafsson || mjs@cisco.com, mellon@nominum.com, gson@araneus.fi +# RFC4702 || M. Stapp, B. Volz, Y. Rekhter || mjs@cisco.com, volz@cisco.com, yakov@juniper.net +# RFC4703 || M. Stapp, B. Volz || mjs@cisco.com, volz@cisco.com +# RFC4704 || B. Volz || volz@cisco.com +# RFC4705 || R. Housley, A. Corry || housley@vigilsec.com, publications@gigabeam.com +# RFC4706 || M. Morgenstern, M. Dodge, S. Baillie, U. Bonollo || moti.Morgenstern@ecitele.com, mbdodge@ieee.org, scott.baillie@nec.com.au, umberto.bonollo@nec.com.au +# RFC4707 || P. Grau, V. Heinau, H. Schlichting, R. Schuettler || nas@fu-berlin.de, nas@fu-berlin.de, nas@fu-berlin.de, nas@fu-berlin.de +# RFC4708 || A. Miller || ak.miller@auckland.ac.nz +# RFC4709 || J. Reschke || julian.reschke@greenbytes.de +# RFC4710 || A. Siddiqui, D. Romascanu, E. Golovinsky || anwars@avaya.com, dromasca@gmail.com , gene@alertlogic.net +# RFC4711 || A. Siddiqui, D. Romascanu, E. Golovinsky || anwars@avaya.com, dromasca@gmail.com , gene@alertlogic.net +# RFC4712 || A. Siddiqui, D. Romascanu, E. Golovinsky, M. Rahman,Y. Kim || anwars@avaya.com, dromasca@gmail.com , gene@alertlogic.net, none, ybkim@broadcom.com +# RFC4713 || X. Lee, W. Mao, E. Chen, N. Hsu, J. Klensin || lee@cnnic.cn, mao@cnnic.cn, erin@twnic.net.tw, snw@twnic.net.tw, john+ietf@jck.com +# RFC4714 || A. Mankin, S. Hayes || mankin@psg.com, stephen.hayes@ericsson.com +# RFC4715 || M. Munakata, S. Schubert, T. Ohba || munakata.mayumi@lab.ntt.co.jp, shida@ntt-at.com, ohba.takumi@lab.ntt.co.jp +# RFC4716 || J. Galbraith, R. Thayer || galb@vandyke.com, rodney@canola-jones.com +# RFC4717 || L. Martini, J. Jayakumar, M. Bocci, N. El-Aawar, J. Brayley, G. Koleyni || lmartini@cisco.com, jjayakum@cisco.com, matthew.bocci@alcatel.co.uk, nna@level3.net, jeremy.brayley@ecitele.com, ghassem@nortelnetworks.com +# RFC4718 || P. Eronen, P. Hoffman || pe@iki.fi, paul.hoffman@vpnc.org +# RFC4719 || R. Aggarwal, Ed., M. Townsley, Ed., M. Dos Santos, Ed. || rahul@juniper.net, mark@townsley.net, mariados@cisco.com +# RFC4720 || A. Malis, D. Allan, N. Del Regno || Andy.Malis@tellabs.com, dallan@nortelnetworks.com, nick.delregno@mci.com +# RFC4721 || C. Perkins, P. Calhoun, J. Bharatia || charles.perkins@nokia.com, pcalhoun@cisco.com, jayshree@nortel.com +# RFC4722 || J. Van Dyke, E. Burger, Ed., A. Spitzer || jvandyke@cantata.com, eburger@cantata.com, woof@pingtel.com +# RFC4723 || T. Kosonen, T. White || timo.kosonen@nokia.com, twhite@midi.org +# RFC4724 || S. Sangli, E. Chen, R. Fernando, J. Scudder, Y. Rekhter || rsrihari@cisco.com, enkechen@cisco.com, rex@juniper.net, jgs@juniper.net, yakov@juniper.net +# RFC4725 || A. Mayrhofer, B. Hoeneisen || alexander.mayrhofer@enum.at, b.hoeneisen@ieee.org +# RFC4726 || A. Farrel, J.-P. Vasseur, A. Ayyangar || adrian@olddog.co.uk, jpv@cisco.com, arthi@nuovasystems.com +# RFC4727 || B. Fenner || fenner@research.att.com +# RFC4728 || D. Johnson, Y. Hu, D. Maltz || dbj@cs.rice.edu, yihchun@uiuc.edu, dmaltz@cs.cmu.edu +# RFC4729 || M. Abel || TPM@nfc-forum.org +# RFC4730 || E. Burger, M. Dolly || eburger@cantata.com, mdolly@att.com +# RFC4731 || A. Melnikov, D. Cridland || Alexey.Melnikov@isode.com, dave.cridland@inventuresystems.co.uk +# RFC4732 || M. Handley, Ed., E. Rescorla, Ed., IAB || M.Handley@cs.ucl.ac.uk, ekr@networkresonance.com, iab@ietf.org +# RFC4733 || H. Schulzrinne, T. Taylor || schulzrinne@cs.columbia.edu, tom.taylor.stds@gmail.com +# RFC4734 || H. Schulzrinne, T. Taylor || schulzrinne@cs.columbia.edu, tom.taylor.stds@gmail.com +# RFC4735 || T. Taylor || tom.taylor.stds@gmail.com +# RFC4736 || JP. Vasseur, Ed., Y. Ikejiri, R. Zhang || jpv@cisco.com, y.ikejiri@ntt.com, raymond_zhang@bt.infonet.com +# RFC4737 || A. Morton, L. Ciavattone, G. Ramachandran, S. Shalunov, J. Perser || acmorton@att.com, lencia@att.com, gomathi@att.com, shalunov@internet2.edu, jperser@veriwave.com +# RFC4738 || D. Ignjatic, L. Dondeti, F. Audet, P. Lin || dignjatic@polycom.com, dondeti@qualcomm.com, audet@nortel.com, linping@nortel.com +# RFC4739 || P. Eronen, J. Korhonen || pe@iki.fi, jouni.korhonen@teliasonera.com +# RFC4740 || M. Garcia-Martin, Ed., M. Belinchon, M. Pallares-Lopez, C. Canales-Valenzuela, K. Tammi || miguel.an.garcia@nokia.com, maria.carmen.belinchon@ericsson.com, miguel-angel.pallares@ericsson.com, carolina.canales@ericsson.com, kalle.tammi@nokia.com +# RFC4741 || R. Enns, Ed. || rpe@juniper.net +# RFC4742 || M. Wasserman, T. Goddard || margaret@thingmagic.com, ted.goddard@icesoft.com +# RFC4743 || T. Goddard || ted.goddard@icesoft.com +# RFC4744 || E. Lear, K. Crozier || lear@cisco.com, ken.crozier@gmail.com +# RFC4745 || H. Schulzrinne, H. Tschofenig, J. Morris, J. Cuellar, J. Polk, J. Rosenberg || schulzrinne@cs.columbia.edu, Hannes.Tschofenig@siemens.com, jmorris@cdt.org, Jorge.Cuellar@siemens.com, jmpolk@cisco.com, jdrosen@cisco.com +# RFC4746 || T. Clancy, W. Arbaugh || clancy@ltsnet.net, waa@cs.umd.edu +# RFC4747 || S. Kipp, G. Ramkumar, K. McCloghrie || scott.kipp@mcdata.com, gramkumar@stanfordalumni.org, kzm@cisco.com +# RFC4748 || S. Bradner, Ed. || sob@harvard.edu +# RFC4749 || A. Sollaud || aurelien.sollaud@orange-ft.com +# RFC4750 || D. Joyal, Ed., P. Galecki, Ed., S. Giacalone, Ed., R. Coltun, F. Baker || djoyal@nortel.com, pgalecki@airvana.com, spencer.giacalone@gmail.com, fred@cisco.com +# RFC4752 || A. Melnikov, Ed. || Alexey.Melnikov@isode.com +# RFC4753 || D. Fu, J. Solinas || defu@orion.ncsc.mil, jasolin@orion.ncsc.mil +# RFC4754 || D. Fu, J. Solinas || defu@orion.ncsc.mil, jasolin@orion.ncsc.mil +# RFC4755 || V. Kashyap || vivk@us.ibm.com +# RFC4756 || A. Li || adamli@hyervision.com +# RFC4757 || K. Jaganathan, L. Zhu, J. Brezak || karthikj@microsoft.com, lzhu@microsoft.com, jbrezak@microsoft.com +# RFC4758 || M. Nystroem || magnus@rsasecurity.com +# RFC4759 || R. Stastny, R. Shockey, L. Conroy || Richard.stastny@oefeg.at, richard.shockey@neustar.biz, lconroy@insensate.co.uk +# RFC4760 || T. Bates, R. Chandra, D. Katz, Y. Rekhter || tbates@cisco.com, rchandra@sonoasystems.com, dkatz@juniper.com, yakov@juniper.com +# RFC4761 || K. Kompella, Ed., Y. Rekhter, Ed. || kireeti@juniper.net, yakov@juniper.net +# RFC4762 || M. Lasserre, Ed., V. Kompella, Ed. || mlasserre@alcatel-lucent.com, vach.kompella@alcatel-lucent.com +# RFC4763 || M. Vanderveen, H. Soliman || mvandervn@yahoo.com, solimanhs@gmail.com +# RFC4764 || F. Bersani, H. Tschofenig || bersani_florent@yahoo.fr, Hannes.Tschofenig@siemens.com +# RFC4765 || H. Debar, D. Curry, B. Feinstein || herve.debar@orange-ftgroup.com, david_a_curry@glic.com, feinstein@acm.org +# RFC4766 || M. Wood, M. Erlinger || mark1@iss.net, mike@cs.hmc.edu +# RFC4767 || B. Feinstein, G. Matthews || bfeinstein@acm.org, gmatthew@nas.nasa.gov +# RFC4768 || S. Hartman || hartmans-ietf@mit.edu +# RFC4769 || J. Livingood, R. Shockey || jason_livingood@cable.comcast.com, richard.shockey@neustar.biz +# RFC4770 || C. Jennings, J. Reschke, Ed. || fluffy@cisco.com, julian.reschke@greenbytes.de +# RFC4771 || V. Lehtovirta, M. Naslund, K. Norrman || vesa.lehtovirta@ericsson.com, mats.naslund@ericsson.com, karl.norrman@ericsson.com +# RFC4772 || S. Kelly || scott@hyperthought.com +# RFC4773 || G. Huston || gih@apnic.net +# RFC4774 || S. Floyd || floyd@icir.org +# RFC4775 || S. Bradner, B. Carpenter, Ed., T. Narten || sob@harvard.edu, brc@zurich.ibm.com, narten@us.ibm.com +# RFC4776 || H. Schulzrinne || hgs+geopriv@cs.columbia.edu +# RFC4777 || T. Murphy Jr., P. Rieth, J. Stevens || murphyte@us.ibm.com, rieth@us.ibm.com, jssteven@us.ibm.com +# RFC4778 || M. Kaeo || merike@doubleshotsecurity.com +# RFC4779 || S. Asadullah, A. Ahmed, C. Popoviciu, P. Savola, J. Palet || sasad@cisco.com, adahmed@cisco.com, cpopovic@cisco.com, psavola@funet.fi, jordi.palet@consulintel.es +# RFC4780 || K. Lingle, J-F. Mule, J. Maeng, D. Walker || klingle@cisco.com, jf.mule@cablelabs.com, jmaeng@austin.rr.com, drwalker@rogers.com +# RFC4781 || Y. Rekhter, R. Aggarwal || yakov@juniper.net, rahul@juniper.net +# RFC4782 || S. Floyd, M. Allman, A. Jain, P. Sarolahti || floyd@icir.org, mallman@icir.org, a.jain@f5.com, pasi.sarolahti@iki.fi +# RFC4783 || L. Berger, Ed. || lberger@labn.net +# RFC4784 || C. Carroll, F. Quick || Christopher.Carroll@ropesgray.com, fquick@qualcomm.com +# RFC4785 || U. Blumenthal, P. Goel || urimobile@optonline.net, Purushottam.Goel@intel.com +# RFC4786 || J. Abley, K. Lindqvist || jabley@ca.afilias.info, kurtis@kurtis.pp.se +# RFC4787 || F. Audet, Ed., C. Jennings || audet@nortel.com, fluffy@cisco.com +# RFC4788 || Q. Xie, R. Kapoor || Qiaobing.Xie@Motorola.com, rkapoor@qualcomm.com +# RFC4789 || J. Schoenwaelder, T. Jeffree || j.schoenwaelder@iu-bremen.de, tony@jeffree.co.uk +# RFC4790 || C. Newman, M. Duerst, A. Gulbrandsen || chris.newman@sun.com, duerst@it.aoyama.ac.jp, arnt@oryx.com +# RFC4791 || C. Daboo, B. Desruisseaux, L. Dusseault || cyrus@daboo.name, bernard.desruisseaux@oracle.com, lisa.dusseault@gmail.com +# RFC4792 || S. Legg || steven.legg@eb2bcom.com +# RFC4793 || M. Nystroem || magnus@rsasecurity.com +# RFC4794 || B. Fenner || fenner@research.att.com +# RFC4795 || B. Aboba, D. Thaler, L. Esibov || bernarda@microsoft.com, dthaler@microsoft.com, levone@microsoft.com +# RFC4796 || J. Hautakorpi, G. Camarillo || Jani.Hautakorpi@ericsson.com, Gonzalo.Camarillo@ericsson.com +# RFC4797 || Y. Rekhter, R. Bonica, E. Rosen || yakov@juniper.net, rbonica@juniper.net, erosen@cisco.com +# RFC4798 || J. De Clercq, D. Ooms, S. Prevost, F. Le Faucheur || jeremy.de_clercq@alcatel-lucent.be, dirk@onesparrow.com, stuart.prevost@bt.com, flefauch@cisco.com +# RFC4801 || T. Nadeau, Ed., A. Farrel, Ed. || tnadeau@cisco.com, adrian@olddog.co.uk +# RFC4802 || T. Nadeau, Ed., A. Farrel, Ed. || tnadeau@cisco.com, adrian@olddog.co.uk +# RFC4803 || T. Nadeau, Ed., A. Farrel, Ed. || tnadeau@cisco.com, adrian@olddog.co.uk +# RFC4804 || F. Le Faucheur, Ed. || flefauch@cisco.com +# RFC4805 || O. Nicklass, Ed. || orly_n@rad.com +# RFC4806 || M. Myers, H. Tschofenig || mmyers@fastq.com, Hannes.Tschofenig@siemens.com +# RFC4807 || M. Baer, R. Charlet, W. Hardaker, R. Story, C. Wang || baerm@tislabs.com, rcharlet@alumni.calpoly.edu, hardaker@tislabs.com, rstory@ipsp.revelstone.com, cliffwangmail@yahoo.com +# RFC4808 || S. Bellovin || bellovin@acm.org +# RFC4809 || C. Bonatti, Ed., S. Turner, Ed., G. Lebovitz, Ed. || Bonattic@ieca.com, Turners@ieca.com, gregory.ietf@gmail.com +# RFC4810 || C. Wallace, U. Pordesch, R. Brandner || cwallace@cygnacom.com, ulrich.pordesch@zv.fraunhofer.de, ralf.brandner@intercomponentware.com +# RFC4811 || L. Nguyen, A. Roy, A. Zinin || lhnguyen@cisco.com, akr@cisco.com, alex.zinin@alcatel-lucent.com +# RFC4812 || L. Nguyen, A. Roy, A. Zinin || lhnguyen@cisco.com, akr@cisco.com, alex.zinin@alcatel-lucent.com +# RFC4813 || B. Friedman, L. Nguyen, A. Roy, D. Yeung, A. Zinin || friedman@cisco.com, lhnguyen@cisco.com, akr@cisco.com, myeung@cisco.com, alex.zinin@alcatel-lucent.com +# RFC4814 || D. Newman, T. Player || dnewman@networktest.com, timmons.player@spirent.com +# RFC4815 || L-E. Jonsson, K. Sandlund, G. Pelletier, P. Kremer || lars-erik.jonsson@ericsson.com, kristofer.sandlund@ericsson.com, ghyslain.pelletier@ericsson.com, peter.kremer@ericsson.com +# RFC4816 || A. Malis, L. Martini, J. Brayley, T. Walsh || andrew.g.malis@verizon.com, lmartini@cisco.com, jeremy.brayley@ecitele.com, twalsh@juniper.net +# RFC4817 || M. Townsley, C. Pignataro, S. Wainner, T. Seely, J. Young || mark@townsley.net, cpignata@cisco.com, swainner@cisco.com, tseely@sprint.net, young@jsyoung.net +# RFC4818 || J. Salowey, R. Droms || jsalowey@cisco.com, rdroms@cisco.com +# RFC4819 || J. Galbraith, J. Van Dyke, J. Bright || galb@vandyke.com, jpv@vandyke.com, jon@siliconcircus.com +# RFC4820 || M. Tuexen, R. Stewart, P. Lei || tuexen@fh-muenster.de, randall@lakerest.net, peterlei@cisco.com +# RFC4821 || M. Mathis, J. Heffner || mathis@psc.edu, jheffner@psc.edu +# RFC4822 || R. Atkinson, M. Fanto || rja@extremenetworks.com, mattjf@umd.edu +# RFC4823 || T. Harding, R. Scott || tharding@us.axway.com, rscott@us.axway.com +# RFC4824 || J. Hofmueller, Ed., A. Bachmann, Ed., IO. zmoelnig, Ed. || ip-sfs@mur.at, ip-sfs@mur.at, ip-sfs@mur.at +# RFC4825 || J. Rosenberg || jdrosen@cisco.com +# RFC4826 || J. Rosenberg || jdrosen@cisco.com +# RFC4827 || M. Isomaki, E. Leppanen || markus.isomaki@nokia.com, eva-maria.leppanen@nokia.com +# RFC4828 || S. Floyd, E. Kohler || floyd@icir.org, kohler@cs.ucla.edu +# RFC4829 || J. de Oliveira, Ed., JP. Vasseur, Ed., L. Chen, C. Scoglio || jau@ece.drexel.edu, jpv@cisco.com, leonardo.c.chen@verizon.com, caterina@eece.ksu.edu +# RFC4830 || J. Kempf, Ed. || kempf@docomolabs-usa.com +# RFC4831 || J. Kempf, Ed. || kempf@docomolabs-usa.com +# RFC4832 || C. Vogt, J. Kempf || chvogt@tm.uka.de, kempf@docomolabs-usa.com +# RFC4833 || E. Lear, P. Eggert || lear@cisco.com, eggert@cs.ucla.edu +# RFC4834 || T. Morin, Ed. || thomas.morin@orange-ftgroup.com +# RFC4835 || V. Manral || vishwas@ipinfusion.com +# RFC4836 || E. Beili || edward.beili@actelis.com +# RFC4837 || L. Khermosh || lior_khermosh@pmc-sierra.com +# RFC4838 || V. Cerf, S. Burleigh, A. Hooke, L. Torgerson, R. Durst, K. Scott, K. Fall, H. Weiss || vint@google.com, Scott.Burleigh@jpl.nasa.gov, Adrian.Hooke@jpl.nasa.gov, ltorgerson@jpl.nasa.gov, durst@mitre.org, kscott@mitre.org, kfall@intel.com, howard.weiss@sparta.com +# RFC4839 || G. Conboy, J. Rivlin, J. Ferraiolo || gc@ebooktechnologies.com, john@ebooktechnologies.com, jferrai@us.ibm.com +# RFC4840 || B. Aboba, Ed., E. Davies, D. Thaler || bernarda@microsoft.com, elwynd@dial.pipex.com, dthaler@microsoft.com +# RFC4841 || C. Heard, Ed. || heard@pobox.com +# RFC4842 || A. Malis, P. Pate, R. Cohen, Ed., D. Zelig || andrew.g.malis@verizon.com, prayson.pate@overturenetworks.com, ronc@resolutenetworks.com, davidz@corrigent.com +# RFC4843 || P. Nikander, J. Laganier, F. Dupont || pekka.nikander@nomadiclab.com, julien.ietf@laposte.net, Francis.Dupont@fdupont.fr +# RFC4844 || L. Daigle, Ed., Internet Architecture Board || leslie@thinkingcat.com, iab@iab.org +# RFC4845 || L. Daigle, Ed., Internet Architecture Board || leslie@thinkingcat.com, iab@iab.org +# RFC4846 || J. Klensin, Ed., D. Thaler, Ed. || john-ietf@jck.com, dthaler@microsoft.com +# RFC4847 || T. Takeda, Ed. || takeda.tomonori@lab.ntt.co.jp +# RFC4848 || L. Daigle || leslie@thinkingcat.com +# RFC4849 || P. Congdon, M. Sanchez, B. Aboba || paul.congdon@hp.com, mauricio.sanchez@hp.com, bernarda@microsoft.com +# RFC4850 || D. Wysochanski || wysochanski@pobox.com +# RFC4851 || N. Cam-Winget, D. McGrew, J. Salowey, H. Zhou || ncamwing@cisco.com, mcgrew@cisco.com, jsalowey@cisco.com, hzhou@cisco.com +# RFC4852 || J. Bound, Y. Pouffary, S. Klynsma, T. Chown, D. Green || jim.bound@hp.com, Yanick.pouffary@hp.com, tjc@ecs.soton.ac.uk, green@commandinformation.com, sklynsma@mitre.org +# RFC4853 || R. Housley || housley@vigilsec.com +# RFC4854 || P. Saint-Andre || ietf@stpeter.im +# RFC4855 || S. Casner || casner@acm.org +# RFC4856 || S. Casner || casner@acm.org +# RFC4857 || E. Fogelstroem, A. Jonsson, C. Perkins || eva.fogelstrom@ericsson.com, annika.jonsson@ericsson.com, charles.perkins@nsn.com +# RFC4858 || H. Levkowetz, D. Meyer, L. Eggert, A. Mankin || henrik@levkowetz.com, dmm@1-4-5.net, lars.eggert@nokia.com, mankin@psg.com +# RFC4859 || A. Farrel || adrian@olddog.co.uk +# RFC4860 || F. Le Faucheur, B. Davie, P. Bose, C. Christou, M. Davenport || flefauch@cisco.com, bds@cisco.com, pratik.bose@lmco.com, christou_chris@bah.com, davenport_michael@bah.com +# RFC4861 || T. Narten, E. Nordmark, W. Simpson, H. Soliman || narten@us.ibm.com, erik.nordmark@sun.com, william.allen.simpson@gmail.com, hesham@elevatemobile.com +# RFC4862 || S. Thomson, T. Narten, T. Jinmei || sethomso@cisco.com, narten@us.ibm.com, jinmei@isl.rdc.toshiba.co.jp +# RFC4863 || L. Martini, G. Swallow || lmartini@cisco.com, swallow@cisco.com +# RFC4864 || G. Van de Velde, T. Hain, R. Droms, B. Carpenter, E. Klein || gunter@cisco.com, alh-ietf@tndh.net, rdroms@cisco.com, brc@zurich.ibm.com, ericlklein.ipv6@gmail.com +# RFC4865 || G. White, G. Vaudreuil || g.a.white@comcast.net, GregV@ieee.org +# RFC4866 || J. Arkko, C. Vogt, W. Haddad || jari.arkko@ericsson.com, chvogt@tm.uka.de, wassim.haddad@ericsson.com +# RFC4867 || J. Sjoberg, M. Westerlund, A. Lakaniemi, Q. Xie || Johan.Sjoberg@ericsson.com, Magnus.Westerlund@ericsson.com, ari.lakaniemi@nokia.com, Qiaobing.Xie@motorola.com +# RFC4868 || S. Kelly, S. Frankel || scott@hyperthought.com, sheila.frankel@nist.gov +# RFC4869 || L. Law, J. Solinas || lelaw@orion.ncsc.mil, jasolin@orion.ncsc.mil +# RFC4870 || M. Delany || markd+domainkeys@yahoo-inc.com +# RFC4871 || E. Allman, J. Callas, M. Delany, M. Libbey, J. Fenton, M. Thomas || eric+dkim@sendmail.org, jon@pgp.com, markd+dkim@yahoo-inc.com, mlibbeymail-mailsig@yahoo.com, fenton@bluepopcorn.net, mat@cisco.com +# RFC4872 || J.P. Lang, Ed., Y. Rekhter, Ed., D. Papadimitriou, Ed. || jplang@ieee.org, yakov@juniper.net, dimitri.papadimitriou@alcatel-lucent.be +# RFC4873 || L. Berger, I. Bryskin, D. Papadimitriou, A. Farrel || lberger@labn.net, IBryskin@advaoptical.com, dimitri.papadimitriou@alcatel-lucent.be, adrian@olddog.co.uk +# RFC4874 || CY. Lee, A. Farrel, S. De Cnodder || c.yin.lee@gmail.com, adrian@olddog.co.uk, stefaan.de_cnodder@alcatel-lucent.be +# RFC4875 || R. Aggarwal, Ed., D. Papadimitriou, Ed., S. Yasukawa, Ed. || rahul@juniper.net, yasukawa.seisho@lab.ntt.co.jp, Dimitri.Papadimitriou@alcatel-lucent.be +# RFC4876 || B. Neal-Joslin, Ed., L. Howard, M. Ansari || bob_joslin@hp.com, lukeh@padl.com, morteza@infoblox.com +# RFC4877 || V. Devarapalli, F. Dupont || vijay.devarapalli@azairenet.com, Francis.Dupont@fdupont.fr +# RFC4878 || M. Squire || msquire@hatterasnetworks.com +# RFC4879 || T. Narten || narten@us.ibm.com +# RFC4880 || J. Callas, L. Donnerhacke, H. Finney, D. Shaw, R. Thayer || jon@callas.org, lutz@iks-jena.de, hal@finney.org, dshaw@jabberwocky.com, rodney@canola-jones.com +# RFC4881 || K. El Malki, Ed. || karim@athonet.com +# RFC4882 || R. Koodli || rajeev.koodli@nokia.com +# RFC4883 || G. Feher, K. Nemeth, A. Korn, I. Cselenyi || Gabor.Feher@tmit.bme.hu, Krisztian.Nemeth@tmit.bme.hu, Andras.Korn@tmit.bme.hu, Istvan.Cselenyi@teliasonera.com +# RFC4884 || R. Bonica, D. Gan, D. Tappan, C. Pignataro || rbonica@juniper.net, derhwagan@yahoo.com, Dan.Tappan@gmail.com, cpignata@cisco.com +# RFC4885 || T. Ernst, H-Y. Lach || thierry.ernst@inria.fr, hong-yon.lach@motorola.com +# RFC4886 || T. Ernst || thierry.ernst@inria.fr +# RFC4887 || P. Thubert, R. Wakikawa, V. Devarapalli || pthubert@cisco.com, ryuji@sfc.wide.ad.jp, vijay.devarapalli@azairenet.com +# RFC4888 || C. Ng, P. Thubert, M. Watari, F. Zhao || chanwah.ng@sg.panasonic.com, pthubert@cisco.com, watari@kddilabs.jp, fanzhao@ucdavis.edu +# RFC4889 || C. Ng, F. Zhao, M. Watari, P. Thubert || chanwah.ng@sg.panasonic.com, fanzhao@ucdavis.edu, watari@kddilabs.jp, pthubert@cisco.com +# RFC4890 || E. Davies, J. Mohacsi || elwynd@dial.pipex.com, mohacsi@niif.hu +# RFC4891 || R. Graveman, M. Parthasarathy, P. Savola, H. Tschofenig || rfg@acm.org, mohanp@sbcglobal.net, psavola@funet.fi, Hannes.Tschofenig@nsn.com +# RFC4892 || S. Woolf, D. Conrad || woolf@isc.org, david.conrad@icann.org +# RFC4893 || Q. Vohra, E. Chen || quaizar.vohra@gmail.com, enkechen@cisco.com +# RFC4894 || P. Hoffman || paul.hoffman@vpnc.org +# RFC4895 || M. Tuexen, R. Stewart, P. Lei, E. Rescorla || tuexen@fh-muenster.de, randall@lakerest.net, peterlei@cisco.com, ekr@rtfm.com +# RFC4896 || A. Surtees, M. West, A.B. Roach || abigail.surtees@roke.co.uk, mark.a.west@roke.co.uk, adam@estacado.net +# RFC4897 || J. Klensin, S. Hartman || john-ietf@jck.com, hartmans-ietf@mit.edu +# RFC4898 || M. Mathis, J. Heffner, R. Raghunarayan || mathis@psc.edu, jheffner@psc.edu, raraghun@cisco.com +# RFC4901 || J. Ash, Ed., J. Hand, Ed., A. Malis, Ed. || gash5107@yahoo.com, jameshand@att.com, andrew.g.malis@verizon.com +# RFC4902 || M. Stecher || martin.stecher@webwasher.com +# RFC4903 || D. Thaler || dthaler@microsoft.com +# RFC4904 || V. Gurbani, C. Jennings || vkg@alcatel-lucent.com, fluffy@cisco.com +# RFC4905 || L. Martini, Ed., E. Rosen, Ed., N. El-Aawar, Ed. || lmartini@cisco.com, erosen@cisco.com, nna@level3.net +# RFC4906 || L. Martini, Ed., E. Rosen, Ed., N. El-Aawar, Ed. || lmartini@cisco.com, erosen@cisco.com, nna@level3.net +# RFC4907 || B. Aboba, Ed. || bernarda@microsoft.com +# RFC4908 || K. Nagami, S. Uda, N. Ogashiwa, H. Esaki, R. Wakikawa, H. Ohnishi || nagami@inetcore.com, zin@jaist.ac.jp, ogashiwa@wide.ad.jp, hiroshi@wide.ad.jp, ryuji@sfc.wide.ad.jp, ohnishi.hiroyuki@lab.ntt.co.jp +# RFC4909 || L. Dondeti, Ed., D. Castleford, F. Hartung || ldondeti@qualcomm.com, david.castleford@orange-ftgroup.com, frank.hartung@ericsson.com +# RFC4910 || S. Legg, D. Prager || steven.legg@eb2bcom.com, dap@austhink.com +# RFC4911 || S. Legg || steven.legg@eb2bcom.com +# RFC4912 || S. Legg || steven.legg@eb2bcom.com +# RFC4913 || S. Legg || steven.legg@eb2bcom.com +# RFC4914 || S. Legg || steven.legg@eb2bcom.com +# RFC4915 || P. Psenak, S. Mirtorabi, A. Roy, L. Nguyen, P. Pillay-Esnault || ppsenak@cisco.com, sina@force10networks.com, akr@cisco.com, lhnguyen@cisco.com, ppe@cisco.com +# RFC4916 || J. Elwell || john.elwell@siemens.com +# RFC4917 || V. Sastry, K. Leung, A. Patel || venkat.s@samsung.com, kleung@cisco.com, alpesh@cisco.com +# RFC4918 || L. Dusseault, Ed. || lisa.dusseault@gmail.com +# RFC4919 || N. Kushalnagar, G. Montenegro, C. Schumacher || nandakishore.kushalnagar@intel.com, gabriel.montenegro@microsoft.com, schumacher@danfoss.com +# RFC4920 || A. Farrel, Ed., A. Satyanarayana, A. Iwata, N. Fujita, G. Ash || adrian@olddog.co.uk, asatyana@cisco.com, a-iwata@ah.jp.nec.com, n-fujita@bk.jp.nec.com, gash5107@yahoo.com +# RFC4923 || F. Baker, P. Bose || fred@cisco.com, pratik.bose@lmco.com +# RFC4924 || B. Aboba, Ed., E. Davies || bernarda@microsoft.com, elwynd@dial.pipex.com +# RFC4925 || X. Li, Ed., S. Dawkins, Ed., D. Ward, Ed., A. Durand, Ed. || xing@cernet.edu.cn, spencer@mcsr-labs.org, dward@cisco.com, alain_durand@cable.comcast.com +# RFC4926 || T.Kalin, M.Molina || tomaz.kalin@dante.org.uk, maurizio.molina@dante.org.uk +# RFC4927 || J.-L. Le Roux, Ed. || jeanlouis.leroux@orange-ftgroup.com +# RFC4928 || G. Swallow, S. Bryant, L. Andersson || stbryant@cisco.com, swallow@cisco.com, loa@pi.se +# RFC4929 || L. Andersson, Ed., A. Farrel, Ed. || loa@pi.se, adrian@olddog.co.uk +# RFC4930 || S. Hollenbeck || shollenbeck@verisign.com +# RFC4931 || S. Hollenbeck || shollenbeck@verisign.com +# RFC4932 || S. Hollenbeck || shollenbeck@verisign.com +# RFC4933 || S. Hollenbeck || shollenbeck@verisign.com +# RFC4934 || S. Hollenbeck || shollenbeck@verisign.com +# RFC4935 || C. DeSanti, H.K. Vivek, K. McCloghrie, S. Gai || cds@cisco.com, hvivek@cisco.com, kzm@cisco.com, sgai@nuovasystems.com +# RFC4936 || C. DeSanti, H.K. Vivek, K. McCloghrie, S. Gai || cds@cisco.com, hvivek@cisco.com, kzm@cisco.com, sgai@nuovasystems.com +# RFC4937 || P. Arberg, V. Mammoliti || parberg@redback.com, vince@cisco.com +# RFC4938 || B. Berry, H. Holgate || bberry@cisco.com, hholgate@cisco.com +# RFC4939 || K. Gibbons, G. Ramkumar, S. Kipp || kgibbons@yahoo.com, gramkumar@stanfordalumni.org, skipp@brocade.com +# RFC4940 || K. Kompella, B. Fenner || kireeti@juniper.net, fenner@research.att.com +# RFC4941 || T. Narten, R. Draves, S. Krishnan || narten@us.ibm.com, richdr@microsoft.com, suresh.krishnan@ericsson.com +# RFC4942 || E. Davies, S. Krishnan, P. Savola || elwynd@dial.pipex.com, suresh.krishnan@ericsson.com, psavola@funet.fi +# RFC4943 || S. Roy, A. Durand, J. Paugh || sebastien.roy@sun.com, alain_durand@cable.comcast.com, jim.paugh@nominum.com +# RFC4944 || G. Montenegro, N. Kushalnagar, J. Hui, D. Culler || gabriel.montenegro@microsoft.com, nandakishore.kushalnagar@intel.com, jhui@archrock.com, dculler@archrock.com +# RFC4945 || B. Korver || briank@networkresonance.com +# RFC4946 || J. Snell || jasnell@gmail.com +# RFC4947 || G. Fairhurst, M. Montpetit || gorry@erg.abdn.ac.uk, mmontpetit@motorola.com +# RFC4948 || L. Andersson, E. Davies, L. Zhang || loa@pi.se, elwynd@dial.pipex.com, lixia@cs.ucla.edu +# RFC4949 || R. Shirey || rwshirey4949@verizon.net +# RFC4950 || R. Bonica, D. Gan, D. Tappan, C. Pignataro || rbonica@juniper.net, derhwagan@yahoo.com, dan.tappan@gmail.com, cpignata@cisco.com +# RFC4951 || V. Jain, Ed. || vipinietf@yahoo.com +# RFC4952 || J. Klensin, Y. Ko || john-ietf@jck.com, yw@mrko.pe.kr +# RFC4953 || J. Touch || touch@isi.edu +# RFC4954 || R. Siemborski, Ed., A. Melnikov, Ed. || robsiemb@google.com, Alexey.Melnikov@isode.com +# RFC4955 || D. Blacka || davidb@verisign.com +# RFC4956 || R. Arends, M. Kosters, D. Blacka || roy@nominet.org.uk, markk@verisign.com, davidb@verisign.com +# RFC4957 || S. Krishnan, Ed., N. Montavont, E. Njedjou, S. Veerepalli, A. Yegin, Ed. || suresh.krishnan@ericsson.com, nicolas.montavont@enst-bretagne.fr, eric.njedjou@orange-ftgroup.com, sivav@qualcomm.com, a.yegin@partner.samsung.com +# RFC4958 || K. Carlberg || carlberg@g11.org.uk +# RFC4959 || R. Siemborski, A. Gulbrandsen || robsiemb@google.com, arnt@oryx.com +# RFC4960 || R. Stewart, Ed. || randall@lakerest.net +# RFC4961 || D. Wing || dwing-ietf@fuggles.com +# RFC4962 || R. Housley, B. Aboba || housley@vigilsec.com, bernarda@microsoft.com +# RFC4963 || J. Heffner, M. Mathis, B. Chandler || jheffner@psc.edu, mathis@psc.edu, bchandle@gmail.com +# RFC4964 || A. Allen, Ed., J. Holm, T. Hallin || aallen@rim.com, Jan.Holm@ericsson.com, thallin@motorola.com +# RFC4965 || J-F. Mule, W. Townsley || jf.mule@cablelabs.com, mark@townsley.net +# RFC4966 || C. Aoun, E. Davies || ietf@energizeurnet.com, elwynd@dial.pipex.com +# RFC4967 || B. Rosen || br@brianrosen.net +# RFC4968 || S. Madanapalli, Ed. || smadanapalli@gmail.com +# RFC4969 || A. Mayrhofer || alexander.mayrhofer@enum.at +# RFC4970 || A. Lindem, Ed., N. Shen, JP. Vasseur, R. Aggarwal, S. Shaffer || acee@redback.com, naiming@cisco.com, jpv@cisco.com, rahul@juniper.net, sshaffer@bridgeport-networks.com +# RFC4971 || JP. Vasseur, Ed., N. Shen, Ed., R. Aggarwal, Ed. || jpv@cisco.com, naiming@cisco.com, rahul@juniper.net +# RFC4972 || JP. Vasseur, Ed., JL. Leroux, Ed., S. Yasukawa, S. Previdi, P. Psenak, P. Mabbey || jpv@cisco.com, jeanlouis.leroux@orange-ftgroup.com, s.yasukawa@hco.ntt.co.jp, sprevidi@cisco.com, ppsenak@cisco.com, Paul_Mabey@cable.comcast.com +# RFC4973 || P. Srisuresh, P. Joseph || srisuresh@yahoo.com, paul_95014@yahoo.com +# RFC4974 || D. Papadimitriou, A. Farrel || dimitri.papadimitriou@alcatel-lucent.be, adrian@olddog.co.uk +# RFC4975 || B. Campbell, Ed., R. Mahy, Ed., C. Jennings, Ed. || ben@estacado.net, rohan@ekabal.com, fluffy@cisco.com +# RFC4976 || C. Jennings, R. Mahy, A. B. Roach || fluffy@cisco.com, rohan@ekabal.com, adam@estacado.net +# RFC4977 || G. Tsirtsis, H. Soliman || tsirtsis@qualcomm.com, hesham@elevatemobile.com +# RFC4978 || A. Gulbrandsen || arnt@oryx.com +# RFC4979 || A. Mayrhofer || alexander.mayrhofer@enum.at +# RFC4980 || C. Ng, T. Ernst, E. Paik, M. Bagnulo || chanwah.ng@sg.panasonic.com, thierry.ernst@inria.fr, euna@kt.co.kr, marcelo@it.uc3m.es +# RFC4981 || J. Risson, T. Moors || jr@tuffit.com, t.moors@unsw.edu.au +# RFC4982 || M. Bagnulo, J. Arkko || marcelo@it.uc3m.es, jari.arkko@ericsson.com +# RFC4983 || C. DeSanti, H.K. Vivek, K. McCloghrie, S. Gai || cds@cisco.com, hvivek@cisco.com, kzm@cisco.com, sgai@nuovasystems.com +# RFC4984 || D. Meyer, Ed., L. Zhang, Ed., K. Fall, Ed. || dmm@1-4-5.net, lixia@cs.ucla.edu, kfall@intel.com +# RFC4985 || S. Santesson || stefans@microsoft.com +# RFC4986 || H. Eland, R. Mundy, S. Crocker, S. Krishnaswamy || heland@afilias.info, mundy@sparta.com, steve@shinkuro.com, suresh@sparta.com +# RFC4987 || W. Eddy || weddy@grc.nasa.gov +# RFC4988 || R. Koodli, C. Perkins || rajeev.koodli@nokia.com, charles.perkins@nokia.com +# RFC4990 || K. Shiomoto, R. Papneja, R. Rabbat || shiomoto.kohei@lab.ntt.co.jp, rabbat@alum.mit.edu, rpapneja@isocore.com +# RFC4991 || A. Newton || andy@hxr.us +# RFC4992 || A. Newton || andy@hxr.us +# RFC4993 || A. Newton || andy@hxr.us +# RFC4994 || S. Zeng, B. Volz, K. Kinnear, J. Brzozowski || szeng@cisco.com, volz@cisco.com, kkinnear@cisco.com, john_brzozowski@cable.comcast.com +# RFC4995 || L-E. Jonsson, G. Pelletier, K. Sandlund || lars-erik@lejonsson.com, ghyslain.pelletier@ericsson.com, kristofer.sandlund@ericsson.com +# RFC4996 || G. Pelletier, K. Sandlund, L-E. Jonsson, M. West || ghyslain.pelletier@ericsson.com, kristofer.sandlund@ericsson.com, lars-erik@lejonsson.com, mark.a.west@roke.co.uk +# RFC4997 || R. Finking, G. Pelletier || robert.finking@roke.co.uk, ghyslain.pelletier@ericsson.com +# RFC4998 || T. Gondrom, R. Brandner, U. Pordesch || tobias.gondrom@opentext.com, ralf.brandner@intercomponentware.com, ulrich.pordesch@zv.fraunhofer.de +# RFC5000 || RFC Editor || rfc-editor@rfc-editor.org +# RFC5001 || R. Austein || sra@isc.org +# RFC5002 || G. Camarillo, G. Blanco || Gonzalo.Camarillo@ericsson.com, German.Blanco@ericsson.com +# RFC5003 || C. Metz, L. Martini, F. Balus, J. Sugimoto || chmetz@cisco.com, lmartini@cisco.com, florin.balus@alcatel-lucent.com, sugimoto@nortel.com +# RFC5004 || E. Chen, S. Sangli || enkechen@cisco.com, rsrihari@cisco.com +# RFC5005 || M. Nottingham || mnot@pobox.com +# RFC5006 || J. Jeong, Ed., S. Park, L. Beloeil, S. Madanapalli || jjeong@cs.umn.edu, soohong.park@samsung.com, luc.beloeil@orange-ftgroup.com, smadanapalli@gmail.com +# RFC5007 || J. Brzozowski, K. Kinnear, B. Volz, S. Zeng || john_brzozowski@cable.comcast.com, kkinnear@cisco.com, volz@cisco.com, szeng@cisco.com +# RFC5008 || R. Housley, J. Solinas || housley@vigilsec.com, jasolin@orion.ncsc.mil +# RFC5009 || R. Ejza || ejzak@alcatel-lucent.com +# RFC5010 || K. Kinnear, M. Normoyle, M. Stapp || kkinnear@cisco.com, mnormoyle@cisco.com, mjs@cisco.com +# RFC5011 || M. StJohns || mstjohns@comcast.net +# RFC5012 || H. Schulzrinne, R. Marshall, Ed. || hgs+ecrit@cs.columbia.edu, rmarshall@telecomsys.com +# RFC5013 || J. Kunze, T. Baker || jak@ucop.edu, tbaker@tbaker.de +# RFC5014 || E. Nordmark, S. Chakrabarti, J. Laganier || Erik.Nordmark@Sun.com, samitac2@gmail.com, julien.IETF@laposte.net +# RFC5015 || M. Handley, I. Kouvelas, T. Speakman, L. Vicisano || M.Handley@cs.ucl.ac.uk, kouvelas@cisco.com, speakman@cisco.com, lorenzo@digitalfountain.com +# RFC5016 || M. Thomas || mat@cisco.com +# RFC5017 || D. McWalter, Ed. || dmcw@dataconnection.com +# RFC5018 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC5019 || A. Deacon, R. Hurst || alex@verisign.com, rmh@microsoft.com +# RFC5020 || K. Zeilenga || Kurt.Zeilenga@Isode.COM +# RFC5021 || S. Josefsson || simon@josefsson.org +# RFC5022 || J. Van Dyke, E. Burger, Ed., A. Spitzer || jvandyke@cantata.com, eburger@standardstrack.com, woof@pingtel.com +# RFC5023 || J. Gregorio, Ed., B. de hOra, Ed. || joe@bitworking.org, bill@dehora.net +# RFC5024 || I. Friend || ieuan.friend@dip.co.uk +# RFC5025 || J. Rosenberg || jdrosen@cisco.com +# RFC5026 || G. Giaretta, Ed., J. Kempf, V. Devarapalli, Ed. || gerardog@qualcomm.com, kempf@docomolabs-usa.com, vijay.devarapalli@azairenet.com +# RFC5027 || F. Andreasen, D. Wing || fandreas@cisco.com, dwing-ietf@fuggles.com +# RFC5028 || R. Mahy || rohan@ekabal.com +# RFC5029 || JP. Vasseur, S. Previdi || jpv@cisco.com, sprevidi@cisco.com +# RFC5030 || M. Nakhjiri, Ed., K. Chowdhury, A. Lior, K. Leung || madjid.nakhjiri@motorola.com, kchowdhury@starentnetworks.com, avi@bridgewatersystems.com, kleung@cisco.com +# RFC5031 || H. Schulzrinne || hgs+ecrit@cs.columbia.edu +# RFC5032 || E. Burger, Ed. || eric.burger@bea.com +# RFC5033 || S. Floyd, M. Allman || floyd@icir.org, mallman@icir.org +# RFC5034 || R. Siemborski, A. Menon-Sen || robsiemb@google.com, ams@oryx.com +# RFC5035 || J. Schaad || jimsch@exmsft.com +# RFC5036 || L. Andersson, Ed., I. Minei, Ed., B. Thomas, Ed. || loa@pi.se, ina@juniper.net, rhthomas@cisco.com +# RFC5037 || L. Andersson, Ed., I. Minei, Ed., B. Thomas, Ed. || loa@pi.se, ina@juniper.net, rhthomas@cisco.com +# RFC5038 || B. Thomas, L. Andersson || loa@pi.se, rhthomas@cisco.com +# RFC5039 || J. Rosenberg, C. Jennings || jdrosen@cisco.com, fluffy@cisco.com +# RFC5040 || R. Recio, B. Metzler, P. Culley, J. Hilland, D. Garcia || recio@us.ibm.com, bmt@zurich.ibm.com, paul.culley@hp.com, jeff.hilland@hp.com, Dave.Garcia@StanfordAlumni.org +# RFC5041 || H. Shah, J. Pinkerton, R. Recio, P. Culley || hemal@broadcom.com, jpink@microsoft.com, recio@us.ibm.com, paul.culley@hp.com +# RFC5042 || J. Pinkerton, E. Deleganes || jpink@windows.microsoft.com, deleganes@yahoo.com +# RFC5043 || C. Bestler, Ed., R. Stewart, Ed. || caitlin.bestler@neterion.com, randall@lakerest.net +# RFC5044 || P. Culley, U. Elzur, R. Recio, S. Bailey, J. Carrier || paul.culley@hp.com, uri@broadcom.com, recio@us.ibm.com, steph@sandburst.com, carrier@cray.com +# RFC5045 || C. Bestler, Ed., L. Coene || caitlin.bestler@neterion.com, lode.coene@nsn.com +# RFC5046 || M. Ko, M. Chadalapaka, J. Hufferd, U. Elzur, H. Shah, P. Thaler || mako@us.ibm.com, cbm@rose.hp.com, jhufferd@brocade.com, Uri@Broadcom.com, hemal@broadcom.com, pthaler@broadcom.com +# RFC5047 || M. Chadalapaka, J. Hufferd, J. Satran, H. Shah || cbm@rose.hp.com, jhufferd@brocade.com, Julian_Satran@il.ibm.com, hemal@broadcom.com +# RFC5048 || M. Chadalapaka, Ed. || cbm@rose.hp.com +# RFC5049 || C. Bormann, Z. Liu, R. Price, G. Camarillo, Ed. || cabo@tzi.org, zhigang.c.liu@nokia.com, richard.price@eads.com, Gonzalo.Camarillo@ericsson.com +# RFC5050 || K. Scott, S. Burleigh || kscott@mitre.org, Scott.Burleigh@jpl.nasa.gov +# RFC5051 || M. Crispin || MRC@CAC.Washington.EDU +# RFC5052 || M. Watson, M. Luby, L. Vicisano || mark@digitalfountain.com, luby@digitalfountain.com, lorenzo@digitalfountain.com +# RFC5053 || M. Luby, A. Shokrollahi, M. Watson, T. Stockhammer || luby@digitalfountain.com, amin.shokrollahi@epfl.ch, mark@digitalfountain.com, stockhammer@nomor.de +# RFC5054 || D. Taylor, T. Wu, N. Mavrogiannopoulos, T. Perrin || dtaylor@gnutls.org, thomwu@cisco.com, nmav@gnutls.org, trevp@trevp.net +# RFC5055 || T. Freeman, R. Housley, A. Malpani, D. Cooper, W. Polk || trevorf@microsoft.com, housley@vigilsec.com, ambarish@yahoo.com, david.cooper@nist.gov, wpolk@nist.gov +# RFC5056 || N. Williams || Nicolas.Williams@sun.com +# RFC5057 || R. Sparks || RjS@estacado.net +# RFC5058 || R. Boivie, N. Feldman, Y. Imai, W. Livens, D. Ooms || rhboivie@us.ibm.com, nkfeldman@yahoo.com, ug@xcast.jp, wim@livens.net, dirk@onesparrow.com +# RFC5059 || N. Bhaskar, A. Gall, J. Lingard, S. Venaas || nidhi@arastra.com, alexander.gall@switch.ch, jchl@arastra.com, venaas@uninett.no +# RFC5060 || R. Sivaramu, J. Lingard, D. McWalter, B. Joshi, A. Kessler || raghava@cisco.com, jchl@arastra.com, dmcw@dataconnection.com, bharat_joshi@infosys.com, kessler@cisco.com +# RFC5061 || R. Stewart, Q. Xie, M. Tuexen, S. Maruyama, M. Kozuka || randall@lakerest.net, Qiaobing.Xie@motorola.com, tuexen@fh-muenster.de, mail@marushin.gr.jp, ma-kun@kozuka.jp +# RFC5062 || R. Stewart, M. Tuexen, G. Camarillo || randall@lakerest.net, tuexen@fh-muenster.de, Gonzalo.Camarillo@ericsson.com +# RFC5063 || A. Satyanarayana, Ed., R. Rahman, Ed. || asatyana@cisco.com, rrahman@cisco.com +# RFC5064 || M. Duerst || duerst@it.aoyama.ac.jp +# RFC5065 || P. Traina, D. McPherson, J. Scudder || bgp-confederations@st04.pst.org, danny@arbor.net, jgs@juniper.net +# RFC5066 || E. Beili || edward.beili@actelis.com +# RFC5067 || S. Lind, P. Pfautz || sdlind@att.com, ppfautz@att.com +# RFC5068 || C. Hutzler, D. Crocker, P. Resnick, E. Allman, T. Finch || cdhutzler@aol.com, dcrocker@bbiw.net, presnick@qti.qualcomm.com, eric+ietf-smtp@sendmail.org, dot@dotat.at +# RFC5069 || T. Taylor, Ed., H. Tschofenig, H. Schulzrinne, M. Shanmugam || tom.taylor.stds@gmail.com, Hannes.Tschofenig@nsn.com, hgs+ecrit@cs.columbia.edu, murugaraj.shanmugam@detecon.com +# RFC5070 || R. Danyliw, J. Meijer, Y. Demchenko || rdd@cert.org, jan@flyingcloggies.nl, demch@chello.nl +# RFC5071 || D. Hankins || David_Hankins@isc.org +# RFC5072 || S. Varada, Ed., D. Haskins, E. Allen || varada@txc.com +# RFC5073 || J.P. Vasseur, Ed., J.L. Le Roux, Ed. || jpv@cisco.com, jeanlouis.leroux@orange-ftgroup.com +# RFC5074 || S. Weiler || weiler@tislabs.com +# RFC5075 || B. Haberman, Ed., R. Hinden || brian@innovationslab.net, bob.hinden@gmail.com +# RFC5076 || B. Hoeneisen || hoeneisen@switch.ch +# RFC5077 || J. Salowey, H. Zhou, P. Eronen, H. Tschofenig || jsalowey@cisco.com, hzhou@cisco.com, pe@iki.fi, Hannes.Tschofenig@nsn.com +# RFC5078 || S. Dawkins || spencer@mcsr-labs.org +# RFC5079 || J. Rosenberg || jdrosen@cisco.com +# RFC5080 || D. Nelson, A. DeKok || dnelson@elbrysnetworks.com, aland@freeradius.org +# RFC5081 || N. Mavrogiannopoulos || nmav@gnutls.org +# RFC5082 || V. Gill, J. Heasley, D. Meyer, P. Savola, Ed., C. Pignataro || vijay@umbc.edu, heas@shrubbery.net, dmm@1-4-5.net, psavola@funet.fi, cpignata@cisco.com +# RFC5083 || R. Housley || housley@vigilsec.com +# RFC5084 || R. Housley || housley@vigilsec.com +# RFC5085 || T. Nadeau, Ed., C. Pignataro, Ed. || tnadeau@lucidvision.com, cpignata@cisco.com +# RFC5086 || A. Vainshtein, Ed., I. Sasson, E. Metz, T. Frost, P. Pate || sasha@axerra.com, israel@axerra.com, e.t.metz@telecom.tno.nl, tfrost@symmetricom.com, prayson.pate@overturenetworks.com +# RFC5087 || Y(J). Stein, R. Shashoua, R. Insler, M. Anavi || yaakov_s@rad.com, ronen_s@rad.com, ron_i@rad.com, motty@radusa.com +# RFC5088 || JL. Le Roux, Ed., JP. Vasseur, Ed., Y. Ikejiri, R. Zhang || jeanlouis.leroux@orange-ftgroup.com, jpv@cisco.com, y.ikejiri@ntt.com, raymond.zhang@bt.com +# RFC5089 || JL. Le Roux, Ed., JP. Vasseur, Ed., Y. Ikejiri, R. Zhang || jeanlouis.leroux@orange-ftgroup.com, jpv@cisco.com, y.ikejiri@ntt.com, raymond.zhang@bt.com +# RFC5090 || B. Sterman, D. Sadolevsky, D. Schwartz, D. Williams, W. Beck || baruch@kayote.com, dscreat@dscreat.com, david@kayote.com, dwilli@cisco.com, beckw@t-systems.com +# RFC5091 || X. Boyen, L. Martin || xavier@voltage.com, martin@voltage.com +# RFC5092 || A. Melnikov, Ed., C. Newman || Alexey.Melnikov@isode.com, chris.newman@sun.com +# RFC5093 || G. Hunt || geoff.hunt@bt.com +# RFC5094 || V. Devarapalli, A. Patel, K. Leung || vijay.devarapalli@azairenet.com, alpesh@cisco.com, kleung@cisco.com +# RFC5095 || J. Abley, P. Savola, G. Neville-Neil || jabley@ca.afilias.info, psavola@funet.fi, gnn@neville-neil.com +# RFC5096 || V. Devarapalli || vijay.devarapalli@azairenet.com +# RFC5097 || G. Renker, G. Fairhurst || gerrit@erg.abdn.ac.uk, gorry@erg.abdn.ac.uk +# RFC5098 || G. Beacham, S. Kumar, S. Channabasappa || gordon.beacham@motorola.com, satish.kumar@ti.com, Sumanth@cablelabs.com +# RFC5101 || B. Claise, Ed. || bclaise@cisco.com +# RFC5102 || J. Quittek, S. Bryant, B. Claise, P. Aitken, J. Meyer || quittek@netlab.nec.de, stbryant@cisco.com, bclaise@cisco.com, paitken@cisco.com, jemeyer@paypal.com +# RFC5103 || B. Trammell, E. Boschi || bht@cert.org, elisa.boschi@hitachi-eu.com +# RFC5104 || S. Wenger, U. Chandra, M. Westerlund, B. Burman || stewe@stewe.org, Umesh.1.Chandra@nokia.com, magnus.westerlund@ericsson.com, bo.burman@ericsson.com +# RFC5105 || O. Lendl || otmar.lendl@enum.at +# RFC5106 || H. Tschofenig, D. Kroeselberg, A. Pashalidis, Y. Ohba, F. Bersani || Hannes.Tschofenig@nsn.com, Dirk.Kroeselberg@nsn.com, pashalidis@nw.neclab.eu, yohba@tari.toshiba.com, florent.ftrd@gmail.com +# RFC5107 || R. Johnson, J. Kumarasamy, K. Kinnear, M. Stapp || raj@cisco.com, jayk@cisco.com, kkinnear@cisco.com, mjs@cisco.com +# RFC5109 || A. Li, Ed. || adamli@hyervision.com +# RFC5110 || P. Savola || psavola@funet.fi +# RFC5111 || B. Aboba, L. Dondeti || bernarda@microsoft.com, ldondeti@qualcomm.com +# RFC5112 || M. Garcia-Martin || miguel.garcia@nsn.com +# RFC5113 || J. Arkko, B. Aboba, J. Korhonen, Ed., F. Bari || jari.arkko@ericsson.com, bernarda@microsoft.com, jouni.korhonen@teliasonera.com, farooq.bari@att.com +# RFC5114 || M. Lepinski, S. Kent || mlepinski@bbn.com, kent@bbn.com +# RFC5115 || K. Carlberg, P. O'Hanlon || carlberg@g11.org.uk, p.ohanlon@cs.ucl.ac.uk +# RFC5116 || D. McGrew || mcgrew@cisco.com +# RFC5117 || M. Westerlund, S. Wenger || magnus.westerlund@ericsson.com, stewe@stewe.org +# RFC5118 || V. Gurbani, C. Boulton, R. Sparks || vkg@alcatel-lucent.com, cboulton@ubiquitysoftware.com, RjS@estacado.net +# RFC5119 || T. Edwards || thomas.edwards@fox.com +# RFC5120 || T. Przygienda, N. Shen, N. Sheth || prz@net4u.ch, naiming@cisco.com, nsheth@juniper.net +# RFC5121 || B. Patil, F. Xia, B. Sarikaya, JH. Choi, S. Madanapalli || basavaraj.patil@nsn.com, xiayangsong@huawei.com, sarikaya@ieee.org, jinchoe@samsung.com, smadanapalli@gmail.com +# RFC5122 || P. Saint-Andre || ietf@stpeter.im +# RFC5123 || R. White, B. Akyol || riw@cisco.com, bora@cisco.com +# RFC5124 || J. Ott, E. Carrara || jo@comnet.tkk.fi, carrara@kth.se +# RFC5125 || T. Taylor || tom.taylor.stds@gmail.com +# RFC5126 || D. Pinkas, N. Pope, J. Ross || Denis.Pinkas@bull.net, nick.pope@thales-esecurity.com, ross@secstan.com +# RFC5127 || K. Chan, J. Babiarz, F. Baker || khchan@nortel.com, babiarz@nortel.com, fred@cisco.com +# RFC5128 || P. Srisuresh, B. Ford, D. Kegel || srisuresh@yahoo.com, baford@mit.edu, dank06@kegel.com +# RFC5129 || B. Davie, B. Briscoe, J. Tay || bsd@cisco.com, bob.briscoe@bt.com, june.tay@bt.com +# RFC5130 || S. Previdi, M. Shand, Ed., C. Martin || sprevidi@cisco.com, mshand@cisco.com, chris@ipath.net +# RFC5131 || D. McWalter, Ed. || dmcw@dataconnection.com +# RFC5132 || D. McWalter, D. Thaler, A. Kessler || dmcw@dataconnection.com, dthaler@windows.microsoft.com, kessler@cisco.com +# RFC5133 || M. Tuexen, K. Morneault || tuexen@fh-muenster.de, kmorneau@cisco.com +# RFC5134 || M. Mealling || michael@refactored-networks.com +# RFC5135 || D. Wing, T. Eckert || dwing-ietf@fuggles.com, eckert@cisco.com +# RFC5136 || P. Chimento, J. Ishac || Philip.Chimento@jhuapl.edu, jishac@nasa.gov +# RFC5137 || J. Klensin || john-ietf@jck.com +# RFC5138 || S. Cox || Simon.Cox@csiro.au +# RFC5139 || M. Thomson, J. Winterbottom || martin.thomson@andrew.com, james.winterbottom@andrew.com +# RFC5140 || M. Bangalore, R. Kumar, J. Rosenberg, H. Salama, D.N. Shah || manjax@cisco.com, rajneesh@cisco.com, jdrosen@cisco.com, hsalama@citexsoftware.com, dhaval@moowee.tv +# RFC5141 || J. Goodwin, H. Apel || goodwin@iso.org, apel@iso.org +# RFC5142 || B. Haley, V. Devarapalli, H. Deng, J. Kempf || brian.haley@hp.com, vijay.devarapalli@azairenet.com, kempf@docomolabs-usa.com, denghui@chinamobile.com +# RFC5143 || A. Malis, J. Brayley, J. Shirron, L. Martini, S. Vogelsang || andrew.g.malis@verizon.com, jeremy.brayley@ecitele.com, john.shirron@ecitele.com, lmartini@cisco.com, steve.vogelsang@alcatel-lucent.com +# RFC5144 || A. Newton, M. Sanz || andy@arin.net, sanz@denic.de +# RFC5145 || K. Shiomoto, Ed. || shiomoto.kohei@lab.ntt.co.jp +# RFC5146 || K. Kumaki, Ed. || ke-kumaki@kddi.com +# RFC5147 || E. Wilde, M. Duerst || dret@berkeley.edu, duerst@it.aoyama.ac.jp +# RFC5148 || T. Clausen, C. Dearlove, B. Adamson || T.Clausen@computer.org, chris.dearlove@baesystems.com, adamson@itd.nrl.navy.mil +# RFC5149 || J. Korhonen, U. Nilsson, V. Devarapalli || jouni.korhonen@teliasonera.com, ulf.s.nilsson@teliasonera.com, vijay.devarapalli@azairenet.com +# RFC5150 || A. Ayyangar, K. Kompella, JP. Vasseur, A. Farrel || arthi@juniper.net, kireeti@juniper.net, jpv@cisco.com, adrian@olddog.co.uk +# RFC5151 || A. Farrel, Ed., A. Ayyangar, JP. Vasseur || adrian@olddog.co.uk, arthi@juniper.net, jpv@cisco.com +# RFC5152 || JP. Vasseur, Ed., A. Ayyangar, Ed., R. Zhang || jpv@cisco.com, arthi@juniper.net, raymond.zhang@bt.com +# RFC5153 || E. Boschi, L. Mark, J. Quittek, M. Stiemerling, P. Aitken || elisa.boschi@hitachi-eu.com, lutz.mark@fokus.fraunhofer.de, quittek@nw.neclab.eu, stiemerling@nw.neclab.eu, paitken@cisco.com +# RFC5154 || J. Jee, Ed., S. Madanapalli, J. Mandin || jhjee@etri.re.kr, smadanapalli@gmail.com, j_mandin@yahoo.com +# RFC5155 || B. Laurie, G. Sisson, R. Arends, D. Blacka || ben@links.org, geoff-s@panix.com, roy@nominet.org.uk, davidb@verisign.com +# RFC5156 || M. Blanchet || Marc.Blanchet@viagenie.ca +# RFC5157 || T. Chown || tjc@ecs.soton.ac.uk +# RFC5158 || G. Huston || gih@apnic.net +# RFC5159 || L. Dondeti, Ed., A. Jerichow || ldondeti@qualcomm.com, anja.jerichow@nsn.com +# RFC5160 || P. Levis, M. Boucadair || pierre.levis@orange-ftgroup.com, mohamed.boucadair@orange-ftgroup.com +# RFC5161 || A. Gulbrandsen, Ed., A. Melnikov, Ed. || arnt@oryx.com, Alexey.Melnikov@isode.com +# RFC5162 || A. Melnikov, D. Cridland, C. Wilson || Alexey.Melnikov@isode.com, dave.cridland@isode.com, corby@computer.org +# RFC5163 || G. Fairhurst, B. Collini-Nocker || gorry@erg.abdn.ac.uk, bnocker@cosy.sbg.ac.at +# RFC5164 || T. Melia, Ed. || tmelia@cisco.com +# RFC5165 || C. Reed || creed@opengeospatial.org +# RFC5166 || S. Floyd, Ed. || floyd@icir.org +# RFC5167 || M. Dolly, R. Even || mdolly@att.com, roni.even@polycom.co.il +# RFC5168 || O. Levin, R. Even, P. Hagendorf || oritl@microsoft.com, roni.even@polycom.co.il, pierre@radvision.com +# RFC5169 || T. Clancy, M. Nakhjiri, V. Narayanan, L. Dondeti || clancy@LTSnet.net, madjid.nakhjiri@motorola.com, vidyan@qualcomm.com, ldondeti@qualcomm.com +# RFC5170 || V. Roca, C. Neumann, D. Furodet || vincent.roca@inria.fr, christoph.neumann@thomson.net, david.furodet@st.com +# RFC5171 || M. Foschiano || foschia@cisco.com +# RFC5172 || S. Varada, Ed. || varada@ieee.org +# RFC5173 || J. Degener, P. Guenther || jutta@pobox.com, guenther@sendmail.com +# RFC5174 || J-P. Evain || evain@ebu.ch +# RFC5175 || B. Haberman, Ed., R. Hinden || brian@innovationslab.net, bob.hinden@gmail.com +# RFC5176 || M. Chiba, G. Dommety, M. Eklund, D. Mitton, B. Aboba || mchiba@cisco.com, gdommety@cisco.com, meklund@cisco.com, david@mitton.com, bernarda@microsoft.com +# RFC5177 || K. Leung, G. Dommety, V. Narayanan, A. Petrescu || kleung@cisco.com, gdommety@cisco.com, vidyan@qualcomm.com, alexandru.petrescu@motorola.com +# RFC5178 || N. Williams, A. Melnikov || Nicolas.Williams@sun.com, Alexey.Melnikov@isode.com +# RFC5179 || N. Williams || Nicolas.Williams@sun.com +# RFC5180 || C. Popoviciu, A. Hamza, G. Van de Velde, D. Dugatkin || cpopovic@cisco.com, ahamza@cisco.com, gunter@cisco.com, diego@fastsoft.com +# RFC5181 || M-K. Shin, Ed., Y-H. Han, S-E. Kim, D. Premec || myungki.shin@gmail.com, yhhan@kut.ac.kr, sekim@kt.co.kr, domagoj.premec@siemens.com +# RFC5182 || A. Melnikov || Alexey.Melnikov@isode.com +# RFC5183 || N. Freed || ned.freed@mrochek.com +# RFC5184 || F. Teraoka, K. Gogo, K. Mitsuya, R. Shibui, K. Mitani || tera@ics.keio.ac.jp, gogo@tera.ics.keio.ac.jp, mitsuya@sfc.wide.ad.jp, shibrie@tera.ics.keio.ac.jp, koki@tera.ics.keio.ac.jp, rajeev_koodli@yahoo.com +# RFC5185 || S. Mirtorabi, P. Psenak, A. Lindem, Ed., A. Oswal || sina@nuovasystems.com, ppsenak@cisco.com, acee@redback.com, aoswal@redback.com +# RFC5186 || B. Haberman, J. Martin || brian@innovationslab.net, jim@wovensystems.com +# RFC5187 || P. Pillay-Esnault, A. Lindem || ppe@cisco.com, acee@redback.com +# RFC5188 || H. Desineni, Q. Xie || hd@qualcomm.com, Qiaobing.Xie@Gmail.com +# RFC5189 || M. Stiemerling, J. Quittek, T. Taylor || stiemerling@nw.neclab.eu, quittek@nw.neclab.eu, tom.taylor.stds@gmail.com +# RFC5190 || J. Quittek, M. Stiemerling, P. Srisuresh || quittek@nw.neclab.eu, stiemerling@nw.neclab.eu, srisuresh@yahoo.com +# RFC5191 || D. Forsberg, Y. Ohba, Ed., B. Patil, H. Tschofenig, A. Yegin || dan.forsberg@nokia.com, yohba@tari.toshiba.com, basavaraj.patil@nsn.com, hannes.tschofenig@nsn.com, a.yegin@partner.samsung.com +# RFC5192 || L. Morand, A. Yegin, S. Kumar, S. Madanapalli || lionel.morand@orange-ftgroup.com, a.yegin@partner.samsung.com, surajk@techmahindra.com, syam@samsung.com +# RFC5193 || P. Jayaraman, R. Lopez, Y. Ohba, Ed., M. Parthasarathy, A. Yegin || prakash_jayaraman@net.com, rafa@um.es, yohba@tari.toshiba.com, mohanp@sbcglobal.net, a.yegin@partner.samsung.com +# RFC5194 || A. van Wijk, Ed., G. Gybels, Ed. || guido.gybels@rnid.org.uk, arnoud@realtimetext.org +# RFC5195 || H. Ould-Brahim, D. Fedyk, Y. Rekhter || hbrahim@nortel.com, yakov@juniper.net, dwfedyk@nortel.com +# RFC5196 || M. Lonnfors, K. Kiss || mikko.lonnfors@nokia.com, krisztian.kiss@nokia.com +# RFC5197 || S. Fries, D. Ignjatic || steffen.fries@siemens.com, dignjatic@polycom.com +# RFC5198 || J. Klensin, M. Padlipsky || john-ietf@jck.com, the.map@alum.mit.edu +# RFC5201 || R. Moskowitz, P. Nikander, P. Jokela, Ed., T. Henderson || rgm@icsalabs.com, pekka.nikander@nomadiclab.com, petri.jokela@nomadiclab.com, thomas.r.henderson@boeing.com +# RFC5202 || P. Jokela, R. Moskowitz, P. Nikander || petri.jokela@nomadiclab.com, rgm@icsalabs.com, pekka.nikander@nomadiclab.com +# RFC5203 || J. Laganier, T. Koponen, L. Eggert || julien.ietf@laposte.net, teemu.koponen@iki.fi, lars.eggert@nokia.com +# RFC5204 || J. Laganier, L. Eggert || julien.ietf@laposte.net, lars.eggert@nokia.com +# RFC5205 || P. Nikander, J. Laganier || pekka.nikander@nomadiclab.com, julien.ietf@laposte.net +# RFC5206 || P. Nikander, T. Henderson, Ed., C. Vogt, J. Arkko || pekka.nikander@nomadiclab.com, thomas.r.henderson@boeing.com, christian.vogt@ericsson.com, jari.arkko@ericsson.com +# RFC5207 || M. Stiemerling, J. Quittek, L. Eggert || stiemerling@netlab.nec.de, quittek@nw.neclab.eu, lars.eggert@nokia.com +# RFC5208 || B. Kaliski || kaliski_burt@emc.com +# RFC5209 || P. Sangster, H. Khosravi, M. Mani, K. Narayan, J. Tardo || Paul_Sangster@symantec.com, hormuzd.m.khosravi@intel.com, mmani@avaya.com, kaushik@cisco.com, joseph.tardo@nevisnetworks.com +# RFC5210 || J. Wu, J. Bi, X. Li, G. Ren, K. Xu, M. Williams || jianping@cernet.edu.cn, junbi@cernet.edu.cn, xing@cernet.edu.cn, rg03@mails.tsinghua.edu.cn, xuke@csnet1.cs.tsinghua.edu.cn, miw@juniper.net +# RFC5211 || J. Curran || jcurran@istaff.org +# RFC5212 || K. Shiomoto, D. Papadimitriou, JL. Le Roux, M. Vigoureux, D. Brungard || shiomoto.kohei@lab.ntt.co.jp, dimitri.papadimitriou@alcatel-lucent.be, jeanlouis.leroux@orange-ftgroup.com, martin.vigoureux@alcatel-lucent.fr, dbrungard@att.com +# RFC5213 || S. Gundavelli, Ed., K. Leung, V. Devarapalli, K. Chowdhury, B. Patil || sgundave@cisco.com, kleung@cisco.com, vijay@wichorus.com, kchowdhury@starentnetworks.com, basavaraj.patil@nokia.com +# RFC5214 || F. Templin, T. Gleeson, D. Thaler || fred.l.templin@boeing.com, tgleeson@cisco.com, dthaler@microsoft.com +# RFC5215 || L. Barbato || lu_zero@gentoo.org +# RFC5216 || D. Simon, B. Aboba, R. Hurst || dansimon@microsoft.com, bernarda@microsoft.com, rmh@microsoft.com +# RFC5217 || M. Shimaoka, Ed., N. Hastings, R. Nielsen || m-shimaoka@secom.co.jp, nelson.hastings@nist.gov, nielsen_rebecca@bah.com +# RFC5218 || D. Thaler, B. Aboba || dthaler@microsoft.com, bernarda@microsoft.com +# RFC5219 || R. Finlayson || finlayson@live555.com +# RFC5220 || A. Matsumoto, T. Fujisaki, R. Hiromi, K. Kanayama || arifumi@nttv6.net, fujisaki@nttv6.net, hiromi@inetcore.com, kanayama_kenichi@intec-si.co.jp +# RFC5221 || A. Matsumoto, T. Fujisaki, R. Hiromi, K. Kanayama || arifumi@nttv6.net, fujisaki@nttv6.net, hiromi@inetcore.com, kanayama_kenichi@intec-si.co.jp +# RFC5222 || T. Hardie, A. Newton, H. Schulzrinne, H. Tschofenig || hardie@qualcomm.com, andy@hxr.us, hgs+ecrit@cs.columbia.edu, Hannes.Tschofenig@nsn.com +# RFC5223 || H. Schulzrinne, J. Polk, H. Tschofenig || hgs+ecrit@cs.columbia.edu, jmpolk@cisco.com, Hannes.Tschofenig@nsn.com +# RFC5224 || M. Brenner || mrbrenner@alcatel-lucent.com +# RFC5225 || G. Pelletier, K. Sandlund || ghyslain.pelletier@ericsson.com, kristofer.sandlund@ericsson.com +# RFC5226 || T. Narten, H. Alvestrand || narten@us.ibm.com, Harald@Alvestrand.no +# RFC5227 || S. Cheshire || rfc@stuartcheshire.org +# RFC5228 || P. Guenther, Ed., T. Showalter, Ed. || guenther@sendmail.com, tjs@psaux.com +# RFC5229 || K. Homme || kjetilho@ifi.uio.no +# RFC5230 || T. Showalter, N. Freed, Ed. || tjs@psaux.com, ned.freed@mrochek.com +# RFC5231 || W. Segmuller, B. Leiba || werewolf@us.ibm.com, leiba@watson.ibm.com +# RFC5232 || A. Melnikov || alexey.melnikov@isode.com +# RFC5233 || K. Murchison || murch@andrew.cmu.edu +# RFC5234 || D. Crocker, Ed., P. Overell || dcrocker@bbiw.net, paul@bayleaf.org.uk +# RFC5235 || C. Daboo || cyrus@daboo.name +# RFC5236 || A. Jayasumana, N. Piratla, T. Banka, A. Bare, R. Whitner || Anura.Jayasumana@colostate.edu, Nischal.Piratla@telekom.de, Tarun.Banka@colostate.edu, abhijit_bare@agilent.com, rick_whitner@agilent.com +# RFC5237 || J. Arkko, S. Bradner || jari.arkko@piuha.net, sob@harvard.edu +# RFC5238 || T. Phelan || tphelan@sonusnet.com +# RFC5239 || M. Barnes, C. Boulton, O. Levin || mary.barnes@nortel.com, cboulton@avaya.com, oritl@microsoft.com +# RFC5240 || B. Joshi, R. Bijlani || bharat_joshi@infosys.com, rainab@gmail.com +# RFC5241 || A. Falk, S. Bradner || falk@bbn.com, sob@harvard.edu +# RFC5242 || J. Klensin, H. Alvestrand || john+ietf@jck.com, harald@alvestrand.no +# RFC5243 || R. Ogier || rich.ogier@earthlink.net +# RFC5244 || H. Schulzrinne, T. Taylor || schulzrinne@cs.columbia.edu, tom.taylor.stds@gmail.com +# RFC5245 || J. Rosenberg || jdrosen@jdrosen.net +# RFC5246 || T. Dierks, E. Rescorla || tim@dierks.org, ekr@rtfm.com +# RFC5247 || B. Aboba, D. Simon, P. Eronen || bernarda@microsoft.com, dansimon@microsoft.com, pe@iki.fi +# RFC5248 || T. Hansen, J. Klensin || tony+mailesc@maillennium.att.com, john+ietf@jck.com +# RFC5249 || D. Harrington, Ed. || dharrington@huawei.com +# RFC5250 || L. Berger, I. Bryskin, A. Zinin, R. Coltun || lberger@labn.net, ibryskin@advaoptical.com, alex.zinin@alcatel-lucent.com, none +# RFC5251 || D. Fedyk, Ed., Y. Rekhter, Ed., D. Papadimitriou, R. Rabbat, L. Berger || dwfedyk@nortel.com, yakov@juniper.net, Dimitri.Papadimitriou@alcatel-lucent.be, rabbat@alum.mit.edu, lberger@labn.net +# RFC5252 || I. Bryskin, L. Berger || ibryskin@advaoptical.com, lberger@labn.net +# RFC5253 || T. Takeda, Ed. || takeda.tomonori@lab.ntt.co.jp +# RFC5254 || N. Bitar, Ed., M. Bocci, Ed., L. Martini, Ed. || nabil.bitar@verizon.com, matthew.bocci@alcatel-lucent.co.uk, lmartini@cisco.com +# RFC5255 || C. Newman, A. Gulbrandsen, A. Melnikov || chris.newman@sun.com, arnt@oryx.com, Alexey.Melnikov@isode.com +# RFC5256 || M. Crispin, K. Murchison || IMAP+SORT+THREAD@Lingling.Panda.COM, murch@andrew.cmu.edu +# RFC5257 || C. Daboo, R. Gellens || cyrus@daboo.name, randy@qualcomm.com +# RFC5258 || B. Leiba, A. Melnikov || leiba@watson.ibm.com, Alexey.Melnikov@isode.com +# RFC5259 || A. Melnikov, Ed., P. Coates, Ed. || Alexey.Melnikov@isode.com, peter.coates@Sun.COM +# RFC5260 || N. Freed || ned.freed@mrochek.com +# RFC5261 || J. Urpalainen || jari.urpalainen@nokia.com +# RFC5262 || M. Lonnfors, E. Leppanen, H. Khartabil, J. Urpalainen || mikko.lonnfors@nokia.com, eva.leppanen@saunalahti.fi, hisham.khartabil@gmail.com, jari.urpalainen@nokia.com +# RFC5263 || M. Lonnfors, J. Costa-Requena, E. Leppanen, H. Khartabil || mikko.lonnfors@nokia.com, jose.costa-requena@nokia.com, eva.leppanen@saunalahti.fi, hisham.khartabil@gmail.com +# RFC5264 || A. Niemi, M. Lonnfors, E. Leppanen || aki.niemi@nokia.com, mikko.lonnfors@nokia.com, eva.leppanen@saunalaht.fi +# RFC5265 || S. Vaarala, E. Klovning || sami.vaarala@iki.fi, espen@birdstep.com +# RFC5266 || V. Devarapalli, P. Eronen || vijay@wichorus.com, pe@iki.fi +# RFC5267 || D. Cridland, C. King || dave.cridland@isode.com, cking@mumbo.ca +# RFC5268 || R. Koodli, Ed. || rkoodli@starentnetworks.com[ +# RFC5269 || J. Kempf, R. Koodli || kempf@docomolabs-usa.com, rkoodli@starentnetworks.com +# RFC5270 || H. Jang, J. Jee, Y. Han, S. Park, J. Cha || heejin.jang@gmail.com, jhjee@etri.re.kr, yhhan@kut.ac.kr, soohong.park@samsung.com, jscha@etri.re.kr +# RFC5271 || H. Yokota, G. Dommety || yokota@kddilabs.jp, gdommety@cisco.com +# RFC5272 || J. Schaad, M. Myers || jimsch@nwlink.com, mmyers@fastq.com +# RFC5273 || J. Schaad, M. Myers || jimsch@nwlink.com, mmyers@fastq.com +# RFC5274 || J. Schaad, M. Myers || jimsch@nwlink.com, mmyers@fastq.com +# RFC5275 || S. Turner || turners@ieca.com +# RFC5276 || C. Wallace || cwallace@cygnacom.com +# RFC5277 || S. Chisholm, H. Trevino || schishol@nortel.com, htrevino@cisco.com +# RFC5278 || J. Livingood, D. Troshynski || jason_livingood@cable.comcast.com, dtroshynski@acmepacket.com +# RFC5279 || A. Monrad, S. Loreto || atle.monrad@ericsson.com, Salvatore.Loreto@ericsson.com +# RFC5280 || D. Cooper, S. Santesson, S. Farrell, S. Boeyen, R. Housley, W. Polk || david.cooper@nist.gov, stefans@microsoft.com, stephen.farrell@cs.tcd.ie, sharon.boeyen@entrust.com, housley@vigilsec.com, wpolk@nist.gov +# RFC5281 || P. Funk, S. Blake-Wilson || PaulFunk@alum.mit.edu, sblakewilson@nl.safenet-inc.com +# RFC5282 || D. Black, D. McGrew || black_david@emc.com, mcgrew@cisco.com +# RFC5283 || B. Decraene, JL. Le Roux, I. Minei || bruno.decraene@orange-ftgroup.com, jeanlouis.leroux@orange-ftgroup.com, ina@juniper.net +# RFC5284 || G. Swallow, A. Farrel || swallow@cisco.com, adrian@olddog.co.uk +# RFC5285 || D. Singer, H. Desineni || singer@apple.com, hd@qualcomm.com +# RFC5286 || A. Atlas, Ed., A. Zinin, Ed. || alia.atlas@bt.com, alex.zinin@alcatel-lucent.com +# RFC5287 || A. Vainshtein, Y(J). Stein || Alexander.Vainshtein@ecitele.com, yaakov_s@rad.com +# RFC5288 || J. Salowey, A. Choudhury, D. McGrew || jsalowey@cisco.com, abhijitc@cisco.com, mcgrew@cisco.com +# RFC5289 || E. Rescorla || ekr@rtfm.com +# RFC5290 || S. Floyd, M. Allman || floyd@icir.org, mallman@icir.org +# RFC5291 || E. Chen, Y. Rekhter || enkechen@cisco.com, yakov@juniper.net +# RFC5292 || E. Chen, S. Sangli || enkechen@cisco.com, rsrihari@cisco.com +# RFC5293 || J. Degener, P. Guenther || jutta@pobox.com, guenther@sendmail.com +# RFC5294 || P. Savola, J. Lingard || psavola@funet.fi, jchl@arastra.com +# RFC5295 || J. Salowey, L. Dondeti, V. Narayanan, M. Nakhjiri || jsalowey@cisco.com, ldondeti@qualcomm.com, vidyan@qualcomm.com, madjid.nakhjiri@motorola.com +# RFC5296 || V. Narayanan, L. Dondeti || vidyan@qualcomm.com, ldondeti@qualcomm.com +# RFC5297 || D. Harkins || dharkins@arubanetworks.com +# RFC5298 || T. Takeda, Ed., A. Farrel, Ed., Y. Ikejiri, JP. Vasseur || takeda.tomonori@lab.ntt.co.jp, y.ikejiri@ntt.com, adrian@olddog.co.uk, jpv@cisco.com +# RFC5301 || D. McPherson, N. Shen || danny@arbor.net, naiming@cisco.com +# RFC5302 || T. Li, H. Smit, T. Przygienda || tony.li@tony.li, hhw.smit@xs4all.nl, prz@net4u.ch +# RFC5303 || D. Katz, R. Saluja, D. Eastlake 3rd || dkatz@juniper.net, rajesh.saluja@tenetindia.com, d3e3e3@gmail.com +# RFC5304 || T. Li, R. Atkinson || tony.li@tony.li, rja@extremenetworks.com +# RFC5305 || T. Li, H. Smit || tony.li@tony.li, hhwsmit@xs4all.nl +# RFC5306 || M. Shand, L. Ginsberg || mshand@cisco.com, ginsberg@cisco.com +# RFC5307 || K. Kompella, Ed., Y. Rekhter, Ed. || kireeti@juniper.net, yakov@juniper.net +# RFC5308 || C. Hopps || chopps@cisco.com +# RFC5309 || N. Shen, Ed., A. Zinin, Ed. || naiming@cisco.com, alex.zinin@alcatel-lucent.com +# RFC5310 || M. Bhatia, V. Manral, T. Li, R. Atkinson, R. White, M. Fanto || manav@alcatel-lucent.com, vishwas@ipinfusion.com, tony.li@tony.li, rja@extremenetworks.com, riw@cisco.com, mfanto@aegisdatasecurity.com +# RFC5311 || D. McPherson, Ed., L. Ginsberg, S. Previdi, M. Shand || danny@arbor.net, ginsberg@cisco.com, sprevidi@cisco.com, mshand@cisco.com +# RFC5316 || M. Chen, R. Zhang, X. Duan || mach@huawei.com, zhangrenhai@huawei.com, duanxiaodong@chinamobile.com +# RFC5317 || S. Bryant, Ed., L. Andersson, Ed. || stbryant@cisco.com, loa@pi.nu +# RFC5318 || J. Hautakorpi, G. Camarillo || Jani.Hautakorpi@ericsson.com, Gonzalo.Camarillo@ericsson.com +# RFC5320 || F. Templin, Ed. || fltemplin@acm.org +# RFC5321 || J. Klensin || john+smtp@jck.com +# RFC5322 || P. Resnick, Ed. || presnick@qti.qualcomm.com +# RFC5323 || J. Reschke, Ed., S. Reddy, J. Davis, A. Babich || julian.reschke@greenbytes.de, Surendra.Reddy@mitrix.com, jrd3@alum.mit.edu, ababich@us.ibm.com +# RFC5324 || C. DeSanti, F. Maino, K. McCloghrie || cds@cisco.com, fmaino@cisco.com, kzm@cisco.com +# RFC5325 || S. Burleigh, M. Ramadas, S. Farrell || Scott.Burleigh@jpl.nasa.gov, mramadas@gmail.com, stephen.farrell@cs.tcd.ie +# RFC5326 || M. Ramadas, S. Burleigh, S. Farrell || mramadas@gmail.com, Scott.Burleigh@jpl.nasa.gov, stephen.farrell@cs.tcd.ie +# RFC5327 || S. Farrell, M. Ramadas, S. Burleigh || stephen.farrell@cs.tcd.ie, mramadas@gmail.com, Scott.Burleigh@jpl.nasa.gov +# RFC5328 || A. Adolf, P. MacAvock || alexander.adolf@micronas.com, macavock@dvb.org +# RFC5329 || K. Ishiguro, V. Manral, A. Davey, A. Lindem, Ed. || kunihiro@ipinfusion.com, vishwas@ipinfusion.com, Alan.Davey@dataconnection.com, acee@redback.com +# RFC5330 || JP. Vasseur, Ed., M. Meyer, K. Kumaki, A. Bonda || jpv@cisco.com, matthew.meyer@bt.com, ke-kumaki@kddi.com, alberto.tempiabonda@telecomitalia.it +# RFC5331 || R. Aggarwal, Y. Rekhter, E. Rosen || rahul@juniper.net, yakov@juniper.net, erosen@cisco.com +# RFC5332 || T. Eckert, E. Rosen, Ed., R. Aggarwal, Y. Rekhter || eckert@cisco.com, erosen@cisco.com, rahul@juniper.net, yakov@juniper.net +# RFC5333 || R. Mahy, B. Hoeneisen || rohan@ekabal.com, bernie@ietf.hoeneisen.ch +# RFC5334 || I. Goncalves, S. Pfeiffer, C. Montgomery || justivo@gmail.com, silvia@annodex.net, monty@xiph.org +# RFC5335 || A. Yang, Ed. || abelyang@twnic.net.tw +# RFC5336 || J. Yao, Ed., W. Mao, Ed. || yaojk@cnnic.cn, maowei_ietf@cnnic.cn +# RFC5337 || C. Newman, A. Melnikov, Ed. || chris.newman@sun.com, Alexey.Melnikov@isode.com +# RFC5338 || T. Henderson, P. Nikander, M. Komu || thomas.r.henderson@boeing.com, pekka.nikander@nomadiclab.com, miika@iki.fi +# RFC5339 || JL. Le Roux, Ed., D. Papadimitriou, Ed. || jeanlouis.leroux@orange-ftgroup.com, dimitri.papadimitriou@alcatel-lucent.be +# RFC5340 || R. Coltun, D. Ferguson, J. Moy, A. Lindem || none, dennis@juniper.net, jmoy@sycamorenet.com, acee@redback.com +# RFC5341 || C. Jennings, V. Gurbani || fluffy@cisco.com, vkg@alcatel-lucent.com +# RFC5342 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC5343 || J. Schoenwaelder || j.schoenwaelder@jacobs-university.de +# RFC5344 || A. Houri, E. Aoki, S. Parameswar || avshalom@il.ibm.com, aoki@aol.net, Sriram.Parameswar@microsoft.com +# RFC5345 || J. Schoenwaelder || j.schoenwaelder@jacobs-university.de +# RFC5346 || J. Lim, W. Kim, C. Park, L. Conroy || jhlim@nida.or.kr, wkim@nida.or.kr, ckp@nida.or.kr, lconroy@insensate.co.uk +# RFC5347 || F. Andreasen, D. Hancock || fandreas@cisco.com, d.hancock@cablelabs.com +# RFC5348 || S. Floyd, M. Handley, J. Padhye, J. Widmer || floyd@icir.org, M.Handley@cs.ucl.ac.uk, padhye@microsoft.com, widmer@acm.org +# RFC5349 || L. Zhu, K. Jaganathan, K. Lauter || lzhu@microsoft.com, karthikj@microsoft.com, klauter@microsoft.com +# RFC5350 || J. Manner, A. McDonald || jukka.manner@tkk.fi, andrew.mcdonald@roke.co.uk +# RFC5351 || P. Lei, L. Ong, M. Tuexen, T. Dreibholz || peterlei@cisco.com, Lyong@Ciena.com, tuexen@fh-muenster.de, dreibh@iem.uni-due.de +# RFC5352 || R. Stewart, Q. Xie, M. Stillman, M. Tuexen || randall@lakerest.net, Qiaobing.Xie@gmail.org, maureen.stillman@nokia.com, tuexen@fh-muenster.de +# RFC5353 || Q. Xie, R. Stewart, M. Stillman, M. Tuexen, A. Silverton || Qiaobing.Xie@gmail.org, randall@lakerest.net, maureen.stillman@nokia.com, tuexen@fh-muenster.de, ajs.ietf@gmail.com +# RFC5354 || R. Stewart, Q. Xie, M. Stillman, M. Tuexen || randall@lakerest.net, Qiaobing.Xie@gmail.org, maureen.stillman@nokia.com, tuexen@fh-muenster.de +# RFC5355 || M. Stillman, Ed., R. Gopal, E. Guttman, S. Sengodan, M. Holdrege || maureen.stillman@nokia.com, ram.gopal@nsn.com, Erik.Guttman@sun.com, Senthil.sengodan@nsn.com, Holdrege@gmail.com +# RFC5356 || T. Dreibholz, M. Tuexen || dreibh@iem.uni-due.de, tuexen@fh-muenster.de +# RFC5357 || K. Hedayat, R. Krzanowski, A. Morton, K. Yum, J. Babiarz || khedayat@brixnet.com, roman.krzanowski@verizon.com, acmorton@att.com, kyum@juniper.net, babiarz@nortel.com +# RFC5358 || J. Damas, F. Neves || Joao_Damas@isc.org, fneves@registro.br +# RFC5359 || A. Johnston, Ed., R. Sparks, C. Cunningham, S. Donovan, K. Summers || alan@sipstation.com, RjS@nostrum.com, chrcunni@cisco.com, srd@cisco.com, ksummers@sonusnet.com +# RFC5360 || J. Rosenberg, G. Camarillo, Ed., D. Willis || jdrosen@cisco.com, Gonzalo.Camarillo@ericsson.com, dean.willis@softarmor.com +# RFC5361 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC5362 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC5363 || G. Camarillo, A.B. Roach || Gonzalo.Camarillo@ericsson.com, Adam.Roach@tekelec.com +# RFC5364 || M. Garcia-Martin, G. Camarillo || miguel.a.garcia@ericsson.com, Gonzalo.Camarillo@ericsson.com +# RFC5365 || M. Garcia-Martin, G. Camarillo || miguel.a.garcia@ericsson.com, Gonzalo.Camarillo@ericsson.com +# RFC5366 || G. Camarillo, A. Johnston || Gonzalo.Camarillo@ericsson.com, alan@sipstation.com +# RFC5367 || G. Camarillo, A.B. Roach, O. Levin || Gonzalo.Camarillo@ericsson.com, Adam.Roach@tekelec.com, oritl@microsoft.com +# RFC5368 || G. Camarillo, A. Niemi, M. Isomaki, M. Garcia-Martin, H. Khartabil || Gonzalo.Camarillo@ericsson.com, Aki.Niemi@nokia.com, markus.isomaki@nokia.com, miguel.a.garcia@ericsson.com, hisham.khartabil@gmail.com +# RFC5369 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC5370 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC5371 || S. Futemma, E. Itakura, A. Leung || satosi-f@sm.sony.co.jp, itakura@sm.sony.co.jp, andrew@ualberta.net +# RFC5372 || A. Leung, S. Futemma, E. Itakura || andrew@ualberta.net, satosi-f@sm.sony.co.jp, itakura@sm.sony.co.jp +# RFC5373 || D. Willis, Ed., A. Allen || dean.willis@softarmor.com, aallen@rim.com +# RFC5374 || B. Weis, G. Gross, D. Ignjatic || bew@cisco.com, gmgross@securemulticast.net, dignjatic@polycom.com +# RFC5375 || G. Van de Velde, C. Popoviciu, T. Chown, O. Bonness, C. Hahn || gunter@cisco.com, cpopovic@cisco.com, tjc@ecs.soton.ac.uk, Olaf.Bonness@t-systems.com, HahnC@t-systems.com +# RFC5376 || N. Bitar, R. Zhang, K. Kumaki || nabil.n.bitar@verizon.com, ke-kumaki@kddi.com, Raymond.zhang@bt.com +# RFC5377 || J. Halpern, Ed. || jmh@joelhalpern.com +# RFC5378 || S. Bradner, Ed., J. Contreras, Ed. || sob@harvard.edu, jorge.contreras@wilmerhale.com +# RFC5379 || M. Munakata, S. Schubert, T. Ohba || munakata.mayumi@lab.ntt.co.jp, shida@ntt-at.com, ohba.takumi@lab.ntt.co.jp +# RFC5380 || H. Soliman, C. Castelluccia, K. ElMalki, L. Bellier || hesham@elevatemobile.com, claude.castelluccia@inria.fr, karim@athonet.com, ludovic.bellier@inria.fr +# RFC5381 || T. Iijima, Y. Atarashi, H. Kimura, M. Kitani, H. Okita || tomoyuki.iijima@alaxala.com, atarashi@alaxala.net, h-kimura@alaxala.net, makoto.kitani@alaxala.com, hideki.okita.pf@hitachi.com +# RFC5382 || S. Guha, Ed., K. Biswas, B. Ford, S. Sivakumar, P. Srisuresh || saikat@cs.cornell.edu, kbiswas@cisco.com, baford@mpi-sws.org, ssenthil@cisco.com, srisuresh@yahoo.com +# RFC5383 || R. Gellens || randy@qualcomm.com +# RFC5384 || A. Boers, I. Wijnands, E. Rosen || aboers@cisco.com, ice@cisco.com, erosen@cisco.com +# RFC5385 || J. Touch || touch@isi.edu +# RFC5386 || N. Williams, M. Richardson || Nicolas.Williams@sun.com, mcr@sandelman.ottawa.on.ca +# RFC5387 || J. Touch, D. Black, Y. Wang || touch@isi.edu, black_david@emc.com, yu-shun.wang@microsoft.com +# RFC5388 || S. Niccolini, S. Tartarelli, J. Quittek, T. Dietz, M. Swany || saverio.niccolini@nw.neclab.eu, sandra.tartarelli@nw.neclab.eu, quittek@nw.neclab.eu, thomas.dietz@nw.neclab.eu, swany@UDel.Edu +# RFC5389 || J. Rosenberg, R. Mahy, P. Matthews, D. Wing || jdrosen@cisco.com, rohan@ekabal.com, philip_matthews@magma.ca, dwing-ietf@fuggles.com +# RFC5390 || J. Rosenberg || jdrosen@cisco.com +# RFC5391 || A. Sollaud || aurelien.sollaud@orange-ftgroup.com +# RFC5392 || M. Chen, R. Zhang, X. Duan || mach@huawei.com, zhangrenhai@huawei.com, duanxiaodong@chinamobile.com +# RFC5393 || R. Sparks, Ed., S. Lawrence, A. Hawrylyshen, B. Campen || RjS@nostrum.com, scott.lawrence@nortel.com, alan.ietf@polyphase.ca, bcampen@estacado.net +# RFC5394 || I. Bryskin, D. Papadimitriou, L. Berger, J. Ash || ibryskin@advaoptical.com, dimitri.papadimitriou@alcatel.be, lberger@labn.net, gash5107@yahoo.com +# RFC5395 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC5396 || G. Huston, G. Michaelson || gih@apnic.net, ggm@apnic.net +# RFC5397 || W. Sanchez, C. Daboo || wsanchez@wsanchez.net, cyrus@daboo.name +# RFC5398 || G. Huston || gih@apnic.net +# RFC5401 || B. Adamson, C. Bormann, M. Handley, J. Macker || adamson@itd.nrl.navy.mil, cabo@tzi.org, M.Handley@cs.ucl.ac.uk, macker@itd.nrl.navy.mil +# RFC5402 || T. Harding, Ed. || tharding@us.axway.com +# RFC5403 || M. Eisler || mike@eisler.com +# RFC5404 || M. Westerlund, I. Johansson || magnus.westerlund@ericsson.com, ingemar.s.johansson@ericsson.com +# RFC5405 || L. Eggert, G. Fairhurst || lars.eggert@nokia.com, gorry@erg.abdn.ac.uk +# RFC5406 || S. Bellovin || bellovin@acm.org +# RFC5407 || M. Hasebe, J. Koshiko, Y. Suzuki, T. Yoshikawa, P. Kyzivat || hasebe.miki@east.ntt.co.jp, j.koshiko@east.ntt.co.jp, suzuki.yasushi@lab.ntt.co.jp, tomoyuki.yoshikawa@east.ntt.co.jp, pkyzivat@cisco.com +# RFC5408 || G. Appenzeller, L. Martin, M. Schertler || appenz@cs.stanford.edu, martin@voltage.com, mschertler@us.axway.com +# RFC5409 || L. Martin, M. Schertler || martin@voltage.com, mschertler@us.axway.com +# RFC5410 || A. Jerichow, Ed., L. Piron || anja.jerichow@nsn.com, laurent.piron@nagravision.com +# RFC5411 || J. Rosenberg || jdrosen@cisco.com +# RFC5412 || P. Calhoun, R. Suri, N. Cam-Winget, M. Williams, S. Hares, B. O'Hara, S. Kelly || pcalhoun@cisco.com, rsuri@cisco.com, ncamwing@cisco.com, gwhiz@gwhiz.com, shares@ndzh.com, bob.ohara@computer.org, scott@hyperthought.com +# RFC5413 || P. Narasimhan, D. Harkins, S. Ponnuswamy || partha@arubanetworks.com, dharkins@arubanetworks.com, subbu@arubanetworks.com +# RFC5414 || S. Iino, S. Govindan, M. Sugiura, H. Cheng || iino.satoshi@jp.panasonic.com, saravanan.govindan@sg.panasonic.com, sugiura.mikihito@jp.panasonic.com, hong.cheng@sg.panasonic.com +# RFC5415 || P. Calhoun, Ed., M. Montemurro, Ed., D. Stanley, Ed. || pcalhoun@cisco.com, mmontemurro@rim.com, dstanley@arubanetworks.com +# RFC5416 || P. Calhoun, Ed., M. Montemurro, Ed., D. Stanley, Ed. || pcalhoun@cisco.com, mmontemurro@rim.com, dstanley@arubanetworks.com +# RFC5417 || P. Calhoun || pcalhoun@cisco.com +# RFC5418 || S. Kelly, T. Clancy || scott@hyperthought.com, clancy@LTSnet.net +# RFC5419 || B. Patil, G. Dommety || basavaraj.patil@nokia.com, gdommety@cisco.com +# RFC5420 || A. Farrel, Ed., D. Papadimitriou, JP. Vasseur, A. Ayyangarps || adrian@olddog.co.uk, dimitri.papadimitriou@alcatel.be, jpv@cisco.com, arthi@juniper.net +# RFC5421 || N. Cam-Winget, H. Zhou || ncamwing@cisco.com, hzhou@cisco.com +# RFC5422 || N. Cam-Winget, D. McGrew, J. Salowey, H. Zhou || ncamwing@cisco.com, mcgrew@cisco.com, jsalowey@cisco.com, hzhou@cisco.com +# RFC5423 || R. Gellens, C. Newman || rg+ietf@qualcomm.com, chris.newman@sun.com +# RFC5424 || R. Gerhards || rgerhards@adiscon.com +# RFC5425 || F. Miao, Ed., Y. Ma, Ed., J. Salowey, Ed. || miaofy@huawei.com, myz@huawei.com, jsalowey@cisco.com +# RFC5426 || A. Okmianski || aokmians@cisco.com +# RFC5427 || G. Keeni || glenn@cysols.com +# RFC5428 || S. Channabasappa, W. De Ketelaere, E. Nechamkin || Sumanth@cablelabs.com, deketelaere@tComLabs.com, enechamkin@broadcom.com +# RFC5429 || A. Stone, Ed. || aaron@serendipity.palo-alto.ca.us +# RFC5430 || M. Salter, E. Rescorla, R. Housley || msalter@restarea.ncsc.mil, ekr@rtfm.com, housley@vigilsec.com +# RFC5431 || D. Sun || dongsun@alcatel-lucent.com +# RFC5432 || J. Polk, S. Dhesikan, G. Camarillo || jmpolk@cisco.com, sdhesika@cisco.com, Gonzalo.Camarillo@ericsson.com +# RFC5433 || T. Clancy, H. Tschofenig || clancy@ltsnet.net, Hannes.Tschofenig@gmx.net +# RFC5434 || T. Narten || narten@us.ibm.com +# RFC5435 || A. Melnikov, Ed., B. Leiba, Ed., W. Segmuller, T. Martin || Alexey.Melnikov@isode.com, leiba@watson.ibm.com, werewolf@us.ibm.com, timmartin@alumni.cmu.edu +# RFC5436 || B. Leiba, M. Haardt || leiba@watson.ibm.com, michael.haardt@freenet.ag +# RFC5437 || P. Saint-Andre, A. Melnikov || ietf@stpeter.im, Alexey.Melnikov@isode.com +# RFC5438 || E. Burger, H. Khartabil || eburger@standardstrack.com, hisham.khartabil@gmail.com +# RFC5439 || S. Yasukawa, A. Farrel, O. Komolafe || s.yasukawa@hco.ntt.co.jp, adrian@olddog.co.uk, femi@cisco.com +# RFC5440 || JP. Vasseur, Ed., JL. Le Roux, Ed. || jpv@cisco.com, jeanlouis.leroux@orange-ftgroup.com +# RFC5441 || JP. Vasseur, Ed., R. Zhang, N. Bitar, JL. Le Roux || jpv@cisco.com, raymond.zhang@bt.com, nabil.n.bitar@verizon.com, jeanlouis.leroux@orange-ftgroup.com +# RFC5442 || E. Burger, G. Parsons || eburger@standardstrack.com, gparsons@nortel.com +# RFC5443 || M. Jork, A. Atlas, L. Fang || Markus.Jork@genband.com, alia.atlas@bt.com, lufang@cisco.com +# RFC5444 || T. Clausen, C. Dearlove, J. Dean, C. Adjih || T.Clausen@computer.org, chris.dearlove@baesystems.com, jdean@itd.nrl.navy.mil, Cedric.Adjih@inria.fr +# RFC5445 || M. Watson || mark@digitalfountain.com +# RFC5446 || J. Korhonen, U. Nilsson || jouni.nospam@gmail.com, ulf.s.nilsson@teliasonera.com +# RFC5447 || J. Korhonen, Ed., J. Bournelle, H. Tschofenig, C. Perkins, K. Chowdhury || jouni.nospam@gmail.com, julien.bournelle@orange-ftgroup.com, Hannes.Tschofenig@nsn.com, charliep@wichorus.com, kchowdhury@starentnetworks.com +# RFC5448 || J. Arkko, V. Lehtovirta, P. Eronen || jari.arkko@piuha.net, vesa.lehtovirta@ericsson.com, pe@iki.fi +# RFC5449 || E. Baccelli, P. Jacquet, D. Nguyen, T. Clausen || Emmanuel.Baccelli@inria.fr, Philippe.Jacquet@inria.fr, dang.nguyen@crc.ca, T.Clausen@computer.org +# RFC5450 || D. Singer, H. Desineni || singer@apple.com, hd@qualcomm.com +# RFC5451 || M. Kucherawy || msk+ietf@sendmail.com +# RFC5452 || A. Hubert, R. van Mook || bert.hubert@netherlabs.nl, remco@eu.equinix.com +# RFC5453 || S. Krishnan || suresh.krishnan@ericsson.com +# RFC5454 || G. Tsirtsis, V. Park, H. Soliman || tsirtsis@googlemail.com, vpark@qualcomm.com, hesham@elevatemobile.com +# RFC5455 || S. Sivabalan, Ed., J. Parker, S. Boutros, K. Kumaki || msiva@cisco.com, jdparker@cisco.com, sboutros@cisco.com, ke-kumaki@kddi.com +# RFC5456 || M. Spencer, B. Capouch, E. Guy, Ed., F. Miller, K. Shumard || markster@digium.com, brianc@saintjoe.edu, edguy@emcsw.com, mail@frankwmiller.net, kshumard@gmail.com +# RFC5457 || E. Guy, Ed. || edguy@emcsw.com +# RFC5458 || H. Cruickshank, P. Pillai, M. Noisternig, S. Iyengar || h.cruickshank@surrey.ac.uk, p.pillai@bradford.ac.uk, mnoist@cosy.sbg.ac.at, sunil.iyengar@logica.com +# RFC5459 || A. Sollaud || aurelien.sollaud@orange-ftgroup.com +# RFC5460 || M. Stapp || mjs@cisco.com +# RFC5461 || F. Gont || fernando@gont.com.ar +# RFC5462 || L. Andersson, R. Asati || loa@pi.nu, rajiva@cisco.com +# RFC5463 || N. Freed || ned.freed@mrochek.com +# RFC5464 || C. Daboo || cyrus@daboo.name +# RFC5465 || A. Gulbrandsen, C. King, A. Melnikov || arnt@oryx.com, Curtis.King@isode.com, Alexey.Melnikov@isode.com +# RFC5466 || A. Melnikov, C. King || Alexey.Melnikov@isode.com, Curtis.King@isode.com +# RFC5467 || L. Berger, A. Takacs, D. Caviglia, D. Fedyk, J. Meuric || lberger@labn.net, attila.takacs@ericsson.com, diego.caviglia@ericsson.com, dwfedyk@nortel.com, julien.meuric@orange-ftgroup.com +# RFC5468 || S. Dasgupta, J. de Oliveira, JP. Vasseur || sukrit@ece.drexel.edu, jau@ece.drexel.edu, jpv@cisco.com +# RFC5469 || P. Eronen, Ed. || pe@iki.fi +# RFC5470 || G. Sadasivan, N. Brownlee, B. Claise, J. Quittek || gsadasiv@rohati.com, n.brownlee@auckland.ac.nz, bclaise@cisco.com, quittek@nw.neclab.eu +# RFC5471 || C. Schmoll, P. Aitken, B. Claise || carsten.schmoll@fokus.fraunhofer.de, paitken@cisco.com, bclaise@cisco.com +# RFC5472 || T. Zseby, E. Boschi, N. Brownlee, B. Claise || tanja.zseby@fokus.fraunhofer.de, elisa.boschi@hitachi-eu.com, nevil@caida.org, bclaise@cisco.com +# RFC5473 || E. Boschi, L. Mark, B. Claise || elisa.boschi@hitachi-eu.com, lutz.mark@ifam.fraunhofer.de, bclaise@cisco.com +# RFC5474 || N. Duffield, Ed., D. Chiou, B. Claise, A. Greenberg, M. Grossglauser, J. Rexford || duffield@research.att.com, Derek@ece.utexas.edu, bclaise@cisco.com, albert@microsoft.com, matthias.grossglauser@epfl.ch, jrex@cs.princeton.edu +# RFC5475 || T. Zseby, M. Molina, N. Duffield, S. Niccolini, F. Raspall || tanja.zseby@fokus.fraunhofer.de, maurizio.molina@dante.org.uk, duffield@research.att.com, saverio.niccolini@netlab.nec.de, fredi@entel.upc.es +# RFC5476 || B. Claise, Ed., A. Johnson, J. Quittek || bclaise@cisco.com, andrjohn@cisco.com, quittek@nw.neclab.eu +# RFC5477 || T. Dietz, B. Claise, P. Aitken, F. Dressler, G. Carle || Thomas.Dietz@nw.neclab.eu, bclaise@cisco.com, paitken@cisco.com, dressler@informatik.uni-erlangen.de, carle@informatik.uni-tuebingen.de +# RFC5478 || J. Polk || jmpolk@cisco.com +# RFC5479 || D. Wing, Ed., S. Fries, H. Tschofenig, F. Audet || dwing-ietf@fuggles.com, steffen.fries@siemens.com, Hannes.Tschofenig@nsn.com, audet@nortel.com +# RFC5480 || S. Turner, D. Brown, K. Yiu, R. Housley, T. Polk || turners@ieca.com, kelviny@microsoft.com, dbrown@certicom.com, housley@vigilsec.com, wpolk@nist.gov +# RFC5481 || A. Morton, B. Claise || acmorton@att.com, bclaise@cisco.com +# RFC5482 || L. Eggert, F. Gont || lars.eggert@nokia.com, fernando@gont.com.ar +# RFC5483 || L. Conroy, K. Fujiwara || lconroy@insensate.co.uk, fujiwara@jprs.co.jp +# RFC5484 || D. Singer || singer@apple.com +# RFC5485 || R. Housley || housley@vigilsec.com +# RFC5486 || D. Malas, Ed., D. Meyer, Ed. || d.malas@cablelabs.com, dmm@1-4-5.net +# RFC5487 || M. Badra || badra@isima.fr +# RFC5488 || S. Gundavelli, G. Keeni, K. Koide, K. Nagami || sgundave@cisco.com, glenn@cysols.com, ka-koide@kddi.com, nagami@inetcore.com +# RFC5489 || M. Badra, I. Hajjeh || badra@isima.fr, ibrahim.hajjeh@ineovation.fr +# RFC5490 || A. Melnikov || Alexey.Melnikov@isode.com +# RFC5491 || J. Winterbottom, M. Thomson, H. Tschofenig || james.winterbottom@andrew.com, martin.thomson@andrew.com, Hannes.Tschofenig@gmx.net +# RFC5492 || J. Scudder, R. Chandra || jgs@juniper.net, rchandra@sonoasystems.com +# RFC5493 || D. Caviglia, D. Bramanti, D. Li, D. McDysan || diego.caviglia@ericsson.com, dino.bramanti@ericsson.com, danli@huawei.com, dave.mcdysan@verizon.com +# RFC5494 || J. Arkko, C. Pignataro || jari.arkko@piuha.net, cpignata@cisco.com +# RFC5495 || D. Li, J. Gao, A. Satyanarayana, S. Bardalai || danli@huawei.com, gjhhit@huawei.com, asatyana@cisco.com, snigdho.bardalai@us.fujitsu.com +# RFC5496 || IJ. Wijnands, A. Boers, E. Rosen || ice@cisco.com, aboers@cisco.com, erosen@cisco.com +# RFC5497 || T. Clausen, C. Dearlove || T.Clausen@computer.org, chris.dearlove@baesystems.com +# RFC5498 || I. Chakeres || ian.chakeres@gmail.com +# RFC5501 || Y. Kamite, Ed., Y. Wada, Y. Serbest, T. Morin, L. Fang || y.kamite@ntt.com, wada.yuichiro@lab.ntt.co.jp, yetik_serbest@labs.att.com, thomas.morin@francetelecom.com, lufang@cisco.com +# RFC5502 || J. van Elburg || HansErik.van.Elburg@ericsson.com +# RFC5503 || F. Andreasen, B. McKibben, B. Marshall || fandreas@cisco.com, B.McKibben@cablelabs.com, wtm@research.att.com +# RFC5504 || K. Fujiwara, Ed., Y. Yoneya, Ed. || fujiwara@jprs.co.jp, yone@jprs.co.jp +# RFC5505 || B. Aboba, D. Thaler, L. Andersson, S. Cheshire || bernarda@microsoft.com, dthaler@microsoft.com, loa.andersson@ericsson.com, cheshire@apple.com +# RFC5506 || I. Johansson, M. Westerlund || ingemar.s.johansson@ericsson.com, magnus.westerlund@ericsson.com +# RFC5507 || IAB, P. Faltstrom, Ed., R. Austein, Ed., P. Koch, Ed. || iab@iab.org, paf@cisco.com, sra@isc.org, pk@denic.de +# RFC5508 || P. Srisuresh, B. Ford, S. Sivakumar, S. Guha || srisuresh@yahoo.com, baford@mpi-sws.org, ssenthil@cisco.com, saikat@cs.cornell.edu +# RFC5509 || S. Loreto || Salvatore.Loreto@ericsson.com +# RFC5510 || J. Lacan, V. Roca, J. Peltotalo, S. Peltotalo || jerome.lacan@isae.fr, vincent.roca@inria.fr, jani.peltotalo@tut.fi, sami.peltotalo@tut.fi +# RFC5511 || A. Farrel || adrian@olddog.co.uk +# RFC5512 || P. Mohapatra, E. Rosen || pmohapat@cisco.com, erosen@cisco.com +# RFC5513 || A. Farrel || adrian@olddog.co.uk +# RFC5514 || E. Vyncke || evyncke@cisco.com +# RFC5515 || V. Mammoliti, C. Pignataro, P. Arberg, J. Gibbons, P. Howard || vince@cisco.com, cpignata@cisco.com, parberg@redback.com, jgibbons@juniper.net, howsoft@mindspring.com +# RFC5516 || M. Jones, L. Morand || mark.jones@bridgewatersystems.com, lionel.morand@orange-ftgroup.com +# RFC5517 || S. HomChaudhuri, M. Foschiano || sanjibhc@gmail.com, foschia@cisco.com +# RFC5518 || P. Hoffman, J. Levine, A. Hathcock || paul.hoffman@domain-assurance.org, john.levine@domain-assurance.org, arvel.hathcock@altn.com +# RFC5519 || J. Chesterfield, B. Haberman, Ed. || julian.chesterfield@cl.cam.ac.uk, brian@innovationslab.net +# RFC5520 || R. Bradford, Ed., JP. Vasseur, A. Farrel || rbradfor@cisco.com, jpv@cisco.com, adrian@olddog.co.uk +# RFC5521 || E. Oki, T. Takeda, A. Farrel || oki@ice.uec.ac.jp, takeda.tomonori@lab.ntt.co.jp, adrian@olddog.co.uk +# RFC5522 || W. Eddy, W. Ivancic, T. Davis || weddy@grc.nasa.gov, William.D.Ivancic@grc.nasa.gov, Terry.L.Davis@boeing.com +# RFC5523 || L. Berger || lberger@labn.net +# RFC5524 || D. Cridland || dave.cridland@isode.com +# RFC5525 || T. Dreibholz, J. Mulik || dreibh@iem.uni-due.de, jaiwant@mulik.com +# RFC5526 || J. Livingood, P. Pfautz, R. Stastny || jason_livingood@cable.comcast.com, ppfautz@att.com, richard.stastny@gmail.com +# RFC5527 || M. Haberler, O. Lendl, R. Stastny || ietf@mah.priv.at, otmar.lendl@enum.at, richardstastny@gmail.com +# RFC5528 || A. Kato, M. Kanda, S. Kanno || akato@po.ntts.co.jp, kanda.masayuki@lab.ntt.co.jp, kanno-s@po.ntts.co.jp +# RFC5529 || A. Kato, M. Kanda, S. Kanno || akato@po.ntts.co.jp, kanda.masayuki@lab.ntt.co.jp, kanno-s@po.ntts.co.jp +# RFC5530 || A. Gulbrandsen || arnt@oryx.com +# RFC5531 || R. Thurlow || robert.thurlow@sun.com +# RFC5532 || T. Talpey, C. Juszczak || tmtalpey@gmail.com, chetnh@earthlink.net +# RFC5533 || E. Nordmark, M. Bagnulo || erik.nordmark@sun.com, marcelo@it.uc3m.es +# RFC5534 || J. Arkko, I. van Beijnum || jari.arkko@ericsson.com, iljitsch@muada.com +# RFC5535 || M. Bagnulo || marcelo@it.uc3m.es +# RFC5536 || K. Murchison, Ed., C. Lindsey, D. Kohn || murch@andrew.cmu.edu, chl@clerew.man.ac.uk, dan@dankohn.com +# RFC5537 || R. Allbery, Ed., C. Lindsey || rra@stanford.edu, chl@clerew.man.ac.uk +# RFC5538 || F. Ellermann || hmdmhdfmhdjmzdtjmzdtzktdkztdjz@gmail.com +# RFC5539 || M. Badra || badra@isima.fr +# RFC5540 || RFC Editor || rfc-editor@rfc-editor.org +# RFC5541 || JL. Le Roux, JP. Vasseur, Y. Lee || jeanlouis.leroux@orange-ftgroup.com, jpv@cisco.com, ylee@huawei.com +# RFC5542 || T. Nadeau, Ed., D. Zelig, Ed., O. Nicklass, Ed. || tom.nadeau@bt.com, davidz@oversi.com, orlyn@radvision.com +# RFC5543 || H. Ould-Brahim, D. Fedyk, Y. Rekhter || hbrahim@nortel.com, donald.fedyk@alcatel-lucent.com, yakov@juniper.com +# RFC5544 || A. Santoni || adriano.santoni@actalis.it +# RFC5545 || B. Desruisseaux, Ed. || bernard.desruisseaux@oracle.com +# RFC5546 || C. Daboo, Ed. || cyrus@daboo.name +# RFC5547 || M. Garcia-Martin, M. Isomaki, G. Camarillo, S. Loreto, P. Kyzivat || miguel.a.garcia@ericsson.com, markus.isomaki@nokia.com, Gonzalo.Camarillo@ericsson.com, Salvatore.Loreto@ericsson.com, pkyzivat@cisco.com +# RFC5548 || M. Dohler, Ed., T. Watteyne, Ed., T. Winter, Ed., D. Barthel, Ed. || mischa.dohler@cttc.es, watteyne@eecs.berkeley.edu, wintert@acm.org, Dominique.Barthel@orange-ftgroup.com +# RFC5549 || F. Le Faucheur, E. Rosen || flefauch@cisco.com, erosen@cisco.com +# RFC5550 || D. Cridland, Ed., A. Melnikov, Ed., S. Maes, Ed. || dave.cridland@isode.com, Alexey.Melnikov@isode.com, stephane.maes@oracle.com +# RFC5551 || R. Gellens, Ed. || rg+ietf@qualcomm.com +# RFC5552 || D. Burke, M. Scott || daveburke@google.com, Mark.Scott@genesyslab.com +# RFC5553 || A. Farrel, Ed., R. Bradford, JP. Vasseur || adrian@olddog.co.uk, rbradfor@cisco.com, jpv@cisco.com +# RFC5554 || N. Williams || Nicolas.Williams@sun.com +# RFC5555 || H. Soliman, Ed. || hesham@elevatemobile.com +# RFC5556 || J. Touch, R. Perlman || touch@isi.edu, Radia.Perlman@sun.com +# RFC5557 || Y. Lee, JL. Le Roux, D. King, E. Oki || ylee@huawei.com, jeanlouis.leroux@orange-ftgroup.com, daniel@olddog.co.uk, oki@ice.uec.ac.jp +# RFC5558 || F. Templin, Ed. || fltemplin@acm.org +# RFC5559 || P. Eardley, Ed. || philip.eardley@bt.com +# RFC5560 || H. Uijterwaal || henk@ripe.net +# RFC5561 || B. Thomas, K. Raza, S. Aggarwal, R. Aggarwal, JL. Le Roux || bobthomas@alum.mit.edu, skraza@cisco.com, shivani@juniper.net, rahul@juniper.net, jeanlouis.leroux@orange-ftgroup.com +# RFC5562 || A. Kuzmanovic, A. Mondal, S. Floyd, K. Ramakrishnan || akuzma@northwestern.edu, a-mondal@northwestern.edu, floyd@icir.org, kkrama@research.att.com +# RFC5563 || K. Leung, G. Dommety, P. Yegani, K. Chowdhury || kleung@cisco.com, gdommety@cisco.com, pyegani@cisco.com, kchowdhury@starentnetworks.com +# RFC5564 || A. El-Sherbiny, M. Farah, I. Oueichek, A. Al-Zoman || El-sherbiny@un.org, farah14@un.org, oueichek@scs-net.org, azoman@citc.gov.sa +# RFC5565 || J. Wu, Y. Cui, C. Metz, E. Rosen || jianping@cernet.edu.cn, yong@csnet1.cs.tsinghua.edu.cn, chmetz@cisco.com, erosen@cisco.com +# RFC5566 || L. Berger, R. White, E. Rosen || lberger@labn.net, riw@cisco.com, erosen@cisco.com +# RFC5567 || T. Melanchuk, Ed. || tim.melanchuk@gmail.com +# RFC5568 || R. Koodli, Ed. || rkoodli@starentnetworks.com +# RFC5569 || R. Despres || remi.despres@free.fr +# RFC5570 || M. StJohns, R. Atkinson, G. Thomas || mstjohns@comcast.net, rja@extremenetworks.com, none +# RFC5571 || B. Storer, C. Pignataro, Ed., M. Dos Santos, B. Stevant, Ed., L. Toutain, J. Tremblay || bstorer@cisco.com, cpignata@cisco.com, mariados@cisco.com, bruno.stevant@telecom-bretagne.eu, laurent.toutain@telecom-bretagne.eu, jf@jftremblay.com +# RFC5572 || M. Blanchet, F. Parent || Marc.Blanchet@viagenie.ca, Florent.Parent@beon.ca +# RFC5573 || M. Thomson || martin.thomson@andrew.com +# RFC5574 || G. Herlein, J. Valin, A. Heggestad, A. Moizard || gherlein@herlein.com, jean-marc.valin@usherbrooke.ca, aeh@db.org, jack@atosc.org +# RFC5575 || P. Marques, N. Sheth, R. Raszuk, B. Greene, J. Mauch, D. McPherson || roque@cisco.com, nsheth@juniper.net, raszuk@cisco.com, bgreene@juniper.net, jmauch@us.ntt.net, danny@arbor.net +# RFC5576 || J. Lennox, J. Ott, T. Schierl || jonathan@vidyo.com, jo@acm.org, ts@thomas-schierl.de +# RFC5577 || P. Luthi, R. Even || patrick.luthi@tandberg.no, ron.even.tlv@gmail.com +# RFC5578 || B. Berry, Ed., S. Ratliff, E. Paradise, T. Kaiser, M. Adams || bberry@cisco.com, sratliff@cisco.com, pdice@cisco.com, timothy.kaiser@harris.com, Michael.D.Adams@L-3com.com +# RFC5579 || F. Templin, Ed. || fltemplin@acm.org +# RFC5580 || H. Tschofenig, Ed., F. Adrangi, M. Jones, A. Lior, B. Aboba || Hannes.Tschofenig@gmx.net, farid.adrangi@intel.com, mark.jones@bridgewatersystems.com, avi@bridgewatersystems.com, bernarda@microsoft.com +# RFC5581 || D. Shaw || dshaw@jabberwocky.com +# RFC5582 || H. Schulzrinne || hgs+ecrit@cs.columbia.edu +# RFC5583 || T. Schierl, S. Wenger || ts@thomas-schierl.de, stewe@stewe.org +# RFC5584 || M. Hatanaka, J. Matsumoto || actech@jp.sony.com, actech@jp.sony.com +# RFC5585 || T. Hansen, D. Crocker, P. Hallam-Baker || tony+dkimov@maillennium.att.com, dcrocker@bbiw.net, phillip@hallambaker.com +# RFC5586 || M. Bocci, Ed., M. Vigoureux, Ed., S. Bryant, Ed. || matthew.bocci@alcatel-lucent.com, martin.vigoureux@alcatel-lucent.com, stbryant@cisco.com +# RFC5587 || N. Williams || Nicolas.Williams@sun.com +# RFC5588 || N. Williams || Nicolas.Williams@sun.com +# RFC5589 || R. Sparks, A. Johnston, Ed., D. Petrie || RjS@nostrum.com, alan@sipstation.com, dan.ietf@SIPez.com +# RFC5590 || D. Harrington, J. Schoenwaelder || ietfdbh@comcast.net, j.schoenwaelder@jacobs-university.de +# RFC5591 || D. Harrington, W. Hardaker || ietfdbh@comcast.net, ietf@hardakers.net +# RFC5592 || D. Harrington, J. Salowey, W. Hardaker || ietfdbh@comcast.net, jsalowey@cisco.com, ietf@hardakers.net +# RFC5593 || N. Cook || neil.cook@noware.co.uk +# RFC5594 || J. Peterson, A. Cooper || jon.peterson@neustar.biz, acooper@cdt.org +# RFC5595 || G. Fairhurst || gorry@erg.abdn.ac.uk +# RFC5596 || G. Fairhurst || gorry@erg.abdn.ac.uk +# RFC5597 || R. Denis-Courmont || rem@videolan.org +# RFC5598 || D. Crocker || dcrocker@bbiw.net +# RFC5601 || T. Nadeau, Ed., D. Zelig, Ed. || thomas.nadeau@bt.com, davidz@oversi.com +# RFC5602 || D. Zelig, Ed., T. Nadeau, Ed. || davidz@oversi.com, tom.nadeau@bt.com +# RFC5603 || D. Zelig, Ed., T. Nadeau, Ed. || davidz@oversi.com, tom.nadeau@bt.com +# RFC5604 || O. Nicklass || orlyn@radvision.com +# RFC5605 || O. Nicklass, T. Nadeau || orlyn@radvision.com, tom.nadeau@bt.com +# RFC5606 || J. Peterson, T. Hardie, J. Morris || jon.peterson@neustar.biz, hardie@qualcomm.com, jmorris@cdt.org +# RFC5607 || D. Nelson, G. Weber || dnelson@elbrysnetworks.com, gdweber@gmail.com +# RFC5608 || K. Narayan, D. Nelson || kaushik_narayan@yahoo.com, dnelson@elbrysnetworks.com +# RFC5609 || V. Fajardo, Ed., Y. Ohba, R. Marin-Lopez || vfajardo@research.telcordia.com, yoshihiro.ohba@toshiba.co.jp, rafa@um.es +# RFC5610 || E. Boschi, B. Trammell, L. Mark, T. Zseby || elisa.boschi@hitachi-eu.com, brian.trammell@hitachi-eu.com, lutz.mark@ifam.fraunhofer.de, tanja.zseby@fokus.fraunhofer.de +# RFC5611 || A. Vainshtein, S. Galtzur || Alexander.Vainshtein@ecitele.com, sharon.galtzur@rebellion.co.uk +# RFC5612 || P. Eronen, D. Harrington || pe@iki.fi, dharrington@huawei.com +# RFC5613 || A. Zinin, A. Roy, L. Nguyen, B. Friedman, D. Yeung || alex.zinin@alcatel-lucent.com, akr@cisco.com, lhnguyen@cisco.com, barryf@google.com, myeung@cisco.com +# RFC5614 || R. Ogier, P. Spagnolo || rich.ogier@earthlink.net, phillipspagnolo@gmail.com +# RFC5615 || C. Groves, Y. Lin || Christian.Groves@nteczone.com, linyangbo@huawei.com +# RFC5616 || N. Cook || neil.cook@noware.co.uk +# RFC5617 || E. Allman, J. Fenton, M. Delany, J. Levine || eric+dkim@sendmail.org, fenton@bluepopcorn.net, markd+dkim@yahoo-inc.com, standards@taugh.com +# RFC5618 || A. Morton, K. Hedayat || acmorton@att.com, kaynam.hedayat@exfo.com +# RFC5619 || S. Yamamoto, C. Williams, H. Yokota, F. Parent || shu@nict.go.jp, carlw@mcsr-labs.org, yokota@kddilabs.jp, Florent.Parent@beon.ca +# RFC5620 || O. Kolkman, Ed., IAB || olaf@nlnetlabs.nl, iab@iab.org +# RFC5621 || G. Camarillo || Gonzalo.Camarillo@ericsson.com +# RFC5622 || S. Floyd, E. Kohler || floyd@icir.org, kohler@cs.ucla.edu +# RFC5623 || E. Oki, T. Takeda, JL. Le Roux, A. Farrel || oki@ice.uec.ac.jp, takeda.tomonori@lab.ntt.co.jp, jeanlouis.leroux@orange-ftgroup.com, adrian@olddog.co.uk +# RFC5624 || J. Korhonen, Ed., H. Tschofenig, E. Davies || jouni.korhonen@nsn.com, Hannes.Tschofenig@gmx.net, elwynd@dial.pipex.com +# RFC5625 || R. Bellis || ray.bellis@nominet.org.uk +# RFC5626 || C. Jennings, Ed., R. Mahy, Ed., F. Audet, Ed. || fluffy@cisco.com, rohan@ekabal.com, francois.audet@skypelabs.com +# RFC5627 || J. Rosenberg || jdrosen@cisco.com +# RFC5628 || P. Kyzivat || pkyzivat@cisco.com +# RFC5629 || J. Rosenberg || jdrosen@cisco.com +# RFC5630 || F. Audet || francois.audet@skypelabs.com +# RFC5631 || R. Shacham, H. Schulzrinne, S. Thakolsri, W. Kellerer || shacham@cs.columbia.edu, hgs@cs.columbia.edu, thakolsri@docomolab-euro.com, kellerer@docomolab-euro.com +# RFC5632 || C. Griffiths, J. Livingood, L. Popkin, R. Woundy, Y. Yang || chris_griffiths@cable.comcast.com, jason_livingood@cable.comcast.com, laird@pando.com, richard_woundy@cable.comcast.com, yry@cs.yale.edu +# RFC5633 || S. Dawkins, Ed. || spencer@wonderhamster.org +# RFC5634 || G. Fairhurst, A. Sathiaseelan || gorry@erg.abdn.ac.uk, arjuna@erg.abdn.ac.uk +# RFC5635 || W. Kumari, D. McPherson || warren@kumari.net, danny@arbor.net +# RFC5636 || S. Park, H. Park, Y. Won, J. Lee, S. Kent || shpark@kisa.or.kr, hrpark@kisa.or.kr, yjwon@kisa.or.kr, jilee@kisa.or.kr, kent@bbn.com +# RFC5637 || G. Giaretta, I. Guardini, E. Demaria, J. Bournelle, R. Lopez || gerardo@qualcomm.com, ivano.guardini@telecomitalia.it, elena.demaria@telecomitalia.it, julien.bournelle@gmail.com, rafa@dif.um.es +# RFC5638 || H. Sinnreich, Ed., A. Johnston, E. Shim, K. Singh || henrys@adobe.com, alan@sipstation.com, eunsooshim@gmail.com, kns10@cs.columbia.edu +# RFC5639 || M. Lochter, J. Merkle || manfred.lochter@bsi.bund.de, johannes.merkle@secunet.com +# RFC5640 || C. Filsfils, P. Mohapatra, C. Pignataro || cfilsfil@cisco.com, pmohapat@cisco.com, cpignata@cisco.com +# RFC5641 || N. McGill, C. Pignataro || nmcgill@cisco.com, cpignata@cisco.com +# RFC5642 || S. Venkata, S. Harwani, C. Pignataro, D. McPherson || svenkata@google.com, sharwani@cisco.com, cpignata@cisco.com, danny@arbor.net +# RFC5643 || D. Joyal, Ed., V. Manral, Ed. || djoyal@nortel.com, vishwas@ipinfusion.com +# RFC5644 || E. Stephan, L. Liang, A. Morton || emile.stephan@orange-ftgroup.com, L.Liang@surrey.ac.uk, acmorton@att.com +# RFC5645 || D. Ewell, Ed. || doug@ewellic.org +# RFC5646 || A. Phillips, Ed., M. Davis, Ed. || addison@inter-locale.com, markdavis@google.com +# RFC5647 || K. Igoe, J. Solinas || kmigoe@nsa.gov, jasolin@orion.ncsc.mil +# RFC5648 || R. Wakikawa, Ed., V. Devarapalli, G. Tsirtsis, T. Ernst, K. Nagami || ryuji.wakikawa@gmail.com, vijay@wichorus.com, Tsirtsis@gmail.com, thierry.ernst@inria.fr, nagami@inetcore.com +# RFC5649 || R. Housley, M. Dworkin || housley@vigilsec.com, dworkin@nist.gov +# RFC5650 || M. Morgenstern, S. Baillie, U. Bonollo || moti.Morgenstern@ecitele.com, scott.baillie@nec.com.au, umberto.bonollo@nec.com.au +# RFC5651 || M. Luby, M. Watson, L. Vicisano || luby@qti.qualcomm.com, watson@qualcomm.com, vicisano@qualcomm.com +# RFC5652 || R. Housley || housley@vigilsec.com +# RFC5653 || M. Upadhyay, S. Malkani || m.d.upadhyay+ietf@gmail.com, Seema.Malkani@gmail.com +# RFC5654 || B. Niven-Jenkins, Ed., D. Brungard, Ed., M. Betts, Ed., N. Sprecher, S. Ueno || benjamin.niven-jenkins@bt.com, dbrungard@att.com, malcolm.betts@huawei.com, nurit.sprecher@nsn.com, satoshi.ueno@ntt.com +# RFC5655 || B. Trammell, E. Boschi, L. Mark, T. Zseby, A. Wagner || brian.trammell@hitachi-eu.com, elisa.boschi@hitachi-eu.com, lutz.mark@ifam.fraunhofer.de, tanja.zseby@fokus.fraunhofer.de, arno@wagner.name +# RFC5656 || D. Stebila, J. Green || douglas@stebila.ca, jonathan.green@queensu.ca +# RFC5657 || L. Dusseault, R. Sparks || lisa.dusseault@gmail.com, RjS@nostrum.com +# RFC5658 || T. Froment, C. Lebel, B. Bonnaerens || thomas.froment@tech-invite.com, Christophe.Lebel@alcatel-lucent.fr, ben.bonnaerens@alcatel-lucent.be +# RFC5659 || M. Bocci, S. Bryant || matthew.bocci@alcatel-lucent.com, stbryant@cisco.com +# RFC5660 || N. Williams || Nicolas.Williams@sun.com +# RFC5661 || S. Shepler, Ed., M. Eisler, Ed., D. Noveck, Ed. || shepler@storspeed.com, mike@eisler.com, dnoveck@netapp.com +# RFC5662 || S. Shepler, Ed., M. Eisler, Ed., D. Noveck, Ed. || shepler@storspeed.com, mike@eisler.com, dnoveck@netapp.com +# RFC5663 || D. Black, S. Fridella, J. Glasgow || black_david@emc.com, stevef@nasuni.com, jglasgow@aya.yale.edu +# RFC5664 || B. Halevy, B. Welch, J. Zelenka || bhalevy@panasas.com, welch@panasas.com, jimz@panasas.com +# RFC5665 || M. Eisler || mike@eisler.com +# RFC5666 || T. Talpey, B. Callaghan || tmtalpey@gmail.com, brentc@apple.com +# RFC5667 || T. Talpey, B. Callaghan || tmtalpey@gmail.com, brentc@apple.com +# RFC5668 || Y. Rekhter, S. Sangli, D. Tappan || yakov@juniper.net, rsrihari@cisco.com, Dan.Tappan@Gmail.com +# RFC5669 || S. Yoon, J. Kim, H. Park, H. Jeong, Y. Won || seokung@kisa.or.kr, seopo@kisa.or.kr, hrpark@kisa.or.kr, hcjung@kisa.or.kr, yjwon@kisa.or.kr +# RFC5670 || P. Eardley, Ed. || philip.eardley@bt.com +# RFC5671 || S. Yasukawa, A. Farrel, Ed. || yasukawa.seisho@lab.ntt.co.jp, adrian@olddog.co.uk +# RFC5672 || D. Crocker, Ed. || dcrocker@bbiw.net +# RFC5673 || K. Pister, Ed., P. Thubert, Ed., S. Dwars, T. Phinney || kpister@dustnetworks.com, pthubert@cisco.com, sicco.dwars@shell.com, tom.phinney@cox.net +# RFC5674 || S. Chisholm, R. Gerhards || schishol@nortel.com, rgerhards@adiscon.com +# RFC5675 || V. Marinov, J. Schoenwaelder || v.marinov@jacobs-university.de, j.schoenwaelder@jacobs-university.de +# RFC5676 || J. Schoenwaelder, A. Clemm, A. Karmakar || j.schoenwaelder@jacobs-university.de, alex@cisco.com, akarmaka@cisco.com +# RFC5677 || T. Melia, Ed., G. Bajko, S. Das, N. Golmie, JC. Zuniga || telemaco.melia@alcatel-lucent.com, Gabor.Bajko@nokia.com, subir@research.telcordia.com, nada.golmie@nist.gov, j.c.zuniga@ieee.org +# RFC5678 || G. Bajko, S. Das || gabor.bajko@nokia.com, subir@research.telcordia.com +# RFC5679 || G. Bajko || gabor.bajko@nokia.com +# RFC5680 || S. Dawkins, Ed. || spencer@wonderhamster.org +# RFC5681 || M. Allman, V. Paxson, E. Blanton || mallman@icir.org, vern@icir.org, eblanton@cs.purdue.edu +# RFC5682 || P. Sarolahti, M. Kojo, K. Yamamoto, M. Hata || pasi.sarolahti@iki.fi, kojo@cs.helsinki.fi, yamamotokaz@nttdocomo.co.jp, hatama@s1.nttdocomo.co.jp +# RFC5683 || A. Brusilovsky, I. Faynberg, Z. Zeltsan, S. Patel || Alec.Brusilovsky@alcatel-lucent.com, igor.faynberg@alcatel-lucent.com, zeltsan@alcatel-lucent.com, sarvar@google.com +# RFC5684 || P. Srisuresh, B. Ford || srisuresh@yahoo.com, bryan.ford@yale.edu +# RFC5685 || V. Devarapalli, K. Weniger || vijay@wichorus.com, kilian.weniger@googlemail.com +# RFC5686 || Y. Hiwasaki, H. Ohmuro || hiwasaki.yusuke@lab.ntt.co.jp, ohmuro.hitoshi@lab.ntt.co.jp +# RFC5687 || H. Tschofenig, H. Schulzrinne || Hannes.Tschofenig@gmx.net, hgs+ecrit@cs.columbia.edu +# RFC5688 || J. Rosenberg || jdrosen@jdrosen.net +# RFC5689 || C. Daboo || cyrus@daboo.name +# RFC5690 || S. Floyd, A. Arcia, D. Ros, J. Iyengar || floyd@icir.org, ae.arcia@telecom-bretagne.eu, David.Ros@telecom-bretagne.eu, jiyengar@fandm.edu +# RFC5691 || F. de Bont, S. Doehla, M. Schmidt, R. Sperschneider || frans.de.bont@philips.com, stefan.doehla@iis.fraunhofer.de, malte.schmidt@dolby.com, ralph.sperschneider@iis.fraunhofer.de +# RFC5692 || H. Jeon, S. Jeong, M. Riegel || hongseok.jeon@gmail.com, sjjeong@etri.re.kr, maximilian.riegel@nsn.com +# RFC5693 || J. Seedorf, E. Burger || jan.seedorf@nw.neclab.eu, eburger@standardstrack.com +# RFC5694 || G. Camarillo, Ed., IAB || Gonzalo.Camarillo@ericsson.com, iab@iab.org +# RFC5695 || A. Akhter, R. Asati, C. Pignataro || aakhter@cisco.com, rajiva@cisco.com, cpignata@cisco.com +# RFC5696 || T. Moncaster, B. Briscoe, M. Menth || toby.moncaster@bt.com, bob.briscoe@bt.com, menth@informatik.uni-wuerzburg.de +# RFC5697 || S. Farrell || stephen.farrell@cs.tcd.ie +# RFC5698 || T. Kunz, S. Okunick, U. Pordesch || thomas.kunz@sit.fraunhofer.de, susanne.okunick@pawisda.de, ulrich.pordesch@zv.fraunhofer.de +# RFC5701 || Y. Rekhter || yakov@juniper.net +# RFC5702 || J. Jansen || jelte@NLnetLabs.nl +# RFC5703 || T. Hansen, C. Daboo || tony+sieveloop@maillennium.att.com, cyrus@daboo.name +# RFC5704 || S. Bryant, Ed., M. Morrow, Ed., IAB || stbryant@cisco.com, mmorrow@cisco.com, iab@iab.org +# RFC5705 || E. Rescorla || ekr@rtfm.com +# RFC5706 || D. Harrington || ietfdbh@comcast.net +# RFC5707 || A. Saleem, Y. Xin, G. Sharratt || adnan.saleem@RadiSys.com, yong.xin@RadiSys.com, garland.sharratt@gmail.com +# RFC5708 || A. Keromytis || angelos@cs.columbia.edu +# RFC5709 || M. Bhatia, V. Manral, M. Fanto, R. White, M. Barnes, T. Li, R. Atkinson || manav@alcatel-lucent.com, vishwas@ipinfusion.com, mfanto@aegisdatasecurity.com, riw@cisco.com, mjbarnes@cisco.com, tony.li@tony.li, rja@extremenetworks.com +# RFC5710 || L. Berger, D. Papadimitriou, JP. Vasseur || lberger@labn.net, Dimitri.Papadimitriou@alcatel-lucent.be, jpv@cisco.com +# RFC5711 || JP. Vasseur, Ed., G. Swallow, I. Minei || jpv@cisco.com, swallow@cisco.com, ina@juniper.net +# RFC5712 || M. Meyer, Ed., JP. Vasseur, Ed. || matthew.meyer@bt.com, jpv@cisco.com +# RFC5713 || H. Moustafa, H. Tschofenig, S. De Cnodder || hassnaa.moustafa@orange-ftgroup.com, Hannes.Tschofenig@gmx.net, stefaan.de_cnodder@alcatel-lucent.com +# RFC5714 || M. Shand, S. Bryant || mshand@cisco.com, stbryant@cisco.com +# RFC5715 || M. Shand, S. Bryant || mshand@cisco.com, stbryant@cisco.com +# RFC5716 || J. Lentini, C. Everhart, D. Ellard, R. Tewari, M. Naik || jlentini@netapp.com, everhart@netapp.com, dellard@bbn.com, tewarir@us.ibm.com, manoj@almaden.ibm.com +# RFC5717 || B. Lengyel, M. Bjorklund || balazs.lengyel@ericsson.com, mbj@tail-f.com +# RFC5718 || D. Beller, A. Farrel || dieter.beller@alcatel-lucent.com, adrian@olddog.co.uk +# RFC5719 || D. Romascanu, H. Tschofenig || dromasca@gmail.com , Hannes.Tschofenig@gmx.net +# RFC5720 || F. Templin || fltemplin@acm.org +# RFC5721 || R. Gellens, C. Newman || rg+ietf@qualcomm.com, chris.newman@sun.com +# RFC5722 || S. Krishnan || suresh.krishnan@ericsson.com +# RFC5723 || Y. Sheffer, H. Tschofenig || yaronf@checkpoint.com, Hannes.Tschofenig@gmx.net +# RFC5724 || E. Wilde, A. Vaha-Sipila || dret@berkeley.edu, antti.vaha-sipila@nokia.com +# RFC5725 || A. Begen, D. Hsu, M. Lague || abegen@cisco.com, dohsu@cisco.com, mlague@cisco.com +# RFC5726 || Y. Qiu, F. Zhao, Ed., R. Koodli || qiuying@i2r.a-star.edu.sg, fanzhao@google.com, rkoodli@cisco.com +# RFC5727 || J. Peterson, C. Jennings, R. Sparks || jon.peterson@neustar.biz, fluffy@cisco.com, rjsparks@nostrum.com +# RFC5728 || S. Combes, P. Amundsen, M. Lambert, H-P. Lexow || stephane.combes@esa.int, pca@verisat.no, micheline.lambert@advantechamt.com, hlexow@stmi.com +# RFC5729 || J. Korhonen, Ed., M. Jones, L. Morand, T. Tsou || jouni.nospam@gmail.com, Mark.Jones@bridgewatersystems.com, Lionel.morand@orange-ftgroup.com, tena@huawei.com +# RFC5730 || S. Hollenbeck || shollenbeck@verisign.com +# RFC5731 || S. Hollenbeck || shollenbeck@verisign.com +# RFC5732 || S. Hollenbeck || shollenbeck@verisign.com +# RFC5733 || S. Hollenbeck || shollenbeck@verisign.com +# RFC5734 || S. Hollenbeck || shollenbeck@verisign.com +# RFC5735 || M. Cotton, L. Vegoda || michelle.cotton@icann.org, leo.vegoda@icann.org +# RFC5736 || G. Huston, M. Cotton, L. Vegoda || gih@apnic.net, michelle.cotton@icann.org, leo.vegoda@icann.org +# RFC5737 || J. Arkko, M. Cotton, L. Vegoda || jari.arkko@piuha.net, michelle.cotton@icann.org, leo.vegoda@icann.org +# RFC5738 || P. Resnick, C. Newman || presnick@qti.qualcomm.com, chris.newman@sun.com +# RFC5739 || P. Eronen, J. Laganier, C. Madson || pe@iki.fi, julienl@qualcomm.com, cmadson@cisco.com +# RFC5740 || B. Adamson, C. Bormann, M. Handley, J. Macker || adamson@itd.nrl.navy.mil, cabo@tzi.org, M.Handley@cs.ucl.ac.uk, macker@itd.nrl.navy.mil +# RFC5741 || L. Daigle, Ed., O. Kolkman, Ed., IAB || leslie@thinkingcat.com, olaf@nlnetlabs.nl, iab@iab.org +# RFC5742 || H. Alvestrand, R. Housley || harald@alvestrand.no, housley@vigilsec.com +# RFC5743 || A. Falk || falk@bbn.com +# RFC5744 || R. Braden, J. Halpern || braden@isi.edu, jhalpern@redback.com +# RFC5745 || A. Malis, Ed., IAB || andrew.g.malis@verizon.com, iab@iab.org +# RFC5746 || E. Rescorla, M. Ray, S. Dispensa, N. Oskov || ekr@rtfm.com, marsh@extendedsubset.com, dispensa@phonefactor.com, nasko.oskov@microsoft.com +# RFC5747 || J. Wu, Y. Cui, X. Li, M. Xu, C. Metz || jianping@cernet.edu.cn, cy@csnet1.cs.tsinghua.edu.cn, xing@cernet.edu.cn, xmw@csnet1.cs.tsinghua.edu.cn, chmetz@cisco.com +# RFC5748 || S. Yoon, J. Jeong, H. Kim, H. Jeong, Y. Won || seokung@kisa.or.kr, jijeong@kisa.or.kr, rinyfeel@kisa.or.kr, hcjung@kisa.or.kr, yjwon@kisa.or.kr +# RFC5749 || K. Hoeper, Ed., M. Nakhjiri, Y. Ohba, Ed. || khoeper@motorola.com, madjid.nakhjiri@motorola.com, yoshihiro.ohba@toshiba.co.jp +# RFC5750 || B. Ramsdell, S. Turner || blaker@gmail.com, turners@ieca.com +# RFC5751 || B. Ramsdell, S. Turner || blaker@gmail.com, turners@ieca.com +# RFC5752 || S. Turner, J. Schaad || turners@ieca.com, jimsch@exmsft.com +# RFC5753 || S. Turner, D. Brown || turners@ieca.com, dbrown@certicom.com +# RFC5754 || S. Turner || turners@ieca.com +# RFC5755 || S. Farrell, R. Housley, S. Turner || stephen.farrell@cs.tcd.ie, housley@vigilsec.com, turners@ieca.com +# RFC5756 || S. Turner, D. Brown, K. Yiu, R. Housley, T. Polk || turners@ieca.com, dbrown@certicom.com, kelviny@microsoft.com, housley@vigilsec.com, wpolk@nist.gov +# RFC5757 || T. Schmidt, M. Waehlisch, G. Fairhurst || schmidt@informatik.haw-hamburg.de, mw@link-lab.net, gorry@erg.abdn.ac.uk +# RFC5758 || Q. Dang, S. Santesson, K. Moriarty, D. Brown, T. Polk || quynh.dang@nist.gov, sts@aaa-sec.com, Moriarty_Kathleen@emc.com, dbrown@certicom.com, tim.polk@nist.gov +# RFC5759 || J. Solinas, L. Zieglar || jasolin@orion.ncsc.mil, llziegl@tycho.ncsc.mil +# RFC5760 || J. Ott, J. Chesterfield, E. Schooler || jo@acm.org, julianchesterfield@cantab.net, eve_schooler@acm.org +# RFC5761 || C. Perkins, M. Westerlund || csp@csperkins.org, magnus.westerlund@ericsson.com +# RFC5762 || C. Perkins || csp@csperkins.org +# RFC5763 || J. Fischl, H. Tschofenig, E. Rescorla || jason.fischl@skype.net, Hannes.Tschofenig@gmx.net, ekr@rtfm.com +# RFC5764 || D. McGrew, E. Rescorla || mcgrew@cisco.com, ekr@rtfm.com +# RFC5765 || H. Schulzrinne, E. Marocco, E. Ivov || hgs@cs.columbia.edu, enrico.marocco@telecomitalia.it, emcho@sip-communicator.org +# RFC5766 || R. Mahy, P. Matthews, J. Rosenberg || rohan@ekabal.com, philip_matthews@magma.ca, jdrosen@jdrosen.net +# RFC5767 || M. Munakata, S. Schubert, T. Ohba || munakata.mayumi@lab.ntt.co.jp, shida@ntt-at.com, ohba.takumi@lab.ntt.co.jp +# RFC5768 || J. Rosenberg || jdrosen@jdrosen.net +# RFC5769 || R. Denis-Courmont || remi.denis-courmont@nokia.com +# RFC5770 || M. Komu, T. Henderson, H. Tschofenig, J. Melen, A. Keranen, Ed. || miika@iki.fi, thomas.r.henderson@boeing.com, Hannes.Tschofenig@gmx.net, jan.melen@ericsson.com, ari.keranen@ericsson.com +# RFC5771 || M. Cotton, L. Vegoda, D. Meyer || michelle.cotton@icann.org, leo.vegoda@icann.org, dmm@1-4-5.net +# RFC5772 || A. Doria, E. Davies, F. Kastenholz || avri@ltu.se, elwynd@dial.pipex.com, frank@bbn.com +# RFC5773 || E. Davies, A. Doria || elwynd@dial.pipex.com, avri@acm.org +# RFC5774 || K. Wolf, A. Mayrhofer || karlheinz.wolf@nic.at, alexander.mayrhofer@nic.at +# RFC5775 || M. Luby, M. Watson, L. Vicisano || luby@qti.qualcomm.com, watson@qualcomm.com, vicisano@qualcomm.com +# RFC5776 || V. Roca, A. Francillon, S. Faurite || vincent.roca@inria.fr, aurelien.francillon@inria.fr, faurite@lcpc.fr +# RFC5777 || J. Korhonen, H. Tschofenig, M. Arumaithurai, M. Jones, Ed., A. Lior || jouni.korhonen@nsn.com, Hannes.Tschofenig@gmx.net, mayutan.arumaithurai@gmail.com, mark.jones@bridgewatersystems.com, avi@bridgewatersystems.com +# RFC5778 || J. Korhonen, Ed., H. Tschofenig, J. Bournelle, G. Giaretta, M. Nakhjiri || jouni.nospam@gmail.com, Hannes.Tschofenig@gmx.net, julien.bournelle@orange-ftgroup.com, gerardo.giaretta@gmail.com, madjid.nakhjiri@motorola.com +# RFC5779 || J. Korhonen, Ed., J. Bournelle, K. Chowdhury, A. Muhanna, U. Meyer || jouni.nospam@gmail.com, julien.bournelle@orange-ftgroup.com, kchowdhury@cisco.com, Ahmad.muhanna@ericsson.com, meyer@umic.rwth-aachen.de +# RFC5780 || D. MacDonald, B. Lowekamp || derek.macdonald@gmail.com, bbl@lowekamp.net +# RFC5781 || S. Weiler, D. Ward, R. Housley || weiler@tislabs.com, dward@juniper.net, housley@vigilsec.com +# RFC5782 || J. Levine || standards@taugh.com +# RFC5783 || M. Welzl, W. Eddy || michawe@ifi.uio.no, wes@mti-systems.com +# RFC5784 || N. Freed, S. Vedam || ned.freed@mrochek.com, Srinivas.Sv@Sun.COM +# RFC5785 || M. Nottingham, E. Hammer-Lahav || mnot@mnot.net, eran@hueniverse.com +# RFC5786 || R. Aggarwal, K. Kompella || rahul@juniper.net, kireeti@juniper.net +# RFC5787 || D. Papadimitriou || dimitri.papadimitriou@alcatel-lucent.be +# RFC5788 || A. Melnikov, D. Cridland || Alexey.Melnikov@isode.com, dave.cridland@isode.com +# RFC5789 || L. Dusseault, J. Snell || lisa.dusseault@gmail.com, jasnell@gmail.com +# RFC5790 || H. Liu, W. Cao, H. Asaeda || Liuhui47967@huawei.com, caowayne@huawei.com, asaeda@wide.ad.jp +# RFC5791 || J. Reschke, J. Kunze || julian.reschke@greenbytes.de, jak@ucop.edu +# RFC5792 || P. Sangster, K. Narayan || Paul_Sangster@symantec.com, kaushik@cisco.com +# RFC5793 || R. Sahita, S. Hanna, R. Hurst, K. Narayan || Ravi.Sahita@intel.com, shanna@juniper.net, Ryan.Hurst@microsoft.com, kaushik@cisco.com +# RFC5794 || J. Lee, J. Lee, J. Kim, D. Kwon, C. Kim || jklee@ensec.re.kr, jlee05@ensec.re.kr, jaeheon@ensec.re.kr, ds_kwon@ensec.re.kr, jbr@ensec.re.kr +# RFC5795 || K. Sandlund, G. Pelletier, L-E. Jonsson || kristofer.sandlund@ericsson.com, ghyslain.pelletier@ericsson.com, lars-erik@lejonsson.com +# RFC5796 || W. Atwood, S. Islam, M. Siami || bill@cse.concordia.ca, Salekul.Islam@emt.inrs.ca, mzrsm@yahoo.ca +# RFC5797 || J. Klensin, A. Hoenes || john+ietf@jck.com, ah@TR-Sys.de +# RFC5798 || S. Nadas, Ed. || stephen.nadas@ericsson.com +# RFC5801 || S. Josefsson, N. Williams || simon@josefsson.org, Nicolas.Williams@oracle.com +# RFC5802 || C. Newman, A. Menon-Sen, A. Melnikov, N. Williams || chris.newman@oracle.com, ams@toroid.org, Alexey.Melnikov@isode.com, Nicolas.Williams@oracle.com +# RFC5803 || A. Melnikov || alexey.melnikov@isode.com +# RFC5804 || A. Melnikov, Ed., T. Martin || Alexey.Melnikov@isode.com, timmartin@alumni.cmu.edu +# RFC5805 || K. Zeilenga || Kurt.Zeilenga@Isode.COM +# RFC5806 || S. Levy, M. Mohali, Ed. || stlevy@cisco.com, marianne.mohali@orange-ftgroup.com +# RFC5807 || Y. Ohba, A. Yegin || yoshihiro.ohba@toshiba.co.jp, alper.yegin@yegin.org +# RFC5808 || R. Marshall, Ed. || rmarshall@telecomsys.com +# RFC5810 || A. Doria, Ed., J. Hadi Salim, Ed., R. Haas, Ed., H. Khosravi, Ed., W. Wang, Ed., L. Dong, R. Gopal, J. Halpern || avri@ltu.se, hadi@mojatatu.com, rha@zurich.ibm.com, hormuzd.m.khosravi@intel.com, wmwang@mail.zjgsu.edu.cn, donglg@zjgsu.edu.cn, ram.gopal@nsn.com, jmh@joelhalpern.com +# RFC5811 || J. Hadi Salim, K. Ogawa || hadi@mojatatu.com, ogawa.kentaro@lab.ntt.co.jp +# RFC5812 || J. Halpern, J. Hadi Salim || jmh@joelhalpern.com, hadi@mojatatu.com +# RFC5813 || R. Haas || rha@zurich.ibm.com +# RFC5814 || W. Sun, Ed., G. Zhang, Ed. || sunwq@mit.edu, zhangguoying@mail.ritt.com.cn +# RFC5815 || T. Dietz, Ed., A. Kobayashi, B. Claise, G. Muenz || Thomas.Dietz@nw.neclab.eu, akoba@nttv6.net, bclaise@cisco.com, muenz@net.in.tum.de +# RFC5816 || S. Santesson, N. Pope || sts@aaa-sec.com, nick.pope@thales-esecurity.com +# RFC5817 || Z. Ali, JP. Vasseur, A. Zamfir, J. Newton || zali@cisco.com, jpv@cisco.com, ancaz@cisco.com, jonathan.newton@cw.com +# RFC5818 || D. Li, H. Xu, S. Bardalai, J. Meuric, D. Caviglia || danli@huawei.com, xuhuiying@huawei.com, snigdho.bardalai@us.fujitsu.com, julien.meuric@orange-ftgroup.com, diego.caviglia@ericsson.com +# RFC5819 || A. Melnikov, T. Sirainen || Alexey.Melnikov@isode.com, tss@iki.fi +# RFC5820 || A. Roy, Ed., M. Chandra, Ed. || akr@cisco.com, mw.chandra@gmail.com +# RFC5824 || K. Kumaki, Ed., R. Zhang, Y. Kamite || ke-kumaki@kddi.com, raymond.zhang@bt.com, y.kamite@ntt.com +# RFC5825 || K. Fujiwara, B. Leiba || fujiwara@jprs.co.jp, barryleiba@computer.org +# RFC5826 || A. Brandt, J. Buron, G. Porcu || abr@sdesigns.dk, jbu@sdesigns.dk, gporcu@gmail.com +# RFC5827 || M. Allman, K. Avrachenkov, U. Ayesta, J. Blanton, P. Hurtig || mallman@icir.org, k.avrachenkov@sophia.inria.fr, urtzi@laas.fr, jblanton@irg.cs.ohiou.edu, per.hurtig@kau.se +# RFC5828 || D. Fedyk, L. Berger, L. Andersson || donald.fedyk@alcatel-lucent.com, lberger@labn.net, loa.andersson@ericsson.com +# RFC5829 || A. Brown, G. Clemm, J. Reschke, Ed. || albertcbrown@us.ibm.com, geoffrey.clemm@us.ibm.com, julian.reschke@greenbytes.de +# RFC5830 || V. Dolmatov, Ed. || dol@cryptocom.ru +# RFC5831 || V. Dolmatov, Ed. || dol@cryptocom.ru +# RFC5832 || V. Dolmatov, Ed. || dol@cryptocom.ru +# RFC5833 || Y. Shi, Ed., D. Perkins, Ed., C. Elliott, Ed., Y. Zhang, Ed. || rishyang@gmail.com, dperkins@dsperkins.com, chelliot@pobox.com, yzhang@fortinet.com +# RFC5834 || Y. Shi, Ed., D. Perkins, Ed., C. Elliott, Ed., Y. Zhang, Ed. || rishyang@gmail.com, dperkins@dsperkins.com, chelliot@pobox.com, yzhang@fortinet.com +# RFC5835 || A. Morton, Ed., S. Van den Berghe, Ed. || acmorton@att.com, steven.van_den_berghe@alcatel-lucent.com +# RFC5836 || Y. Ohba, Ed., Q. Wu, Ed., G. Zorn, Ed. || oshihiro.ohba@toshiba.co.jp, sunseawq@huawei.com, gwz@net-zen.net +# RFC5837 || A. Atlas, Ed., R. Bonica, Ed., C. Pignataro, Ed., N. Shen, JR. Rivers || alia.atlas@bt.com, rbonica@juniper.net, cpignata@cisco.com, naiming@cisco.com, jrrivers@yahoo.com +# RFC5838 || A. Lindem, Ed., S. Mirtorabi, A. Roy, M. Barnes, R. Aggarwal || acee.lindem@ericsson.com, smirtora@cisco.com, akr@cisco.com, mjbarnes@cisco.com, rahul@juniper.net +# RFC5839 || A. Niemi, D. Willis, Ed. || aki.niemi@nokia.com, dean.willis@softarmor.com +# RFC5840 || K. Grewal, G. Montenegro, M. Bhatia || ken.grewal@intel.com, gabriel.montenegro@microsoft.com, manav.bhatia@alcatel-lucent.com +# RFC5841 || R. Hay, W. Turkal || rhay@google.com, turkal@google.com +# RFC5842 || G. Clemm, J. Crawford, J. Reschke, Ed., J. Whitehead || geoffrey.clemm@us.ibm.com, ccjason@us.ibm.com, julian.reschke@greenbytes.de, ejw@cse.ucsc.edu +# RFC5843 || A. Bryan || anthonybryan@gmail.com +# RFC5844 || R. Wakikawa, S. Gundavelli || ryuji@us.toyota-itc.com, sgundave@cisco.com +# RFC5845 || A. Muhanna, M. Khalil, S. Gundavelli, K. Leung || ahmad.muhanna@ericsson.com, Mohamed.khalil@ericsson.com, sgundave@cisco.com, kleung@cisco.com +# RFC5846 || A. Muhanna, M. Khalil, S. Gundavelli, K. Chowdhury, P. Yegani || ahmad.muhanna@ericsson.com, mohamed.khalil@ericsson.com, sgundave@cisco.com, kchowdhu@cisco.com, pyegani@juniper.net +# RFC5847 || V. Devarapalli, Ed., R. Koodli, Ed., H. Lim, N. Kant, S. Krishnan, J. Laganier || vijay@wichorus.com, rkoodli@cisco.com, hlim@stoke.com, nishi@stoke.com, suresh.krishnan@ericsson.com, julienl@qualcomm.com +# RFC5848 || J. Kelsey, J. Callas, A. Clemm || john.kelsey@nist.gov, jon@callas.org, alex@cisco.com +# RFC5849 || E. Hammer-Lahav, Ed. || eran@hueniverse.com +# RFC5850 || R. Mahy, R. Sparks, J. Rosenberg, D. Petrie, A. Johnston, Ed. || rohan@ekabal.com, rjsparks@nostrum.com, jdrosen@jdrosen.net, dpetrie@sipez.com, alan@sipstation.com +# RFC5851 || S. Ooghe, N. Voigt, M. Platnic, T. Haag, S. Wadhwa || sven.ooghe@alcatel-lucent.com, norbert.voigt@nsn.com, mplatnic@gmail.com, haagt@telekom.de, swadhwa@juniper.net +# RFC5852 || D. Caviglia, D. Ceccarelli, D. Bramanti, D. Li, S. Bardalai || diego.caviglia@ericsson.com, daniele.ceccarelli@ericsson.com, none, danli@huawei.com, sbardalai@gmail.com +# RFC5853 || J. Hautakorpi, Ed., G. Camarillo, R. Penfield, A. Hawrylyshen, M. Bhatia || Jani.Hautakorpi@ericsson.com, Gonzalo.Camarillo@ericsson.com, bpenfield@acmepacket.com, alan.ietf@polyphase.ca, mbhatia@3clogic.com +# RFC5854 || A. Bryan, T. Tsujikawa, N. McNab, P. Poeml || anthonybryan@gmail.com, tatsuhiro.t@gmail.com, neil@nabber.org, peter@poeml.de +# RFC5855 || J. Abley, T. Manderson || joe.abley@icann.org, terry.manderson@icann.org +# RFC5856 || E. Ertekin, R. Jasani, C. Christou, C. Bormann || ertekin_emre@bah.com, ro@breakcheck.com, christou_chris@bah.com, cabo@tzi.org +# RFC5857 || E. Ertekin, C. Christou, R. Jasani, T. Kivinen, C. Bormann || ertekin_emre@bah.com, christou_chris@bah.com, ro@breakcheck.com, kivinen@iki.fi, cabo@tzi.org +# RFC5858 || E. Ertekin, C. Christou, C. Bormann || ertekin_emre@bah.com, christou_chris@bah.com, cabo@tzi.org +# RFC5859 || R. Johnson || raj@cisco.com +# RFC5860 || M. Vigoureux, Ed., D. Ward, Ed., M. Betts, Ed. || martin.vigoureux@alcatel-lucent.com, dward@juniper.net, malcolm.betts@rogers.com +# RFC5861 || M. Nottingham || mnot@yahoo-inc.com +# RFC5862 || S. Yasukawa, A. Farrel || yasukawa.seisho@lab.ntt.co.jp, adrian@olddog.co.uk +# RFC5863 || T. Hansen, E. Siegel, P. Hallam-Baker, D. Crocker || tony+dkimov@maillennium.att.com, dkim@esiegel.net, phillip@hallambaker.com, dcrocker@bbiw.net +# RFC5864 || R. Allbery || rra@stanford.edu +# RFC5865 || F. Baker, J. Polk, M. Dolly || fred@cisco.com, jmpolk@cisco.com, mdolly@att.com +# RFC5866 || D. Sun, Ed., P. McCann, H. Tschofenig, T. Tsou, A. Doria, G. Zorn, Ed. || d.sun@alcatel-lucent.com, pete.mccann@motorola.com, Hannes.Tschofenig@gmx.net, tena@huawei.com, avri@ltu.se, gwz@net-zen.net +# RFC5867 || J. Martocci, Ed., P. De Mil, N. Riou, W. Vermeylen || jerald.p.martocci@jci.com, pieter.demil@intec.ugent.be, nicolas.riou@fr.schneider-electric.com, wouter@vooruit.be +# RFC5868 || S. Sakane, K. Kamada, S. Zrelli, M. Ishiyama || Shouichi.Sakane@jp.yokogawa.com, Ken-ichi.Kamada@jp.yokogawa.com, Saber.Zrelli@jp.yokogawa.com, masahiro@isl.rdc.toshiba.co.jp +# RFC5869 || H. Krawczyk, P. Eronen || hugokraw@us.ibm.com, pe@iki.fi +# RFC5870 || A. Mayrhofer, C. Spanring || alexander.mayrhofer@ipcom.at, christian@spanring.eu +# RFC5871 || J. Arkko, S. Bradner || jari.arkko@piuha.net, sob@harvard.edu +# RFC5872 || J. Arkko, A. Yegin || jari.arkko@piuha.net, alper.yegin@yegin.org +# RFC5873 || Y. Ohba, A. Yegin || yoshihiro.ohba@toshiba.co.jp, alper.yegin@yegin.org +# RFC5874 || J. Rosenberg, J. Urpalainen || jdrosen.net, jari.urpalainen@nokia.com +# RFC5875 || J. Urpalainen, D. Willis, Ed. || jari.urpalainen@nokia.com, dean.willis@softarmor.com +# RFC5876 || J. Elwell || john.elwell@siemens-enterprise.com +# RFC5877 || R. Housley || housley@vigilsec.com +# RFC5878 || M. Brown, R. Housley || mark@redphonesecurity.com, housley@vigilsec.com +# RFC5879 || T. Kivinen, D. McDonald || kivinen@iki.fi, danmcd@opensolaris.org +# RFC5880 || D. Katz, D. Ward || dkatz@juniper.net, dward@juniper.net +# RFC5881 || D. Katz, D. Ward || dkatz@juniper.net, dward@juniper.net +# RFC5882 || D. Katz, D. Ward || dkatz@juniper.net, dward@juniper.net +# RFC5883 || D. Katz, D. Ward || dkatz@juniper.net, dward@juniper.net +# RFC5884 || R. Aggarwal, K. Kompella, T. Nadeau, G. Swallow || rahul@juniper.net, kireeti@juniper.net, tom.nadeau@bt.com, swallow@cisco.com +# RFC5885 || T. Nadeau, Ed., C. Pignataro, Ed. || tom.nadeau@bt.com, cpignata@cisco.com +# RFC5886 || JP. Vasseur, Ed., JL. Le Roux, Y. Ikejiri || jpv@cisco.com, jeanlouis.leroux@orange-ftgroup.com, y.ikejiri@ntt.com +# RFC5887 || B. Carpenter, R. Atkinson, H. Flinck || brian.e.carpenter@gmail.com, rja@extremenetworks.com, hannu.flinck@nsn.com +# RFC5888 || G. Camarillo, H. Schulzrinne || Gonzalo.Camarillo@ericsson.com, schulzrinne@cs.columbia.edu +# RFC5889 || E. Baccelli, Ed., M. Townsley, Ed. || Emmanuel.Baccelli@inria.fr, mark@townsley.net +# RFC5890 || J. Klensin || john+ietf@jck.com +# RFC5891 || J. Klensin || john+ietf@jck.com +# RFC5892 || P. Faltstrom, Ed. || paf@cisco.com +# RFC5893 || H. Alvestrand, Ed., C. Karp || harald@alvestrand.no, ck@nic.museum +# RFC5894 || J. Klensin || john+ietf@jck.com +# RFC5895 || P. Resnick, P. Hoffman || presnick@qti.qualcomm.com, paul.hoffman@vpnc.org +# RFC5896 || L. Hornquist Astrand, S. Hartman || lha@apple.com, hartmans-ietf@mit.edu +# RFC5897 || J. Rosenberg || jdrosen@jdrosen.net +# RFC5898 || F. Andreasen, G. Camarillo, D. Oran, D. Wing || fandreas@cisco.com, Gonzalo.Camarillo@ericsson.com, oran@cisco.com, dwing-ietf@fuggles.com +# RFC5901 || P. Cain, D. Jevans || pcain@coopercain.com, dave.jevans@antiphishing.org +# RFC5902 || D. Thaler, L. Zhang, G. Lebovitz || dthaler@microsoft.com, lixia@cs.ucla.edu, gregory.ietf@gmail.com, iab@iab.org +# RFC5903 || D. Fu, J. Solinas || defu@orion.ncsc.mil, jasolin@orion.ncsc.mil +# RFC5904 || G. Zorn || gwz@net-zen.net +# RFC5905 || D. Mills, J. Martin, Ed., J. Burbank, W. Kasch || mills@udel.edu, jrmii@isc.org, jack.burbank@jhuapl.edu, william.kasch@jhuapl.edu +# RFC5906 || B. Haberman, Ed., D. Mills || brian@innovationslab.net, mills@udel.edu +# RFC5907 || H. Gerstung, C. Elliott, B. Haberman, Ed. || heiko.gerstung@meinberg.de, chelliot@pobox.com, brian@innovationslab.net +# RFC5908 || R. Gayraud, B. Lourdelet || richard.gayraud@free.fr, blourdel@cisco.com +# RFC5909 || J-M. Combes, S. Krishnan, G. Daley || jeanmichel.combes@orange-ftgroup.com, Suresh.Krishnan@ericsson.com, hoskuld@hotmail.com +# RFC5910 || J. Gould, S. Hollenbeck || jgould@verisign.com, shollenbeck@verisign.com +# RFC5911 || P. Hoffman, J. Schaad || paul.hoffman@vpnc.org, jimsch@exmsft.com +# RFC5912 || P. Hoffman, J. Schaad || paul.hoffman@vpnc.org, jimsch@exmsft.com +# RFC5913 || S. Turner, S. Chokhani || turners@ieca.com, SChokhani@cygnacom.com +# RFC5914 || R. Housley, S. Ashmore, C. Wallace || housley@vigilsec.com, srashmo@radium.ncsc.mil, cwallace@cygnacom.com +# RFC5915 || S. Turner, D. Brown || turners@ieca.com, dbrown@certicom.com +# RFC5916 || S. Turner || turners@ieca.com +# RFC5917 || S. Turner || turners@ieca.com +# RFC5918 || R. Asati, I. Minei, B. Thomas || rajiva@cisco.com, ina@juniper.net, bobthomas@alum.mit.edu +# RFC5919 || R. Asati, P. Mohapatra, E. Chen, B. Thomas || rajiva@cisco.com, pmohapat@cisco.com, chenying220@huawei.com, bobthomas@alum.mit.edu +# RFC5920 || L. Fang, Ed. || lufang@cisco.com +# RFC5921 || M. Bocci, Ed., S. Bryant, Ed., D. Frost, Ed., L. Levrau, L. Berger || matthew.bocci@alcatel-lucent.com, stbryant@cisco.com, danfrost@cisco.com, lieven.levrau@alcatel-lucent.com, lberger@labn.net +# RFC5922 || V. Gurbani, S. Lawrence, A. Jeffrey || vkg@alcatel-lucent.com, scott-ietf@skrb.org, ajeffrey@alcatel-lucent.com +# RFC5923 || V. Gurbani, Ed., R. Mahy, B. Tate || vkg@alcatel-lucent.com, rohan@ekabal.com, brett@broadsoft.com +# RFC5924 || S. Lawrence, V. Gurbani || scott-ietf@skrb.org, vkg@bell-labs.com +# RFC5925 || J. Touch, A. Mankin, R. Bonica || touch@isi.edu, mankin@psg.com, rbonica@juniper.net +# RFC5926 || G. Lebovitz, E. Rescorla || gregory.ietf@gmail.com, ekr@rtfm.com +# RFC5927 || F. Gont || fernando@gont.com.ar +# RFC5928 || M. Petit-Huguenin || petithug@acm.org +# RFC5929 || J. Altman, N. Williams, L. Zhu || jaltman@secure-endpoints.com, Nicolas.Williams@oracle.com, larry.zhu@microsoft.com +# RFC5930 || S. Shen, Y. Mao, NSS. Murthy || shenshuo@cnnic.cn, yumao9@gmail.com, ssmurthy.nittala@freescale.com +# RFC5931 || D. Harkins, G. Zorn || dharkins@arubanetworks.com, gwz@net-zen.net +# RFC5932 || A. Kato, M. Kanda, S. Kanno || kato.akihiro@po.ntts.co.jp, kanda.masayuki@lab.ntt.co.jp, kanno.satoru@po.ntts.co.jp +# RFC5933 || V. Dolmatov, Ed., A. Chuprina, I. Ustinov || dol@cryptocom.ru, ran@cryptocom.ru, igus@cryptocom.ru +# RFC5934 || R. Housley, S. Ashmore, C. Wallace || housley@vigilsec.com, srashmo@radium.ncsc.mil, cwallace@cygnacom.com +# RFC5935 || M. Ellison, B. Natale || ietf@ellisonsoftware.com, rnatale@mitre.org +# RFC5936 || E. Lewis, A. Hoenes, Ed. || ed.lewis@neustar.biz, ah@TR-Sys.de +# RFC5937 || S. Ashmore, C. Wallace || srashmo@radium.ncsc.mil, cwallace@cygnacom.com +# RFC5938 || A. Morton, M. Chiba || acmorton@att.com, mchiba@cisco.com +# RFC5939 || F. Andreasen || fandreas@cisco.com +# RFC5940 || S. Turner, R. Housley || turners@ieca.com, housley@vigilsec.com +# RFC5941 || D. M'Raihi, S. Boeyen, M. Grandcolas, S. Bajaj || davidietf@gmail.com, sharon.boeyen@entrust.com, michael.grandcolas@hotmail.com, sbajaj@verisign.com +# RFC5942 || H. Singh, W. Beebee, E. Nordmark || shemant@cisco.com, wbeebee@cisco.com, erik.nordmark@oracle.com +# RFC5943 || B. Haberman, Ed. || brian@innovationslab.net +# RFC5944 || C. Perkins, Ed. || charliep@computer.org +# RFC5945 || F. Le Faucheur, J. Manner, D. Wing, A. Guillou || flefauch@cisco.com, jukka.manner@tkk.fi, dwing-ietf@fuggles.com, allan.guillou@sfr.com +# RFC5946 || F. Le Faucheur, J. Manner, A. Narayanan, A. Guillou, H. Malik || flefauch@cisco.com, jukka.manner@tkk.fi, ashokn@cisco.com, allan.guillou@sfr.com, Hemant.Malik@airtel.in +# RFC5947 || J. Elwell, H. Kaplan || john.elwell@siemens-enterprise.com, hkaplan@acmepacket.com +# RFC5948 || S. Madanapalli, S. Park, S. Chakrabarti, G. Montenegro || smadanapalli@gmail.com, soohong.park@samsung.com, samitac@ipinfusion.com, gabriel.montenegro@microsoft.com +# RFC5949 || H. Yokota, K. Chowdhury, R. Koodli, B. Patil, F. Xia || yokota@kddilabs.jp, kchowdhu@cisco.com, rkoodli@cisco.com, basavaraj.patil@nokia.com, xiayangsong@huawei.com +# RFC5950 || S. Mansfield, Ed., E. Gray, Ed., K. Lam, Ed. || scott.mansfield@ericsson.com, eric.gray@ericsson.com, Kam.Lam@alcatel-lucent.com +# RFC5951 || K. Lam, S. Mansfield, E. Gray || Kam.Lam@Alcatel-Lucent.com, Scott.Mansfield@Ericsson.com, Kam.Lam@Alcatel-Lucent.com +# RFC5952 || S. Kawamura, M. Kawashima || kawamucho@mesh.ad.jp, kawashimam@vx.jp.nec.com +# RFC5953 || W. Hardaker || ietf@hardakers.net +# RFC5954 || V. Gurbani, Ed., B. Carpenter, Ed., B. Tate, Ed. || vkg@bell-labs.com, brian.e.carpenter@gmail.com, brett@broadsoft.com +# RFC5955 || A. Santoni || adriano.santoni@actalis.it +# RFC5956 || A. Begen || abegen@cisco.com +# RFC5957 || D. Karp || dkarp@zimbra.com +# RFC5958 || S. Turner || turners@ieca.com +# RFC5959 || S. Turner || turners@ieca.com +# RFC5960 || D. Frost, Ed., S. Bryant, Ed., M. Bocci, Ed. || danfrost@cisco.com, stbryant@cisco.com, matthew.bocci@alcatel-lucent.com +# RFC5961 || A. Ramaiah, R. Stewart, M. Dalal || ananth@cisco.com, randall@lakerest.net, mdalal@cisco.com +# RFC5962 || H. Schulzrinne, V. Singh, H. Tschofenig, M. Thomson || hgs@cs.columbia.edu, vs2140@cs.columbia.edu, Hannes.Tschofenig@gmx.net, martin.thomson@andrew.com +# RFC5963 || R. Gagliano || rogaglia@cisco.com +# RFC5964 || J. Winterbottom, M. Thomson || james.winterbottom@andrew.com, martin.thomson@andrew.com +# RFC5965 || Y. Shafranovich, J. Levine, M. Kucherawy || ietf@shaftek.org, standards@taugh.com, msk@cloudmark.com +# RFC5966 || R. Bellis || ray.bellis@nominet.org.uk +# RFC5967 || S. Turner || turners@ieca.com +# RFC5968 || J. Ott, C. Perkins || jo@netlab.tkk.fi, csp@csperkins.org +# RFC5969 || W. Townsley, O. Troan || mark@townsley.net, ot@cisco.com +# RFC5970 || T. Huth, J. Freimann, V. Zimmer, D. Thaler || thuth@de.ibm.com, jfrei@de.ibm.com, vincent.zimmer@intel.com, dthaler@microsoft.com +# RFC5971 || H. Schulzrinne, R. Hancock || hgs+nsis@cs.columbia.edu, robert.hancock@roke.co.uk +# RFC5972 || T. Tsenov, H. Tschofenig, X. Fu, Ed., C. Aoun, E. Davies || tseno.tsenov@mytum.de, Hannes.Tschofenig@nsn.com, fu@cs.uni-goettingen.de, cedaoun@yahoo.fr, elwynd@dial.pipex.com +# RFC5973 || M. Stiemerling, H. Tschofenig, C. Aoun, E. Davies || Martin.Stiemerling@neclab.eu, Hannes.Tschofenig@nsn.com, cedaoun@yahoo.fr, elwynd@dial.pipex.com +# RFC5974 || J. Manner, G. Karagiannis, A. McDonald || jukka.manner@tkk.fi, karagian@cs.utwente.nl, andrew.mcdonald@roke.co.uk +# RFC5975 || G. Ash, Ed., A. Bader, Ed., C. Kappler, Ed., D. Oran, Ed. || gash5107@yahoo.com, Attila.Bader@ericsson.com, cornelia.kappler@cktecc.de, oran@cisco.com +# RFC5976 || G. Ash, A. Morton, M. Dolly, P. Tarapore, C. Dvorak, Y. El Mghazli || gash5107@yahoo.com, acmorton@att.com, mdolly@att.com, tarapore@att.com, cdvorak@att.com, yacine.el_mghazli@alcatel.fr +# RFC5977 || A. Bader, L. Westberg, G. Karagiannis, C. Kappler, T. Phelan || Attila.Bader@ericsson.com, Lars.Westberg@ericsson.com, g.karagiannis@ewi.utwente.nl, cornelia.kappler@cktecc.de, tphelan@sonusnet.com +# RFC5978 || J. Manner, R. Bless, J. Loughney, E. Davies, Ed. || jukka.manner@tkk.fi, bless@kit.edu, john.loughney@nokia.com, elwynd@folly.org.uk +# RFC5979 || C. Shen, H. Schulzrinne, S. Lee, J. Bang || charles@cs.columbia.edu, hgs@cs.columbia.edu, sung1.lee@samsung.com, jh0278.bang@samsung.com +# RFC5980 || T. Sanda, Ed., X. Fu, S. Jeong, J. Manner, H. Tschofenig || sanda.takako@jp.panasonic.com, fu@cs.uni-goettingen.de, shjeong@hufs.ac.kr, jukka.manner@tkk.fi, Hannes.Tschofenig@nsn.com +# RFC5981 || J. Manner, M. Stiemerling, H. Tschofenig, R. Bless, Ed. || jukka.manner@tkk.fi, martin.stiemerling@neclab.eu, Hannes.Tschofenig@gmx.net, roland.bless@kit.edu +# RFC5982 || A. Kobayashi, Ed., B. Claise, Ed. || akoba@nttv6.net, bclaise@cisco.com +# RFC5983 || R. Gellens || rg+ietf@qualcomm.com +# RFC5984 || K-M. Moller || kalle@tankesaft.se +# RFC5985 || M. Barnes, Ed. || mary.ietf.barnes@gmail.com +# RFC5986 || M. Thomson, J. Winterbottom || martin.thomson@andrew.com, james.winterbottom@andrew.com +# RFC5987 || J. Reschke || julian.reschke@greenbytes.de +# RFC5988 || M. Nottingham || mnot@mnot.net +# RFC5989 || A.B. Roach || adam@nostrum.com +# RFC5990 || J. Randall, B. Kaliski, J. Brainard, S. Turner || jdrandall@comcast.net, kaliski_burt@emc.com, jbrainard@rsa.com, turners@ieca.com +# RFC5991 || D. Thaler, S. Krishnan, J. Hoagland || dthaler@microsoft.com, suresh.krishnan@ericsson.com, Jim_Hoagland@symantec.com +# RFC5992 || S. Sharikov, D. Miloshevic, J. Klensin || s.shar@regtime.net, dmiloshevic@afilias.info, john-ietf@jck.com +# RFC5993 || X. Duan, S. Wang, M. Westerlund, K. Hellwig, I. Johansson || duanxiaodong@chinamobile.com, wangshuaiyu@chinamobile.com, magnus.westerlund@ericsson.com, karl.hellwig@ericsson.com, ingemar.s.johansson@ericsson.com +# RFC5994 || S. Bryant, Ed., M. Morrow, G. Swallow, R. Cherukuri, T. Nadeau, N. Harrison, B. Niven-Jenkins || stbryant@cisco.com, mmorrow@cisco.com, swallow@cisco.com, cherukuri@juniper.net, thomas.nadeau@huawei.com, neil.2.harrison@bt.com, ben@niven-jenkins.co.uk +# RFC5995 || J. Reschke || julian.reschke@greenbytes.de +# RFC5996 || C. Kaufman, P. Hoffman, Y. Nir, P. Eronen || charliek@microsoft.com, paul.hoffman@vpnc.org, ynir@checkpoint.com, pe@iki.fi +# RFC5997 || A. DeKok || aland@freeradius.org +# RFC5998 || P. Eronen, H. Tschofenig, Y. Sheffer || pe@iki.fi, Hannes.Tschofenig@gmx.net, yaronf.ietf@gmail.com +# RFC6001 || D. Papadimitriou, M. Vigoureux, K. Shiomoto, D. Brungard, JL. Le Roux || dimitri.papadimitriou@alcatel-lucent.com, martin.vigoureux@alcatel-lucent.fr, shiomoto.kohei@lab.ntt.co.jp, dbrungard@att.com, jean-louis.leroux@rd.francetelecom.com +# RFC6002 || L. Berger, D. Fedyk || lberger@labn.net, donald.fedyk@alcatel-lucent.com +# RFC6003 || D. Papadimitriou || dimitri.papadimitriou@alcatel-lucent.be +# RFC6004 || L. Berger, D. Fedyk || lberger@labn.net, donald.fedyk@alcatel-lucent.com +# RFC6005 || L. Berger, D. Fedyk || lberger@labn.net, donald.fedyk@alcatel-lucent.com +# RFC6006 || Q. Zhao, Ed., D. King, Ed., F. Verhaeghe, T. Takeda, Z. Ali, J. Meuric || qzhao@huawei.com, daniel@olddog.co.uk, fabien.verhaeghe@gmail.com, takeda.tomonori@lab.ntt.co.jp, zali@cisco.com, julien.meuric@orange-ftgroup.com +# RFC6007 || I. Nishioka, D. King || i-nishioka@cb.jp.nec.com, daniel@olddog.co.uk +# RFC6008 || M. Kucherawy || msk@cloudmark.com +# RFC6009 || N. Freed || ned.freed@mrochek.com +# RFC6010 || R. Housley, S. Ashmore, C. Wallace || housley@vigilsec.com, srashmo@radium.ncsc.mil, cwallace@cygnacom.com +# RFC6011 || S. Lawrence, Ed., J. Elwell || scott-ietf@skrb.org, john.elwell@siemens-enterprise.com +# RFC6012 || J. Salowey, T. Petch, R. Gerhards, H. Feng || jsalowey@cisco.com, tomSecurity@network-engineer.co.uk, rgerhards@adiscon.com, fhyfeng@gmail.com +# RFC6013 || W. Simpson || William.Allen.Simpson@Gmail.com +# RFC6014 || P. Hoffman || paul.hoffman@vpnc.org +# RFC6015 || A. Begen || abegen@cisco.com +# RFC6016 || B. Davie, F. Le Faucheur, A. Narayanan || bsd@cisco.com, flefauch@cisco.com, ashokn@cisco.com +# RFC6017 || K. Meadors, Ed. || kyle@drummondgroup.com +# RFC6018 || F. Baker, W. Harrop, G. Armitage || fred@cisco.com, wazz@bud.cc.swin.edu.au, garmitage@swin.edu.au +# RFC6019 || R. Housley || housley@vigilsec.com +# RFC6020 || M. Bjorklund, Ed. || mbj@tail-f.com +# RFC6021 || J. Schoenwaelder, Ed. || j.schoenwaelder@jacobs-university.de +# RFC6022 || M. Scott, M. Bjorklund || mark.scott@ericsson.com, mbj@tail-f.com +# RFC6023 || Y. Nir, H. Tschofenig, H. Deng, R. Singh || ynir@checkpoint.com, Hannes.Tschofenig@gmx.net, denghui02@gmail.com, rsj@cisco.com +# RFC6024 || R. Reddy, C. Wallace || r.reddy@radium.ncsc.mil, cwallace@cygnacom.com +# RFC6025 || C. Wallace, C. Gardiner || cwallace@cygnacom.com, gardiner@bbn.com +# RFC6026 || R. Sparks, T. Zourzouvillys || RjS@nostrum.com, theo@crazygreek.co.uk +# RFC6027 || Y. Nir || ynir@checkpoint.com +# RFC6028 || G. Camarillo, A. Keranen || Gonzalo.Camarillo@ericsson.com, Ari.Keranen@ericsson.com +# RFC6029 || I. Rimac, V. Hilt, M. Tomsu, V. Gurbani, E. Marocco || rimac@bell-labs.com, volkerh@bell-labs.com, marco.tomsu@alcatel-lucent.com, vkg@bell-labs.com, enrico.marocco@telecomitalia.it +# RFC6030 || P. Hoyer, M. Pei, S. Machani || phoyer@actividentity.com, mpei@verisign.com, smachani@diversinet.com +# RFC6031 || S. Turner, R. Housley || turners@ieca.com, housley@vigilsec.com +# RFC6032 || S. Turner, R. Housley || turners@ieca.com, housley@vigilsec.com +# RFC6033 || S. Turner || turners@ieca.com +# RFC6034 || D. Thaler || dthaler@microsoft.com +# RFC6035 || A. Pendleton, A. Clark, A. Johnston, H. Sinnreich || aspen@telchemy.com, alan.d.clark@telchemy.com, alan.b.johnston@gmail.com, henry.sinnreich@gmail.com +# RFC6036 || B. Carpenter, S. Jiang || brian.e.carpenter@gmail.com, shengjiang@huawei.com +# RFC6037 || E. Rosen, Ed., Y. Cai, Ed., IJ. Wijnands || erosen@cisco.com, ycai@cisco.com, ice@cisco.com +# RFC6038 || A. Morton, L. Ciavattone || acmorton@att.com, lencia@att.com +# RFC6039 || V. Manral, M. Bhatia, J. Jaeggli, R. White || vishwas@ipinfusion.com, manav.bhatia@alcatel-lucent.com, joel.jaeggli@nokia.com, riw@cisco.com +# RFC6040 || B. Briscoe || bob.briscoe@bt.com +# RFC6041 || A. Crouch, H. Khosravi, A. Doria, Ed., X. Wang, K. Ogawa || alan.crouch@intel.com, hormuzd.m.khosravi@intel.com, avri@acm.org, carly.wang@huawei.com, ogawa.kentaro@lab.ntt.co.jp +# RFC6042 || A. Keromytis || angelos@cs.columbia.edu +# RFC6043 || J. Mattsson, T. Tian || john.mattsson@ericsson.com, tian.tian1@zte.com.cn +# RFC6044 || M. Mohali || marianne.mohali@orange-ftgroup.com +# RFC6045 || K. Moriarty || Moriarty_Kathleen@EMC.com +# RFC6046 || K. Moriarty, B. Trammell || Moriarty_Kathleen@EMC.com, trammell@tik.ee.ethz.ch +# RFC6047 || A. Melnikov, Ed. || Alexey.Melnikov@isode.com +# RFC6048 || J. Elie || julien@trigofacile.com +# RFC6049 || A. Morton, E. Stephan || acmorton@att.com, emile.stephan@orange-ftgroup.com +# RFC6050 || K. Drage || drage@alcatel-lucent.com +# RFC6051 || C. Perkins, T. Schierl || csp@csperkins.org, ts@thomas-schierl.de +# RFC6052 || C. Bao, C. Huitema, M. Bagnulo, M. Boucadair, X. Li || congxiao@cernet.edu.cn, huitema@microsoft.com, marcelo@it.uc3m.es, mohamed.boucadair@orange-ftgroup.com, xing@cernet.edu.cn +# RFC6053 || E. Haleplidis, K. Ogawa, W. Wang, J. Hadi Salim || ehalep@ece.upatras.gr, ogawa.kentaro@lab.ntt.co.jp, wmwang@mail.zjgsu.edu.cn, hadi@mojatatu.com +# RFC6054 || D. McGrew, B. Weis || mcgrew@cisco.com, bew@cisco.com +# RFC6055 || D. Thaler, J. Klensin, S. Cheshire || dthaler@microsoft.com, john+ietf@jck.com, cheshire@apple.com +# RFC6056 || M. Larsen, F. Gont || michael.larsen@tieto.com, fernando@gont.com.ar +# RFC6057 || C. Bastian, T. Klieber, J. Livingood, J. Mills, R. Woundy || chris_bastian@cable.comcast.com, tom_klieber@cable.comcast.com, jason_livingood@cable.comcast.com, jim_mills@cable.comcast.com, richard_woundy@cable.comcast.com +# RFC6058 || M. Liebsch, Ed., A. Muhanna, O. Blume || marco.liebsch@neclab.eu, ahmad.muhanna@ericsson.com, oliver.blume@alcatel-lucent.de +# RFC6059 || S. Krishnan, G. Daley || suresh.krishnan@ericsson.com, hoskuld@hotmail.com +# RFC6060 || D. Fedyk, H. Shah, N. Bitar, A. Takacs || donald.fedyk@alcatel-lucent.com, hshah@ciena.com, nabil.n.bitar@verizon.com, attila.takacs@ericsson.com +# RFC6061 || B. Rosen || br@brianrosen.net +# RFC6062 || S. Perreault, Ed., J. Rosenberg || simon.perreault@viagenie.ca, jdrosen@jdrosen.net +# RFC6063 || A. Doherty, M. Pei, S. Machani, M. Nystrom || andrea.doherty@rsa.com, mpei@verisign.com, smachani@diversinet.com, mnystrom@microsoft.com +# RFC6064 || M. Westerlund, P. Frojdh || magnus.westerlund@ericsson.com, per.frojdh@ericsson.com +# RFC6065 || K. Narayan, D. Nelson, R. Presuhn, Ed. || kaushik_narayan@yahoo.com, d.b.nelson@comcast.net, randy_presuhn@mindspring.com +# RFC6066 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC6067 || M. Davis, A. Phillips, Y. Umaoka || mark@macchiato.com, addison@lab126.com, yoshito_umaoka@us.ibm.com +# RFC6068 || M. Duerst, L. Masinter, J. Zawinski || duerst@it.aoyama.ac.jp, LMM@acm.org, jwz@jwz.org +# RFC6069 || A. Zimmermann, A. Hannemann || zimmermann@cs.rwth-aachen.de, hannemann@nets.rwth-aachen.de +# RFC6070 || S. Josefsson || simon@josefsson.org +# RFC6071 || S. Frankel, S. Krishnan || sheila.frankel@nist.gov, suresh.krishnan@ericsson.com +# RFC6072 || C. Jennings, J. Fischl, Ed. || fluffy@cisco.com, jason.fischl@skype.net +# RFC6073 || L. Martini, C. Metz, T. Nadeau, M. Bocci, M. Aissaoui || lmartini@cisco.com, chmetz@cisco.com, tnadeau@lucidvision.com, matthew.bocci@alcatel-lucent.co.uk, mustapha.aissaoui@alcatel-lucent.com +# RFC6074 || E. Rosen, B. Davie, V. Radoaca, W. Luo || erosen@cisco.com, bsd@cisco.com, vasile.radoaca@alcatel-lucent.com, luo@weiluo.net +# RFC6075 || D. Cridland || dave.cridland@isode.com +# RFC6076 || D. Malas, A. Morton || d.malas@cablelabs.com, acmorton@att.com +# RFC6077 || D. Papadimitriou, Ed., M. Welzl, M. Scharf, B. Briscoe || dimitri.papadimitriou@alcatel-lucent.be, michawe@ifi.uio.no, michael.scharf@googlemail.com, bob.briscoe@bt.com +# RFC6078 || G. Camarillo, J. Melen || Gonzalo.Camarillo@ericsson.com, Jan.Melen@ericsson.com +# RFC6079 || G. Camarillo, P. Nikander, J. Hautakorpi, A. Keranen, A. Johnston || Gonzalo.Camarillo@ericsson.com, Pekka.Nikander@ericsson.com, Jani.Hautakorpi@ericsson.com, Ari.Keranen@ericsson.com, alan.b.johnston@gmail.com +# RFC6080 || D. Petrie, S. Channabasappa, Ed. || dan.ietf@SIPez.com, sumanth@cablelabs.com +# RFC6081 || D. Thaler || dthaler@microsoft.com +# RFC6082 || K. Whistler, G. Adams, M. Duerst, R. Presuhn, Ed., J. Klensin || kenw@sybase.com, glenn@skynav.com, duerst@it.aoyama.ac.jp, randy_presuhn@mindspring.com, john+ietf@jck.com +# RFC6083 || M. Tuexen, R. Seggelmann, E. Rescorla || tuexen@fh-muenster.de, seggelmann@fh-muenster.de, ekr@networkresonance.com +# RFC6084 || X. Fu, C. Dickmann, J. Crowcroft || fu@cs.uni-goettingen.de, mail@christian-dickmann.de, jon.crowcroft@cl.cam.ac.uk +# RFC6085 || S. Gundavelli, M. Townsley, O. Troan, W. Dec || sgundave@cisco.com, townsley@cisco.com, ot@cisco.com, wdec@cisco.com +# RFC6086 || C. Holmberg, E. Burger, H. Kaplan || christer.holmberg@ericsson.com, eburger@standardstrack.com, hkaplan@acmepacket.com +# RFC6087 || A. Bierman || andy@yumaworks.com +# RFC6088 || G. Tsirtsis, G. Giarreta, H. Soliman, N. Montavont || tsirtsis@qualcomm.com, gerardog@qualcomm.com, hesham@elevatemobile.com, nicolas.montavont@telecom-bretagne.eu +# RFC6089 || G. Tsirtsis, H. Soliman, N. Montavont, G. Giaretta, K. Kuladinithi || tsirtsis@qualcomm.com, hesham@elevatemobile.com, nicolas.montavont@telecom-bretagne.eu, gerardog@qualcomm.com, koo@comnets.uni-bremen.de +# RFC6090 || D. McGrew, K. Igoe, M. Salter || mcgrew@cisco.com, kmigoe@nsa.gov, msalter@restarea.ncsc.mil +# RFC6091 || N. Mavrogiannopoulos, D. Gillmor || nikos.mavrogiannopoulos@esat.kuleuven.be, dkg@fifthhorseman.net +# RFC6092 || J. Woodyatt, Ed. || jhw@apple.com +# RFC6093 || F. Gont, A. Yourtchenko || fernando@gont.com.ar, ayourtch@cisco.com +# RFC6094 || M. Bhatia, V. Manral || manav.bhatia@alcatel-lucent.com, vishwas@ipinfusion.com +# RFC6095 || B. Linowski, M. Ersue, S. Kuryla || bernd.linowski.ext@nsn.com, mehmet.ersue@nsn.com, s.kuryla@gmail.com +# RFC6096 || M. Tuexen, R. Stewart || tuexen@fh-muenster.de, randall@lakerest.net +# RFC6097 || J. Korhonen, V. Devarapalli || jouni.nospam@gmail.com, dvijay@gmail.com +# RFC6098 || H. Deng, H. Levkowetz, V. Devarapalli, S. Gundavelli, B. Haley || denghui02@gmail.com, henrik@levkowetz.com, dvijay@gmail.com, sgundave@cisco.com, brian.haley@hp.com +# RFC6101 || A. Freier, P. Karlton, P. Kocher || nikos.mavrogiannopoulos@esat.kuleuven.be +# RFC6104 || T. Chown, S. Venaas || tjc@ecs.soton.ac.uk, stig@cisco.com +# RFC6105 || E. Levy-Abegnoli, G. Van de Velde, C. Popoviciu, J. Mohacsi || elevyabe@cisco.com, gunter@cisco.com, chip@technodyne.com, mohacsi@niif.hu +# RFC6106 || J. Jeong, S. Park, L. Beloeil, S. Madanapalli || pjeong@brocade.com, soohong.park@samsung.com, luc.beloeil@orange-ftgroup.com, smadanapalli@gmail.com +# RFC6107 || K. Shiomoto, Ed., A. Farrel, Ed. || shiomoto.kohei@lab.ntt.co.jp, adrian@olddog.co.uk +# RFC6108 || C. Chung, A. Kasyanov, J. Livingood, N. Mody, B. Van Lieu || chae_chung@cable.comcast.com, alexander_kasyanov@cable.comcast.com, jason_livingood@cable.comcast.com, nirmal_mody@cable.comcast.com, brian@vanlieu.net +# RFC6109 || C. Petrucci, F. Gennai, A. Shahin, A. Vinciarelli || petrucci@digitpa.gov.it, francesco.gennai@isti.cnr.it, alba.shahin@isti.cnr.it, alessandro.vinciarelli@gmail.com +# RFC6110 || L. Lhotka, Ed. || ladislav@lhotka.name +# RFC6111 || L. Zhu || lzhu@microsoft.com +# RFC6112 || L. Zhu, P. Leach, S. Hartman || larry.zhu@microsoft.com, paulle@microsoft.com, hartmans-ietf@mit.edu +# RFC6113 || S. Hartman, L. Zhu || hartmans-ietf@mit.edu, larry.zhu@microsoft.com +# RFC6114 || M. Katagi, S. Moriai || Masanobu.Katagi@jp.sony.com, clefia-q@jp.sony.com +# RFC6115 || T. Li, Ed. || tony.li@tony.li +# RFC6116 || S. Bradner, L. Conroy, K. Fujiwara || sob@harvard.edu, lconroy@insensate.co.uk, fujiwara@jprs.co.jp +# RFC6117 || B. Hoeneisen, A. Mayrhofer, J. Livingood || bernie@ietf.hoeneisen.ch, alexander.mayrhofer@enum.at, jason_livingood@cable.comcast.com +# RFC6118 || B. Hoeneisen, A. Mayrhofer || bernie@ietf.hoeneisen.ch, alexander.mayrhofer@enum.at +# RFC6119 || J. Harrison, J. Berger, M. Bartlett || jon.harrison@metaswitch.com, jon.berger@metaswitch.com, mike.bartlett@metaswitch.com +# RFC6120 || P. Saint-Andre || ietf@stpeter.im +# RFC6121 || P. Saint-Andre || ietf@stpeter.im +# RFC6122 || P. Saint-Andre || ietf@stpeter.im +# RFC6123 || A. Farrel || adrian@olddog.co.uk +# RFC6124 || Y. Sheffer, G. Zorn, H. Tschofenig, S. Fluhrer || yaronf.ietf@gmail.com, gwz@net-zen.net, Hannes.Tschofenig@gmx.net, sfluhrer@cisco.com +# RFC6125 || P. Saint-Andre, J. Hodges || ietf@stpeter.im, Jeff.Hodges@PayPal.com +# RFC6126 || J. Chroboczek || jch@pps.jussieu.fr +# RFC6127 || J. Arkko, M. Townsley || jari.arkko@piuha.net, townsley@cisco.com +# RFC6128 || A. Begen || abegen@cisco.com +# RFC6129 || L. Romary, S. Lundberg || laurent.romary@inria.fr, slu@kb.dk +# RFC6130 || T. Clausen, C. Dearlove, J. Dean || T.Clausen@computer.org, chris.dearlove@baesystems.com, jdean@itd.nrl.navy.mil +# RFC6131 || R. George, B. Leiba || robinsgv@gmail.com, barryleiba@computer.org +# RFC6132 || R. George, B. Leiba || robinsgv@gmail.com, barryleiba@computer.org +# RFC6133 || R. George, B. Leiba, A. Melnikov || robinsgv@gmail.com, barryleiba@computer.org, Alexey.Melnikov@isode.com +# RFC6134 || A. Melnikov, B. Leiba || Alexey.Melnikov@isode.com, barryleiba@computer.org +# RFC6135 || C. Holmberg, S. Blau || christer.holmberg@ericsson.com, staffan.blau@ericsson.com +# RFC6136 || A. Sajassi, Ed., D. Mohan, Ed. || sajassi@cisco.com, mohand@nortel.com +# RFC6137 || D. Zisiadis, Ed., S. Kopsidas, Ed., M. Tsavli, Ed., G. Cessieux, Ed. || dzisiadis@iti.gr, spyros@uth.gr, sttsavli@uth.gr, Guillaume.Cessieux@cc.in2p3.fr +# RFC6138 || S. Kini, Ed., W. Lu, Ed. || sriganesh.kini@ericsson.com, wenhu.lu@ericsson.com +# RFC6139 || S. Russert, Ed., E. Fleischman, Ed., F. Templin, Ed. || russerts@hotmail.com, eric.fleischman@boeing.com, fltemplin@acm.org +# RFC6140 || A.B. Roach || adam@nostrum.com +# RFC6141 || G. Camarillo, Ed., C. Holmberg, Y. Gao || Gonzalo.Camarillo@ericsson.com, Christer.Holmberg@ericsson.com, gao.yang2@zte.com.cn +# RFC6142 || A. Moise, J. Brodkin || avy@fdos.ca, jonathan.brodkin@fdos.ca +# RFC6143 || T. Richardson, J. Levine || standards@realvnc.com, standards@taugh.com +# RFC6144 || F. Baker, X. Li, C. Bao, K. Yin || fred@cisco.com, xing@cernet.edu.cn, congxiao@cernet.edu.cn, kyin@cisco.com +# RFC6145 || X. Li, C. Bao, F. Baker || xing@cernet.edu.cn, congxiao@cernet.edu.cn, fred@cisco.com +# RFC6146 || M. Bagnulo, P. Matthews, I. van Beijnum || marcelo@it.uc3m.es, philip_matthews@magma.ca, iljitsch@muada.com +# RFC6147 || M. Bagnulo, A. Sullivan, P. Matthews, I. van Beijnum || marcelo@it.uc3m.es, ajs@shinkuro.com, philip_matthews@magma.ca, iljitsch@muada.com +# RFC6148 || P. Kurapati, R. Desetti, B. Joshi || kurapati@juniper.net, ramakrishnadtv@infosys.com, bharat_joshi@infosys.com +# RFC6149 || S. Turner, L. Chen || turners@ieca.com, lily.chen@nist.gov +# RFC6150 || S. Turner, L. Chen || turners@ieca.com, lily.chen@nist.gov +# RFC6151 || S. Turner, L. Chen || turners@ieca.com, lily.chen@nist.gov +# RFC6152 || J. Klensin, N. Freed, M. Rose, D. Crocker, Ed. || john+ietf@jck.com, ned.freed@mrochek.com, mrose17@gmail.com, dcrocker@bbiw.net +# RFC6153 || S. Das, G. Bajko || subir@research.Telcordia.com, gabor.bajko@nokia.com +# RFC6154 || B. Leiba, J. Nicolson || barryleiba@computer.org, nicolson@google.com +# RFC6155 || J. Winterbottom, M. Thomson, H. Tschofenig, R. Barnes || james.winterbottom@andrew.com, martin.thomson@andrew.com, Hannes.Tschofenig@gmx.net, rbarnes@bbn.com +# RFC6156 || G. Camarillo, O. Novo, S. Perreault, Ed. || Gonzalo.Camarillo@ericsson.com, Oscar.Novo@ericsson.com, simon.perreault@viagenie.ca +# RFC6157 || G. Camarillo, K. El Malki, V. Gurbani || Gonzalo.Camarillo@ericsson.com, karim@athonet.com, vkg@bell-labs.com +# RFC6158 || A. DeKok, Ed., G. Weber || aland@freeradius.org, gdweber@gmail.com +# RFC6159 || T. Tsou, G. Zorn, T. Taylor, Ed. || tena@huawei.com, gwz@net-zen.net, tom.taylor.stds@gmail.com +# RFC6160 || S. Turner || turners@ieca.com +# RFC6161 || S. Turner || turners@ieca.com +# RFC6162 || S. Turner || turners@ieca.com +# RFC6163 || Y. Lee, Ed., G. Bernstein, Ed., W. Imajuku || ylee@huawei.com, gregb@grotto-networking.com, imajuku.wataru@lab.ntt.co.jp +# RFC6164 || M. Kohno, B. Nitzan, R. Bush, Y. Matsuzaki, L. Colitti, T. Narten || mkohno@juniper.net, nitzan@juniper.net, randy@psg.com, maz@iij.ad.jp, lorenzo@google.com, narten@us.ibm.com +# RFC6165 || A. Banerjee, D. Ward || ayabaner@cisco.com, dward@juniper.net +# RFC6166 || S. Venaas || stig@cisco.com +# RFC6167 || M. Phillips, P. Adams, D. Rokicki, E. Johnson || m8philli@uk.ibm.com, phil_adams@us.ibm.com, derek.rokicki@softwareag.com, eric@tibco.com +# RFC6168 || W. Hardaker || ietf@hardakers.net +# RFC6169 || S. Krishnan, D. Thaler, J. Hoagland || suresh.krishnan@ericsson.com, dthaler@microsoft.com, Jim_Hoagland@symantec.com +# RFC6170 || S. Santesson, R. Housley, S. Bajaj, L. Rosenthol || sts@aaa-sec.com, housley@vigilsec.com, siddharthietf@gmail.com, leonardr@adobe.com +# RFC6171 || K. Zeilenga || Kurt.Zeilenga@Isode.COM +# RFC6172 || D. Black, D. Peterson || david.black@emc.com, david.peterson@brocade.com +# RFC6173 || P. Venkatesen, Ed. || prakashvn@hcl.com +# RFC6174 || E. Juskevicius || edj.etc@gmail.com +# RFC6175 || E. Juskevicius || edj.etc@gmail.com +# RFC6176 || S. Turner, T. Polk || turners@ieca.com, tim.polk@nist.gov +# RFC6177 || T. Narten, G. Huston, L. Roberts || narten@us.ibm.com, gih@apnic.net, lea.roberts@stanford.edu +# RFC6178 || D. Smith, J. Mullooly, W. Jaeger, T. Scholl || djsmith@cisco.com, jmullool@cisco.com, wjaeger@att.com, tscholl@nlayer.net +# RFC6179 || F. Templin, Ed. || fltemplin@acm.org +# RFC6180 || J. Arkko, F. Baker || jari.arkko@piuha.net, fred@cisco.com +# RFC6181 || M. Bagnulo || marcelo@it.uc3m.es +# RFC6182 || A. Ford, C. Raiciu, M. Handley, S. Barre, J. Iyengar || alan.ford@roke.co.uk, c.raiciu@cs.ucl.ac.uk, m.handley@cs.ucl.ac.uk, sebastien.barre@uclouvain.be, jiyengar@fandm.edu +# RFC6183 || A. Kobayashi, B. Claise, G. Muenz, K. Ishibashi || akoba@orange.plala.or.jp, bclaise@cisco.com, muenz@net.in.tum.de, ishibashi.keisuke@lab.ntt.co.jp +# RFC6184 || Y.-K. Wang, R. Even, T. Kristensen, R. Jesup || yekuiwang@huawei.com, even.roni@huawei.com, tom.kristensen@tandberg.com, rjesup@wgate.com +# RFC6185 || T. Kristensen, P. Luthi || tom.kristensen@tandberg.com, patrick.luthi@tandberg.com +# RFC6186 || C. Daboo || cyrus@daboo.name +# RFC6187 || K. Igoe, D. Stebila || kmigoe@nsa.gov, douglas@stebila.ca +# RFC6188 || D. McGrew || mcgrew@cisco.com +# RFC6189 || P. Zimmermann, A. Johnston, Ed., J. Callas || prz@mit.edu, alan.b.johnston@gmail.com, jon@callas.org +# RFC6190 || S. Wenger, Y.-K. Wang, T. Schierl, A. Eleftheriadis || stewe@stewe.org, yekui.wang@huawei.com, ts@thomas-schierl.de, alex@vidyo.com +# RFC6191 || F. Gont || fernando@gont.com.ar +# RFC6192 || D. Dugal, C. Pignataro, R. Dunn || dave@juniper.net, cpignata@cisco.com, rodunn@cisco.com +# RFC6193 || M. Saito, D. Wing, M. Toyama || ma.saito@nttv6.jp, dwing-ietf@fuggles.com, toyama.masashi@lab.ntt.co.jp +# RFC6194 || T. Polk, L. Chen, S. Turner, P. Hoffman || tim.polk@nist.gov, lily.chen@nist.gov, turners@ieca.com, paul.hoffman@vpnc.org +# RFC6195 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC6196 || A. Melnikov || Alexey.Melnikov@isode.com +# RFC6197 || K. Wolf || karlheinz.wolf@nic.at +# RFC6198 || B. Decraene, P. Francois, C. Pelsser, Z. Ahmad, A.J. Elizondo Armengol, T. Takeda || bruno.decraene@orange-ftgroup.com, francois@info.ucl.ac.be, cristel@iij.ad.jp, zubair.ahmad@orange-ftgroup.com, ajea@tid.es, takeda.tomonori@lab.ntt.co.jp +# RFC6201 || R. Asati, C. Pignataro, F. Calabria, C. Olvera || rajiva@cisco.com, cpignata@cisco.com, fcalabri@cisco.com, cesar.olvera@consulintel.es +# RFC6202 || S. Loreto, P. Saint-Andre, S. Salsano, G. Wilkins || salvatore.loreto@ericsson.com, ietf@stpeter.im, stefano.salsano@uniroma2.it, gregw@webtide.com +# RFC6203 || T. Sirainen || tss@iki.fi +# RFC6204 || H. Singh, W. Beebee, C. Donley, B. Stark, O. Troan, Ed. || shemant@cisco.com, wbeebee@cisco.com, c.donley@cablelabs.com, barbara.stark@att.com, ot@cisco.com +# RFC6205 || T. Otani, Ed., D. Li, Ed. || tm-otani@kddi.com, danli@huawei.com +# RFC6206 || P. Levis, T. Clausen, J. Hui, O. Gnawali, J. Ko || pal@cs.stanford.edu, T.Clausen@computer.org, jhui@archrock.com, gnawali@cs.stanford.edu, jgko@cs.jhu.edu +# RFC6207 || R. Denenberg, Ed. || rden@loc.gov +# RFC6208 || K. Sankar, Ed., A. Jones || ksankar@cisco.com, arnold.jones@snia.org +# RFC6209 || W. Kim, J. Lee, J. Park, D. Kwon || whkim5@ensec.re.kr, jklee@ensec.re.kr, jhpark@ensec.re.kr, ds_kwon@ensec.re.kr +# RFC6210 || J. Schaad || ietf@augustcellars.com +# RFC6211 || J. Schaad || ietf@augustcellars.com +# RFC6212 || M. Kucherawy || msk@cloudmark.com +# RFC6213 || C. Hopps, L. Ginsberg || chopps@cisco.com, ginsberg@cisco.com +# RFC6214 || B. Carpenter, R. Hinden || brian.e.carpenter@gmail.com, bob.hinden@gmail.com +# RFC6215 || M. Bocci, L. Levrau, D. Frost || matthew.bocci@alcatel-lucent.com, lieven.levrau@alcatel-lucent.com, danfrost@cisco.com +# RFC6216 || C. Jennings, K. Ono, R. Sparks, B. Hibbard, Ed. || fluffy@cisco.com, kumiko@cs.columbia.edu, Robert.Sparks@tekelec.com, Brian.Hibbard@tekelec.com +# RFC6217 || T. Ritter || tom@ritter.vg +# RFC6218 || G. Zorn, T. Zhang, J. Walker, J. Salowey || gwz@net-zen.net, tzhang@advistatech.com, jesse.walker@intel.com, jsalowey@cisco.com +# RFC6219 || X. Li, C. Bao, M. Chen, H. Zhang, J. Wu || xing@cernet.edu.cn, congxiao@cernet.edu.cn, fibrib@gmail.com, neilzh@gmail.com, jianping@cernet.edu.cn +# RFC6220 || D. McPherson, Ed., O. Kolkman, Ed., J. Klensin, Ed., G. Huston, Ed., Internet Architecture Board || dmcpherson@verisign.com, olaf@NLnetLabs.nl, john+ietf@jck.com, gih@apnic.net +# RFC6221 || D. Miles, Ed., S. Ooghe, W. Dec, S. Krishnan, A. Kavanagh || david.miles@alcatel-lucent.com, sven.ooghe@alcatel-lucent.com, wdec@cisco.com, suresh.krishnan@ericsson.com, alan.kavanagh@ericsson.com +# RFC6222 || A. Begen, C. Perkins, D. Wing || abegen@cisco.com, csp@csperkins.org, dwing-ietf@fuggles.com +# RFC6223 || C. Holmberg || christer.holmberg@ericsson.com +# RFC6224 || T. Schmidt, M. Waehlisch, S. Krishnan || schmidt@informatik.haw-hamburg.de, mw@link-lab.net, suresh.krishnan@ericsson.com +# RFC6225 || J. Polk, M. Linsner, M. Thomson, B. Aboba, Ed. || jmpolk@cisco.com, marc.linsner@cisco.com, martin.thomson@andrew.com, bernard_aboba@hotmail.com +# RFC6226 || B. Joshi, A. Kessler, D. McWalter || bharat_joshi@infosys.com, kessler@cisco.com, david@mcwalter.eu +# RFC6227 || T. Li, Ed. || tli@cisco.com +# RFC6228 || C. Holmberg || christer.holmberg@ericsson.com +# RFC6229 || J. Strombergson, S. Josefsson || joachim@secworks.se, simon@josefsson.org +# RFC6230 || C. Boulton, T. Melanchuk, S. McGlashan || chris@ns-technologies.com, timm@rainwillow.com, smcg.stds01@mcglashan.org +# RFC6231 || S. McGlashan, T. Melanchuk, C. Boulton || smcg.stds01@mcglashan.org, timm@rainwillow.com, chris@ns-technologies.com +# RFC6232 || F. Wei, Y. Qin, Z. Li, T. Li, J. Dong || weifang@chinamobile.com, qinyue@chinamobile.com, lizhenqiang@chinamobile.com, tony.li@tony.li, dongjie_dj@huawei.com +# RFC6233 || T. Li, L. Ginsberg || tony.li@tony.li, ginsberg@cisco.com +# RFC6234 || D. Eastlake 3rd, T. Hansen || d3e3e3@gmail.com, tony+shs@maillennium.att.com +# RFC6235 || E. Boschi, B. Trammell || boschie@tik.ee.ethz.ch, trammell@tik.ee.ethz.ch +# RFC6236 || I. Johansson, K. Jung || ingemar.s.johansson@ericsson.com, kyunghun.jung@samsung.com +# RFC6237 || B. Leiba, A. Melnikov || barryleiba@computer.org, Alexey.Melnikov@isode.com +# RFC6238 || D. M'Raihi, S. Machani, M. Pei, J. Rydell || davidietf@gmail.com, smachani@diversinet.com, Mingliang_Pei@symantec.com, johanietf@gmail.com +# RFC6239 || K. Igoe || kmigoe@nsa.gov +# RFC6240 || D. Zelig, Ed., R. Cohen, Ed., T. Nadeau, Ed. || david_zelig@pmc-sierra.com, ronc@resolutenetworks.com, Thomas.Nadeau@ca.com +# RFC6241 || R. Enns, Ed., M. Bjorklund, Ed., J. Schoenwaelder, Ed., A. Bierman, Ed. || rob.enns@gmail.com, mbj@tail-f.com, j.schoenwaelder@jacobs-university.de, andy@yumaworks.com +# RFC6242 || M. Wasserman || mrw@painless-security.com +# RFC6243 || A. Bierman, B. Lengyel || andy@yumaworks.com, balazs.lengyel@ericsson.com +# RFC6244 || P. Shafer || phil@juniper.net +# RFC6245 || P. Yegani, K. Leung, A. Lior, K. Chowdhury, J. Navali || pyegani@juniper.net, kleung@cisco.com, avi@bridgewatersystems.com, kchowdhu@cisco.com, jnavali@cisco.com +# RFC6246 || A. Sajassi, Ed., F. Brockners, D. Mohan, Ed., Y. Serbest || sajassi@cisco.com, fbrockne@cisco.com, dinmohan@hotmail.com, yetik_serbest@labs.att.com +# RFC6247 || L. Eggert || lars.eggert@nokia.com +# RFC6248 || A. Morton || acmorton@att.com +# RFC6249 || A. Bryan, N. McNab, T. Tsujikawa, P. Poeml, H. Nordstrom || anthonybryan@gmail.com, neil@nabber.org, tatsuhiro.t@gmail.com, peter@poeml.de, henrik@henriknordstrom.net +# RFC6250 || D. Thaler || dthaler@microsoft.com +# RFC6251 || S. Josefsson || simon@josefsson.org +# RFC6252 || A. Dutta, Ed., V. Fajardo, Y. Ohba, K. Taniuchi, H. Schulzrinne || ashutosh.dutta@ieee.org, vf0213@gmail.com, yoshihiro.ohba@toshiba.co.jp, kenichi.taniuchi@toshiba.co.jp, hgs@cs.columbia.edu +# RFC6253 || T. Heer, S. Varjonen || heer@cs.rwth-aachen.de, samu.varjonen@hiit.fi +# RFC6254 || M. McFadden || mark.mcfadden@icann.org +# RFC6255 || M. Blanchet || Marc.Blanchet@viagenie.ca +# RFC6256 || W. Eddy, E. Davies || wes@mti-systems.com, elwynd@folly.org.uk +# RFC6257 || S. Symington, S. Farrell, H. Weiss, P. Lovell || susan@mitre.org, stephen.farrell@cs.tcd.ie, howard.weiss@sparta.com, dtnbsp@gmail.com +# RFC6258 || S. Symington || susan@mitre.org +# RFC6259 || S. Symington || susan@mitre.org +# RFC6260 || S. Burleigh || Scott.C.Burleigh@jpl.nasa.gov +# RFC6261 || A. Keranen || ari.keranen@ericsson.com +# RFC6262 || S. Ikonin || ikonin@spiritdsp.com +# RFC6263 || X. Marjou, A. Sollaud || xavier.marjou@orange-ftgroup.com, aurelien.sollaud@orange-ftgroup.com +# RFC6264 || S. Jiang, D. Guo, B. Carpenter || jiangsheng@huawei.com, guoseu@huawei.com, brian.e.carpenter@gmail.com +# RFC6265 || A. Barth || abarth@eecs.berkeley.edu +# RFC6266 || J. Reschke || julian.reschke@greenbytes.de +# RFC6267 || V. Cakulev, G. Sundaram || violeta.cakulev@alcatel-lucent.com, ganesh.sundaram@alcatel-lucent.com +# RFC6268 || J. Schaad, S. Turner || ietf@augustcellars.com, turners@ieca.com +# RFC6269 || M. Ford, Ed., M. Boucadair, A. Durand, P. Levis, P. Roberts || ford@isoc.org, mohamed.boucadair@orange-ftgroup.com, adurand@juniper.net, pierre.levis@orange-ftgroup.com, roberts@isoc.org +# RFC6270 || M. Yevstifeyev || evnikita2@gmail.com +# RFC6271 || J-F. Mule || jf.mule@cablelabs.com +# RFC6272 || F. Baker, D. Meyer || fred@cisco.com, dmm@cisco.com +# RFC6273 || A. Kukec, S. Krishnan, S. Jiang || ana.kukec@fer.hr, suresh.krishnan@ericsson.com, jiangsheng@huawei.com +# RFC6274 || F. Gont || fernando@gont.com.ar +# RFC6275 || C. Perkins, Ed., D. Johnson, J. Arkko || charliep@computer.org, dbj@cs.rice.edu, jari.arkko@ericsson.com +# RFC6276 || R. Droms, P. Thubert, F. Dupont, W. Haddad, C. Bernardos || rdroms@cisco.com, pthubert@cisco.com, fdupont@isc.org, Wassim.Haddad@ericsson.com, cjbc@it.uc3m.es +# RFC6277 || S. Santesson, P. Hallam-Baker || sts@aaa-sec.com, hallam@gmail.com +# RFC6278 || J. Herzog, R. Khazan || jherzog@ll.mit.edu, rkh@ll.mit.edu +# RFC6279 || M. Liebsch, Ed., S. Jeong, Q. Wu || liebsch@neclab.eu, sjjeong@etri.re.kr, sunseawq@huawei.com +# RFC6280 || R. Barnes, M. Lepinski, A. Cooper, J. Morris, H. Tschofenig, H. Schulzrinne || rbarnes@bbn.com, mlepinski@bbn.com, acooper@cdt.org, jmorris@cdt.org, Hannes.Tschofenig@gmx.net, hgs@cs.columbia.edu +# RFC6281 || S. Cheshire, Z. Zhu, R. Wakikawa, L. Zhang || cheshire@apple.com, zhenkai@ucla.edu, ryuji@jp.toyota-itc.com, lixia@cs.ucla.edu +# RFC6282 || J. Hui, Ed., P. Thubert || jhui@archrock.com, pthubert@cisco.com +# RFC6283 || A. Jerman Blazic, S. Saljic, T. Gondrom || aljosa@setcce.si, svetlana.saljic@setcce.si, tobias.gondrom@gondrom.org +# RFC6284 || A. Begen, D. Wing, T. Van Caenegem || abegen@cisco.com, dwing-ietf@fuggles.com, Tom.Van_Caenegem@alcatel-lucent.com +# RFC6285 || B. Ver Steeg, A. Begen, T. Van Caenegem, Z. Vax || billvs@cisco.com, abegen@cisco.com, Tom.Van_Caenegem@alcatel-lucent.be, zeevvax@microsoft.com +# RFC6286 || E. Chen, J. Yuan || enkechen@cisco.com, jenny@cisco.com +# RFC6287 || D. M'Raihi, J. Rydell, S. Bajaj, S. Machani, D. Naccache || davidietf@gmail.com, johanietf@gmail.com, siddharthietf@gmail.com, smachani@diversinet.com, david.naccache@ens.fr +# RFC6288 || C. Reed || creed@opengeospatial.org +# RFC6289 || E. Cardona, S. Channabasappa, J-F. Mule || e.cardona@cablelabs.com, sumanth@cablelabs.com, jf.mule@cablelabs.com +# RFC6290 || Y. Nir, Ed., D. Wierbowski, F. Detienne, P. Sethi || ynir@checkpoint.com, wierbows@us.ibm.com, fd@cisco.com, psethi@cisco.com +# RFC6291 || L. Andersson, H. van Helvoort, R. Bonica, D. Romascanu, S. Mansfield || loa.andersson@ericsson.com, huub.van.helvoort@huawei.com, rbonica@juniper.net, dromasca@gmail.com , scott.mansfield@ericsson.com +# RFC6292 || P. Hoffman || paul.hoffman@vpnc.org +# RFC6293 || P. Hoffman || paul.hoffman@vpnc.org +# RFC6294 || Q. Hu, B. Carpenter || qhu009@aucklanduni.ac.nz, brian.e.carpenter@gmail.com +# RFC6295 || J. Lazzaro, J. Wawrzynek || lazzaro@cs.berkeley.edu, johnw@cs.berkeley.edu +# RFC6296 || M. Wasserman, F. Baker || mrw@painless-security.com, fred@cisco.com +# RFC6297 || M. Welzl, D. Ros || michawe@ifi.uio.no, david.ros@telecom-bretagne.eu +# RFC6298 || V. Paxson, M. Allman, J. Chu, M. Sargent || vern@icir.org, mallman@icir.org, hkchu@google.com, mts71@case.edu +# RFC6301 || Z. Zhu, R. Wakikawa, L. Zhang || zhenkai@cs.ucla.edu, ryuji.wakikawa@gmail.com, lixia@cs.ucla.edu +# RFC6302 || A. Durand, I. Gashinsky, D. Lee, S. Sheppard || adurand@juniper.net, igor@yahoo-inc.com, donn@fb.com, Scott.Sheppard@att.com +# RFC6303 || M. Andrews || marka@isc.org +# RFC6304 || J. Abley, W. Maton || joe.abley@icann.org, wmaton@ryouko.imsb.nrc.ca +# RFC6305 || J. Abley, W. Maton || joe.abley@icann.org, wmaton@ryouko.imsb.nrc.ca +# RFC6306 || P. Frejborg || pfrejborg@gmail.com +# RFC6307 || D. Black, Ed., L. Dunbar, Ed., M. Roth, R. Solomon || david.black@emc.com, ldunbar@huawei.com, MRoth@infinera.com, ronens@corrigent.com +# RFC6308 || P. Savola || psavola@funet.fi +# RFC6309 || J. Arkko, A. Keranen, J. Mattsson || jari.arkko@piuha.net, ari.keranen@ericsson.com, john.mattsson@ericsson.com +# RFC6310 || M. Aissaoui, P. Busschbach, L. Martini, M. Morrow, T. Nadeau, Y(J). Stein || mustapha.aissaoui@alcatel-lucent.com, busschbach@alcatel-lucent.com, lmartini@cisco.com, mmorrow@cisco.com, Thomas.Nadeau@ca.com, yaakov_s@rad.com +# RFC6311 || R. Singh, Ed., G. Kalyani, Y. Nir, Y. Sheffer, D. Zhang || rsj@cisco.com, kagarigi@cisco.com, ynir@checkpoint.com, yaronf.ietf@gmail.com, zhangdacheng@huawei.com +# RFC6312 || R. Koodli || rkoodli@cisco.com +# RFC6313 || B. Claise, G. Dhandapani, P. Aitken, S. Yates || bclaise@cisco.com, gowri@cisco.com, paitken@cisco.com, syates@cisco.com +# RFC6314 || C. Boulton, J. Rosenberg, G. Camarillo, F. Audet || chris@ns-technologies.com, jdrosen@jdrosen.net, Gonzalo.Camarillo@ericsson.com, francois.audet@skype.net +# RFC6315 || E. Guy, K. Darilion || edguy@CleverSpoke.com, klaus.darilion@nic.at +# RFC6316 || M. Komu, M. Bagnulo, K. Slavov, S. Sugimoto, Ed. || miika@iki.fi, marcelo@it.uc3m.es, kristian.slavov@ericsson.com, shinta@sfc.wide.ad.jp +# RFC6317 || M. Komu, T. Henderson || miika@iki.fi, thomas.r.henderson@boeing.com +# RFC6318 || R. Housley, J. Solinas || housley@vigilsec.com, jasolin@orion.ncsc.mil +# RFC6319 || M. Azinger, L. Vegoda || marla.azinger@ftr.com, leo.vegoda@icann.org +# RFC6320 || S. Wadhwa, J. Moisand, T. Haag, N. Voigt, T. Taylor, Ed. || sanjay.wadhwa@alcatel-lucent.com, jmoisand@juniper.net, haagt@telekom.de, norbert.voigt@nsn.com, tom.taylor.stds@gmail.com +# RFC6321 || C. Daboo, M. Douglass, S. Lees || cyrus@daboo.name, douglm@rpi.edu, steven.lees@microsoft.com +# RFC6322 || P. Hoffman || paul.hoffman@vpnc.org +# RFC6323 || G. Renker, G. Fairhurst || gerrit@erg.abdn.ac.uk, gorry@erg.abdn.ac.uk +# RFC6324 || G. Nakibly, F. Templin || gnakibly@yahoo.com, fltemplin@acm.org +# RFC6325 || R. Perlman, D. Eastlake 3rd, D. Dutt, S. Gai, A. Ghanwani || Radia@alum.mit.edu, d3e3e3@gmail.com, ddutt@cisco.com, silvano@ip6.com, anoop@alumni.duke.edu +# RFC6326 || D. Eastlake, A. Banerjee, D. Dutt, R. Perlman, A. Ghanwani || d3e3e3@gmail.com, ayabaner@cisco.com, ddutt@cisco.com, Radia@alum.mit.edu, anoop@alumni.duke.edu +# RFC6327 || D. Eastlake 3rd, R. Perlman, A. Ghanwani, D. Dutt, V. Manral || d3e3e3@gmail.com, Radia@alum.mit.edu, anoop@alumni.duke.edu, ddutt@cisco.com, vishwas.manral@hp.com +# RFC6328 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC6329 || D. Fedyk, Ed., P. Ashwood-Smith, Ed., D. Allan, A. Bragg, P. Unbehagen || Donald.Fedyk@alcatel-lucent.com, Peter.AshwoodSmith@huawei.com, david.i.allan@ericsson.com, nbragg@ciena.com, unbehagen@avaya.com +# RFC6330 || M. Luby, A. Shokrollahi, M. Watson, T. Stockhammer, L. Minder || luby@qti.qualcomm.com, amin.shokrollahi@epfl.ch, watsonm@netflix.com, stockhammer@nomor.de, lminder@qualcomm.com +# RFC6331 || A. Melnikov || Alexey.Melnikov@isode.com +# RFC6332 || A. Begen, E. Friedrich || abegen@cisco.com, efriedri@cisco.com +# RFC6333 || A. Durand, R. Droms, J. Woodyatt, Y. Lee || adurand@juniper.net, rdroms@cisco.com, jhw@apple.com, yiu_lee@cable.comcast.com +# RFC6334 || D. Hankins, T. Mrugalski || dhankins@google.com, tomasz.mrugalski@eti.pg.gda.pl +# RFC6335 || M. Cotton, L. Eggert, J. Touch, M. Westerlund, S. Cheshire || michelle.cotton@icann.org, lars.eggert@nokia.com, touch@isi.edu, magnus.westerlund@ericsson.com, cheshire@apple.com +# RFC6336 || M. Westerlund, C. Perkins || magnus.westerlund@ericsson.com, csp@csperkins.org +# RFC6337 || S. Okumura, T. Sawada, P. Kyzivat || shinji.okumura@softfront.jp, tu-sawada@kddi.com, pkyzivat@alum.mit.edu +# RFC6338 || V. Giralt, R. McDuff || victoriano@uma.es, r.mcduff@uq.edu.au +# RFC6339 || S. Josefsson, L. Hornquist Astrand || simon@josefsson.org, lha@apple.com +# RFC6340 || R. Presuhn || randy_presuhn@mindspring.com +# RFC6341 || K. Rehor, Ed., L. Portman, Ed., A. Hutton, R. Jain || krehor@cisco.com, leon.portman@nice.com, andrew.hutton@siemens-enterprise.com, rajnish.jain@ipc.com +# RFC6342 || R. Koodli || rkoodli@cisco.com +# RFC6343 || B. Carpenter || brian.e.carpenter@gmail.com +# RFC6344 || G. Bernstein, Ed., D. Caviglia, R. Rabbat, H. van Helvoort || gregb@grotto-networking.com, diego.caviglia@ericsson.com, rabbat@alum.mit.edu, hhelvoort@huawei.com +# RFC6345 || P. Duffy, S. Chakrabarti, R. Cragie, Y. Ohba, Ed., A. Yegin || paduffy@cisco.com, samita.chakrabarti@ericsson.com, robert.cragie@gridmerge.com, yoshihiro.ohba@toshiba.co.jp, a.yegin@partner.samsung.com +# RFC6346 || R. Bush, Ed. || randy@psg.com +# RFC6347 || E. Rescorla, N. Modadugu || ekr@rtfm.com, nagendra@cs.stanford.edu +# RFC6348 || JL. Le Roux, Ed., T. Morin, Ed. || jeanlouis.leroux@orange-ftgroup.com, thomas.morin@orange-ftgroup.com +# RFC6349 || B. Constantine, G. Forget, R. Geib, R. Schrage || barry.constantine@jdsu.com, gilles.forget@sympatico.ca, Ruediger.Geib@telekom.de, reinhard@schrageconsult.com +# RFC6350 || S. Perreault || simon.perreault@viagenie.ca +# RFC6351 || S. Perreault || simon.perreault@viagenie.ca +# RFC6352 || C. Daboo || cyrus@daboo.name +# RFC6353 || W. Hardaker || ietf@hardakers.net +# RFC6354 || Q. Xie || Qiaobing.Xie@gmail.com +# RFC6355 || T. Narten, J. Johnson || narten@us.ibm.com, jarrod.b.johnson@gmail.com +# RFC6356 || C. Raiciu, M. Handley, D. Wischik || costin.raiciu@cs.pub.ro, m.handley@cs.ucl.ac.uk, d.wischik@cs.ucl.ac.uk +# RFC6357 || V. Hilt, E. Noel, C. Shen, A. Abdelal || volker.hilt@alcatel-lucent.com, eric.noel@att.com, charles@cs.columbia.edu, aabdelal@sonusnet.com +# RFC6358 || P. Hoffman || paul.hoffman@vpnc.org +# RFC6359 || S. Ginoza, M. Cotton, A. Morris || sginoza@amsl.com, michelle.cotton@icann.org, amorris@amsl.com +# RFC6360 || R. Housley || housley@vigilsec.com +# RFC6361 || J. Carlson, D. Eastlake 3rd || carlsonj@workingcode.com, d3e3e3@gmail.com +# RFC6362 || K. Meadors, Ed. || kyle@drummondgroup.com +# RFC6363 || M. Watson, A. Begen, V. Roca || watsonm@netflix.com, abegen@cisco.com, vincent.roca@inria.fr +# RFC6364 || A. Begen || abegen@cisco.com +# RFC6365 || P. Hoffman, J. Klensin || paul.hoffman@vpnc.org, john+ietf@jck.com +# RFC6366 || J. Valin, K. Vos || jmvalin@jmvalin.ca, koen.vos@skype.net +# RFC6367 || S. Kanno, M. Kanda || kanno.satoru@po.ntts.co.jp, kanda.masayuki@lab.ntt.co.jp +# RFC6368 || P. Marques, R. Raszuk, K. Patel, K. Kumaki, T. Yamagata || pedro.r.marques@gmail.com, robert@raszuk.net, keyupate@cisco.com, ke-kumaki@kddi.com, to-yamagata@kddi.com +# RFC6369 || E. Haleplidis, O. Koufopavlou, S. Denazis || ehalep@ece.upatras.gr, odysseas@ece.upatras.gr, sdena@upatras.gr +# RFC6370 || M. Bocci, G. Swallow, E. Gray || matthew.bocci@alcatel-lucent.com, swallow@cisco.com, eric.gray@ericsson.com +# RFC6371 || I. Busi, Ed., D. Allan, Ed. || Italo.Busi@alcatel-lucent.com, david.i.allan@ericsson.com +# RFC6372 || N. Sprecher, Ed., A. Farrel, Ed. || nurit.sprecher@nsn.com, adrian@olddog.co.uk +# RFC6373 || L. Andersson, Ed., L. Berger, Ed., L. Fang, Ed., N. Bitar, Ed., E. Gray, Ed. || loa.andersson@ericsson.com, lberger@labn.net, lufang@cisco.com, nabil.n.bitar@verizon.com, Eric.Gray@Ericsson.com +# RFC6374 || D. Frost, S. Bryant || danfrost@cisco.com, stbryant@cisco.com +# RFC6375 || D. Frost, Ed., S. Bryant, Ed. || danfrost@cisco.com, stbryant@cisco.com +# RFC6376 || D. Crocker, Ed., T. Hansen, Ed., M. Kucherawy, Ed. || dcrocker@bbiw.net, tony+dkimov@maillennium.att.com, msk@cloudmark.com +# RFC6377 || M. Kucherawy || msk@cloudmark.com +# RFC6378 || Y. Weingarten, Ed., S. Bryant, E. Osborne, N. Sprecher, A. Fulignoli, Ed. || yaacov.weingarten@nsn.com, stbryant@cisco.com, eosborne@cisco.com, nurit.sprecher@nsn.com, annamaria.fulignoli@ericsson.com +# RFC6379 || L. Law, J. Solinas || lelaw@orion.ncsc.mil, jasolin@orion.ncsc.mil +# RFC6380 || K. Burgin, M. Peck || kwburgi@tycho.ncsc.mil, mpeck@mitre.org +# RFC6381 || R. Gellens, D. Singer, P. Frojdh || rg+ietf@qualcomm.com, singer@apple.com, Per.Frojdh@ericsson.com +# RFC6382 || D. McPherson, R. Donnelly, F. Scalzo || dmcpherson@verisign.com, rdonnelly@verisign.com, fscalzo@verisign.com +# RFC6383 || K. Shiomoto, A. Farrel || shiomoto.kohei@lab.ntt.co.jp, adrian@olddog.co.uk +# RFC6384 || I. van Beijnum || iljitsch@muada.com +# RFC6385 || M. Barnes, A. Doria, H. Alvestrand, B. Carpenter || mary.ietf.barnes@gmail.com, avri@acm.org, harald@alvestrand.no, brian.e.carpenter@gmail.com +# RFC6386 || J. Bankoski, J. Koleszar, L. Quillio, J. Salonen, P. Wilkins, Y. Xu || jimbankoski@google.com, jkoleszar@google.com, louquillio@google.com, jsalonen@google.com, paulwilkins@google.com, yaowu@google.com +# RFC6387 || A. Takacs, L. Berger, D. Caviglia, D. Fedyk, J. Meuric || attila.takacs@ericsson.com, lberger@labn.net, diego.caviglia@ericsson.com, donald.fedyk@alcatel-lucent.com, julien.meuric@orange.com +# RFC6388 || IJ. Wijnands, Ed., I. Minei, Ed., K. Kompella, B. Thomas || ice@cisco.com, ina@juniper.net, kireeti@juniper.net, bobthomas@alum.mit.edu +# RFC6389 || R. Aggarwal, JL. Le Roux || raggarwa_1@yahoo.com, jeanlouis.leroux@orange-ftgroup.com +# RFC6390 || A. Clark, B. Claise || alan.d.clark@telchemy.com, bclaise@cisco.com +# RFC6391 || S. Bryant, Ed., C. Filsfils, U. Drafz, V. Kompella, J. Regan, S. Amante || stbryant@cisco.com, cfilsfil@cisco.com, Ulrich.Drafz@telekom.de, vach.kompella@alcatel-lucent.com, joe.regan@alcatel-lucent.com, shane@level3.net +# RFC6392 || R. Alimi, Ed., A. Rahman, Ed., Y. Yang, Ed. || ralimi@google.com, Akbar.Rahman@InterDigital.com, yry@cs.yale.edu +# RFC6393 || M. Yevstifeyev || evnikita2@gmail.com +# RFC6394 || R. Barnes || rbarnes@bbn.com +# RFC6395 || S. Gulrajani, S. Venaas || sameerg@cisco.com, stig@cisco.com +# RFC6396 || L. Blunk, M. Karir, C. Labovitz || ljb@merit.edu, mkarir@merit.edu, labovit@deepfield.net +# RFC6397 || T. Manderson || terry.manderson@icann.org +# RFC6398 || F. Le Faucheur, Ed. || flefauch@cisco.com +# RFC6401 || F. Le Faucheur, J. Polk, K. Carlberg || flefauch@cisco.com, jmpolk@cisco.com, carlberg@g11.org.uk +# RFC6402 || J. Schaad || jimsch@augustcellars.com +# RFC6403 || L. Zieglar, S. Turner, M. Peck || llziegl@tycho.ncsc.mil, turners@ieca.com, mpeck@alumni.virginia.edu +# RFC6404 || J. Seedorf, S. Niccolini, E. Chen, H. Scholz || jan.seedorf@nw.neclab.eu, saverio.niccolini@.neclab.eu, eric.chen@lab.ntt.co.jp, hendrik.scholz@voipfuture.com +# RFC6405 || A. Uzelac, Ed., Y. Lee, Ed. || adam.uzelac@globalcrossing.com, yiu_lee@cable.comcast.com +# RFC6406 || D. Malas, Ed., J. Livingood, Ed. || d.malas@cablelabs.com, Jason_Livingood@cable.comcast.com +# RFC6407 || B. Weis, S. Rowles, T. Hardjono || bew@cisco.com, sheela@cisco.com, hardjono@mit.edu +# RFC6408 || M. Jones, J. Korhonen, L. Morand || mark@azu.ca, jouni.nospam@gmail.com, lionel.morand@orange-ftgroup.com +# RFC6409 || R. Gellens, J. Klensin || rg+ietf@qualcomm.com, john-ietf@jck.com +# RFC6410 || R. Housley, D. Crocker, E. Burger || housley@vigilsec.com, dcrocker@bbiw.net, eburger@standardstrack.com +# RFC6411 || M. Behringer, F. Le Faucheur, B. Weis || mbehring@cisco.com, flefauch@cisco.com, bew@cisco.com +# RFC6412 || S. Poretsky, B. Imhoff, K. Michielsen || sporetsky@allot.com, bimhoff@planetspork.com, kmichiel@cisco.com +# RFC6413 || S. Poretsky, B. Imhoff, K. Michielsen || sporetsky@allot.com, bimhoff@planetspork.com, kmichiel@cisco.com +# RFC6414 || S. Poretsky, R. Papneja, J. Karthik, S. Vapiwala || sporetsky@allot.com, rajiv.papneja@huawei.com, jkarthik@cisco.com, svapiwal@cisco.com +# RFC6415 || E. Hammer-Lahav, Ed., B. Cook || eran@hueniverse.com, romeda@gmail.com +# RFC6416 || M. Schmidt, F. de Bont, S. Doehla, J. Kim || malte.schmidt@dolby.com, frans.de.bont@philips.com, stefan.doehla@iis.fraunhofer.de, kjh1905m@naver.com +# RFC6417 || P. Eardley, L. Eggert, M. Bagnulo, R. Winter || philip.eardley@bt.com, lars.eggert@nokia.com, marcelo@it.uc3m.es, rolf.winter@neclab.eu +# RFC6418 || M. Blanchet, P. Seite || Marc.Blanchet@viagenie.ca, pierrick.seite@orange.com +# RFC6419 || M. Wasserman, P. Seite || mrw@painless-security.com, pierrick.seite@orange-ftgroup.com +# RFC6420 || Y. Cai, H. Ou || ycai@cisco.com, hou@cisco.com +# RFC6421 || D. Nelson, Ed. || d.b.nelson@comcast.net +# RFC6422 || T. Lemon, Q. Wu || mellon@nominum.com, sunseawq@huawei.com +# RFC6423 || H. Li, L. Martini, J. He, F. Huang || lihan@chinamobile.com, lmartini@cisco.com, hejia@huawei.com, feng.f.huang@alcatel-sbell.com.cn +# RFC6424 || N. Bahadur, K. Kompella, G. Swallow || nitinb@juniper.net, kireeti@juniper.net, swallow@cisco.com +# RFC6425 || S. Saxena, Ed., G. Swallow, Z. Ali, A. Farrel, S. Yasukawa, T. Nadeau || ssaxena@cisco.com, swallow@cisco.com, zali@cisco.com, adrian@olddog.co.uk, yasukawa.seisho@lab.ntt.co.jp, thomas.nadeau@ca.com +# RFC6426 || E. Gray, N. Bahadur, S. Boutros, R. Aggarwal || eric.gray@ericsson.com, nitinb@juniper.net, sboutros@cisco.com, raggarwa_1@yahoo.com +# RFC6427 || G. Swallow, Ed., A. Fulignoli, Ed., M. Vigoureux, Ed., S. Boutros, D. Ward || swallow@cisco.com, annamaria.fulignoli@ericsson.com, martin.vigoureux@alcatel-lucent.com, sboutros@cisco.com, dward@juniper.net +# RFC6428 || D. Allan, Ed., G. Swallow, Ed., J. Drake, Ed. || david.i.allan@ericsson.com, swallow@cisco.com, jdrake@juniper.net +# RFC6429 || M. Bashyam, M. Jethanandani, A. Ramaiah || mbashyam@ocarinanetworks.com, mjethanandani@gmail.com, ananth@cisco.com +# RFC6430 || K. Li, B. Leiba || likepeng@huawei.com, barryleiba@computer.org +# RFC6431 || M. Boucadair, P. Levis, G. Bajko, T. Savolainen, T. Tsou || mohamed.boucadair@orange.com, pierre.levis@orange.com, gabor.bajko@nokia.com, teemu.savolainen@nokia.com, tina.tsou.zouting@huawei.com +# RFC6432 || R. Jesske, L. Liess || r.jesske@telekom.de, L.Liess@telekom.de +# RFC6433 || P. Hoffman || paul.hoffman@vpnc.org +# RFC6434 || E. Jankiewicz, J. Loughney, T. Narten || edward.jankiewicz@sri.com, john.loughney@nokia.com, narten@us.ibm.com +# RFC6435 || S. Boutros, Ed., S. Sivabalan, Ed., R. Aggarwal, Ed., M. Vigoureux, Ed., X. Dai, Ed. || sboutros@cisco.com, msiva@cisco.com, raggarwa_1@yahoo.com, martin.vigoureux@alcatel-lucent.com, dai.xuehui@zte.com.cn +# RFC6436 || S. Amante, B. Carpenter, S. Jiang || shane@level3.net, brian.e.carpenter@gmail.com, shengjiang@huawei.com +# RFC6437 || S. Amante, B. Carpenter, S. Jiang, J. Rajahalme || shane@level3.net, brian.e.carpenter@gmail.com, jiangsheng@huawei.com, jarno.rajahalme@nsn.com +# RFC6438 || B. Carpenter, S. Amante || brian.e.carpenter@gmail.com, shane@level3.net +# RFC6439 || R. Perlman, D. Eastlake, Y. Li, A. Banerjee, F. Hu || Radia@alum.mit.edu, d3e3e3@gmail.com, liyizhou@huawei.com, ayabaner@cisco.com, hu.fangwei@zte.com.cn +# RFC6440 || G. Zorn, Q. Wu, Y. Wang || gwz@net-zen.net, sunseawq@huawei.com, w52006@huawei.com +# RFC6441 || L. Vegoda || leo.vegoda@icann.org +# RFC6442 || J. Polk, B. Rosen, J. Peterson || jmpolk@cisco.com, br@brianrosen.net, jon.peterson@neustar.biz +# RFC6443 || B. Rosen, H. Schulzrinne, J. Polk, A. Newton || br@brianrosen.net, hgs@cs.columbia.edu, jmpolk@cisco.com, andy@hxr.us +# RFC6444 || H. Schulzrinne, L. Liess, H. Tschofenig, B. Stark, A. Kuett || hgs+ecrit@cs.columbia.edu, L.Liess@telekom.de, Hannes.Tschofenig@gmx.net, barbara.stark@att.com, andres.kytt@skype.net +# RFC6445 || T. Nadeau, Ed., A. Koushik, Ed., R. Cetin, Ed. || thomas.nadeau@ca.com, kkoushik@cisco.com, riza.cetin@alcatel.be +# RFC6446 || A. Niemi, K. Kiss, S. Loreto || aki.niemi@nokia.com, krisztian.kiss@nokia.com, salvatore.loreto@ericsson.com +# RFC6447 || R. Mahy, B. Rosen, H. Tschofenig || rohan@ekabal.com, br@brianrosen.net, Hannes.Tschofenig@gmx.net +# RFC6448 || R. Yount || rjy@cmu.edu +# RFC6449 || J. Falk, Ed. || ietf@cybernothing.org +# RFC6450 || S. Venaas || stig@cisco.com +# RFC6451 || A. Forte, H. Schulzrinne || forte@att.com, hgs@cs.columbia.edu +# RFC6452 || P. Faltstrom, Ed., P. Hoffman, Ed. || paf@cisco.com, paul.hoffman@vpnc.org +# RFC6453 || F. Dijkstra, R. Hughes-Jones || Freek.Dijkstra@sara.nl, Richard.Hughes-Jones@dante.net +# RFC6454 || A. Barth || ietf@adambarth.com +# RFC6455 || I. Fette, A. Melnikov || ifette+ietf@google.com, Alexey.Melnikov@isode.com +# RFC6456 || H. Li, R. Zheng, A. Farrel || hongyu.lihongyu@huawei.com, robin@huawei.com, adrian@olddog.co.uk +# RFC6457 || T. Takeda, Ed., A. Farrel || takeda.tomonori@lab.ntt.co.jp, adrian@olddog.co.uk +# RFC6458 || R. Stewart, M. Tuexen, K. Poon, P. Lei, V. Yasevich || randall@lakerest.net, tuexen@fh-muenster.de, ka-cheong.poon@oracle.com, peterlei@cisco.com, vladislav.yasevich@hp.com +# RFC6459 || J. Korhonen, Ed., J. Soininen, B. Patil, T. Savolainen, G. Bajko, K. Iisakkila || jouni.nospam@gmail.com, jonne.soininen@renesasmobile.com, basavaraj.patil@nokia.com, teemu.savolainen@nokia.com, gabor.bajko@nokia.com, kaisu.iisakkila@renesasmobile.com +# RFC6460 || M. Salter, R. Housley || misalte@nsa.gov, housley@vigilsec.com +# RFC6461 || S. Channabasappa, Ed. || sumanth@cablelabs.com +# RFC6462 || A. Cooper || acooper@cdt.org +# RFC6463 || J. Korhonen, Ed., S. Gundavelli, H. Yokota, X. Cui || jouni.nospam@gmail.com, sri.gundavelli@cisco.com, yokota@kddilabs.jp, Xiangsong.Cui@huawei.com +# RFC6464 || J. Lennox, Ed., E. Ivov, E. Marocco || jonathan@vidyo.com, emcho@jitsi.org, enrico.marocco@telecomitalia.it +# RFC6465 || E. Ivov, Ed., E. Marocco, Ed., J. Lennox || emcho@jitsi.org, enrico.marocco@telecomitalia.it, jonathan@vidyo.com +# RFC6466 || G. Salgueiro || gsalguei@cisco.com +# RFC6467 || T. Kivinen || kivinen@iki.fi +# RFC6468 || A. Melnikov, B. Leiba, K. Li || Alexey.Melnikov@isode.com, barryleiba@computer.org, likepeng@huawei.com +# RFC6469 || K. Kobayashi, K. Mishima, S. Casner, C. Bormann || ikob@riken.jp, three@sfc.wide.ad.jp, casner@acm.org, cabo@tzi.org +# RFC6470 || A. Bierman || andy@yumaworks.com +# RFC6471 || C. Lewis, M. Sergeant || clewisbcp@cauce.org, matt@sergeant.org +# RFC6472 || W. Kumari, K. Sriram || warren@kumari.net, ksriram@nist.gov +# RFC6473 || P. Saint-Andre || ietf@stpeter.im +# RFC6474 || K. Li, B. Leiba || likepeng@huawei.com, barryleiba@computer.org +# RFC6475 || G. Keeni, K. Koide, S. Gundavelli, R. Wakikawa || glenn@cysols.com, ka-koide@kddi.com, sgundave@cisco.com, ryuji@us.toyota-itc.com +# RFC6476 || P. Gutmann || pgut001@cs.auckland.ac.nz +# RFC6477 || A. Melnikov, G. Lunt || Alexey.Melnikov@isode.com, graeme.lunt@smhs.co.uk +# RFC6478 || L. Martini, G. Swallow, G. Heron, M. Bocci || lmartini@cisco.com, swallow@cisco.com, giheron@cisco.com, matthew.bocci@alcatel-lucent.com +# RFC6479 || X. Zhang, T. Tsou || xiangyang.zhang@huawei.com, tena@huawei.com +# RFC6480 || M. Lepinski, S. Kent || mlepinski@bbn.com, kent@bbn.com +# RFC6481 || G. Huston, R. Loomans, G. Michaelson || gih@apnic.net, robertl@apnic.net, ggm@apnic.net +# RFC6482 || M. Lepinski, S. Kent, D. Kong || mlepinski@bbn.com, skent@bbn.com, dkong@bbn.com +# RFC6483 || G. Huston, G. Michaelson || gih@apnic.net, ggm@apnic.net +# RFC6484 || S. Kent, D. Kong, K. Seo, R. Watro || skent@bbn.com, dkong@bbn.com, kseo@bbn.com, rwatro@bbn.com +# RFC6485 || G. Huston || gih@apnic.net +# RFC6486 || R. Austein, G. Huston, S. Kent, M. Lepinski || sra@isc.org, gih@apnic.net, kent@bbn.com, mlepinski@bbn.com +# RFC6487 || G. Huston, G. Michaelson, R. Loomans || gih@apnic.net, ggm@apnic.net, robertl@apnic.net +# RFC6488 || M. Lepinski, A. Chi, S. Kent || mlepinski@bbn.com, achi@bbn.com, kent@bbn.com +# RFC6489 || G. Huston, G. Michaelson, S. Kent || gih@apnic.net, ggm@apnic.net, kent@bbn.com +# RFC6490 || G. Huston, S. Weiler, G. Michaelson, S. Kent || gih@apnic.net, weiler@sparta.com, ggm@apnic.net, kent@bbn.com +# RFC6491 || T. Manderson, L. Vegoda, S. Kent || terry.manderson@icann.org, leo.vegoda@icann.org, kent@bbn.com +# RFC6492 || G. Huston, R. Loomans, B. Ellacott, R. Austein || gih@apnic.net, robertl@apnic.net, bje@apnic.net, sra@hactrn.net +# RFC6493 || R. Bush || randy@psg.com +# RFC6494 || R. Gagliano, S. Krishnan, A. Kukec || rogaglia@cisco.com, suresh.krishnan@ericsson.com, ana.kukec@enterprisearchitects.com +# RFC6495 || R. Gagliano, S. Krishnan, A. Kukec || rogaglia@cisco.com, suresh.krishnan@ericsson.com, ana.kukec@enterprisearchitects.com +# RFC6496 || S. Krishnan, J. Laganier, M. Bonola, A. Garcia-Martinez || suresh.krishnan@ericsson.com, julien.ietf@gmail.com, marco.bonola@gmail.com, alberto@it.uc3m.es +# RFC6497 || M. Davis, A. Phillips, Y. Umaoka, C. Falk || mark@macchiato.com, addison@lab126.com, yoshito_umaoka@us.ibm.com, court@infiauto.com +# RFC6498 || J. Stone, R. Kumar, F. Andreasen || joestone@cisco.com, rkumar@cisco.com, fandreas@cisco.com +# RFC6501 || O. Novo, G. Camarillo, D. Morgan, J. Urpalainen || Oscar.Novo@ericsson.com, Gonzalo.Camarillo@ericsson.com, Dave.Morgan@fmr.com, jari.urpalainen@nokia.com +# RFC6502 || G. Camarillo, S. Srinivasan, R. Even, J. Urpalainen || Gonzalo.Camarillo@ericsson.com, srivatsa.srinivasan@gmail.com, ron.even.tlv@gmail.com, jari.urpalainen@nokia.com +# RFC6503 || M. Barnes, C. Boulton, S. Romano, H. Schulzrinne || mary.ietf.barnes@gmail.com, chris@ns-technologies.com, spromano@unina.it, hgs+xcon@cs.columbia.edu +# RFC6504 || M. Barnes, L. Miniero, R. Presta, S P. Romano || mary.ietf.barnes@gmail.com, lorenzo@meetecho.com, roberta.presta@unina.it, spromano@unina.it +# RFC6505 || S. McGlashan, T. Melanchuk, C. Boulton || smcg.stds01@mcglashan.org, timm@rainwillow.com, chris@ns-technologies.com +# RFC6506 || M. Bhatia, V. Manral, A. Lindem || manav.bhatia@alcatel-lucent.com, vishwas.manral@hp.com, acee.lindem@ericsson.com +# RFC6507 || M. Groves || Michael.Groves@cesg.gsi.gov.uk +# RFC6508 || M. Groves || Michael.Groves@cesg.gsi.gov.uk +# RFC6509 || M. Groves || Michael.Groves@cesg.gsi.gov.uk +# RFC6510 || L. Berger, G. Swallow || lberger@labn.net, swallow@cisco.com +# RFC6511 || Z. Ali, G. Swallow, R. Aggarwal || zali@cisco.com, swallow@cisco.com, raggarwa_1@yahoo.com +# RFC6512 || IJ. Wijnands, E. Rosen, M. Napierala, N. Leymann || ice@cisco.com, erosen@cisco.com, mnapierala@att.com, n.leymann@telekom.de +# RFC6513 || E. Rosen, Ed., R. Aggarwal, Ed. || erosen@cisco.com, raggarwa_1@yahoo.com +# RFC6514 || R. Aggarwal, E. Rosen, T. Morin, Y. Rekhter || raggarwa_1@yahoo.com, erosen@cisco.com, thomas.morin@orange-ftgroup.com, yakov@juniper.net +# RFC6515 || R. Aggarwal, E. Rosen || raggarwa_1@yahoo.com, erosen@cisco.com +# RFC6516 || Y. Cai, E. Rosen, Ed., I. Wijnands || ycai@cisco.com, erosen@cisco.com, ice@cisco.com +# RFC6517 || T. Morin, Ed., B. Niven-Jenkins, Ed., Y. Kamite, R. Zhang, N. Leymann, N. Bitar || thomas.morin@orange.com, ben@niven-jenkins.co.uk, y.kamite@ntt.com, raymond.zhang@alcatel-lucent.com, n.leymann@telekom.de, nabil.n.bitar@verizon.com +# RFC6518 || G. Lebovitz, M. Bhatia || gregory.ietf@gmail.com, manav.bhatia@alcatel-lucent.com +# RFC6519 || R. Maglione, A. Durand || roberta.maglione@telecomitalia.it, adurand@juniper.net +# RFC6520 || R. Seggelmann, M. Tuexen, M. Williams || seggelmann@fh-muenster.de, tuexen@fh-muenster.de, michael.glenn.williams@gmail.com +# RFC6521 || A. Makela, J. Korhonen || antti.t.makela@iki.fi, jouni.nospam@gmail.com +# RFC6522 || M. Kucherawy, Ed. || msk@cloudmark.com +# RFC6525 || R. Stewart, M. Tuexen, P. Lei || randall@lakerest.net, tuexen@fh-muenster.de, peterlei@cisco.com +# RFC6526 || B. Claise, P. Aitken, A. Johnson, G. Muenz || bclaise@cisco.com, paitken@cisco.com, andrjohn@cisco.com, muenz@net.in.tum.de +# RFC6527 || K. Tata || tata_kalyan@yahoo.com +# RFC6528 || F. Gont, S. Bellovin || fgont@si6networks.com, bellovin@acm.org +# RFC6529 || A. McKenzie, S. Crocker || amckenzie3@yahoo.com, steve@stevecrocker.com +# RFC6530 || J. Klensin, Y. Ko || john-ietf@jck.com, yangwooko@gmail.com +# RFC6531 || J. Yao, W. Mao || yaojk@cnnic.cn, maowei_ietf@cnnic.cn +# RFC6532 || A. Yang, S. Steele, N. Freed || abelyang@twnic.net.tw, Shawn.Steele@microsoft.com, ned+ietf@mrochek.com +# RFC6533 || T. Hansen, Ed., C. Newman, A. Melnikov || tony+eaidsn@maillennium.att.com, chris.newman@oracle.com, Alexey.Melnikov@isode.com +# RFC6534 || N. Duffield, A. Morton, J. Sommers || duffield@research.att.com, acmorton@att.com, jsommers@colgate.edu +# RFC6535 || B. Huang, H. Deng, T. Savolainen || bill.huang@chinamobile.com, denghui@chinamobile.com, teemu.savolainen@nokia.com +# RFC6536 || A. Bierman, M. Bjorklund || andy@yumaworks.com, mbj@tail-f.com +# RFC6537 || J. Ahrenholz || jeffrey.m.ahrenholz@boeing.com +# RFC6538 || T. Henderson, A. Gurtov || thomas.r.henderson@boeing.com, gurtov@ee.oulu.fi +# RFC6539 || V. Cakulev, G. Sundaram, I. Broustis || violeta.cakulev@alcatel-lucent.com, ganesh.sundaram@alcatel-lucent.com, ioannis.broustis@alcatel-lucent.com +# RFC6540 || W. George, C. Donley, C. Liljenstolpe, L. Howard || wesley.george@twcable.com, C.Donley@cablelabs.com, cdl@asgaard.org, lee.howard@twcable.com +# RFC6541 || M. Kucherawy || msk@cloudmark.com +# RFC6542 || S. Emery || shawn.emery@oracle.com +# RFC6543 || S. Gundavelli || sgundave@cisco.com +# RFC6544 || J. Rosenberg, A. Keranen, B. B. Lowekamp, A. B. Roach || jdrosen@jdrosen.net, ari.keranen@ericsson.com, bbl@lowekamp.net, adam@nostrum.com +# RFC6545 || K. Moriarty || Kathleen.Moriarty@emc.com +# RFC6546 || B. Trammell || trammell@tik.ee.ethz.ch +# RFC6547 || W. George || wesley.george@twcable.com +# RFC6548 || N. Brownlee, Ed., IAB || n.brownlee@auckland.ac.nz, iab@iab.org +# RFC6549 || A. Lindem, A. Roy, S. Mirtorabi || acee.lindem@ericsson.com, akr@cisco.com, sina@cisco.com +# RFC6550 || T. Winter, Ed., P. Thubert, Ed., A. Brandt, J. Hui, R. Kelsey, P. Levis, K. Pister, R. Struik, JP. Vasseur, R. Alexander || wintert@acm.org, pthubert@cisco.com, abr@sdesigns.dk, jhui@archrock.com, kelsey@ember.com, pal@cs.stanford.edu, kpister@dustnetworks.com, rstruik.ext@gmail.com, jpv@cisco.com, roger.alexander@cooperindustries.com +# RFC6551 || JP. Vasseur, Ed., M. Kim, Ed., K. Pister, N. Dejean, D. Barthel || jpv@cisco.com, mjkim@kt.com, kpister@dustnetworks.com, nicolas.dejean@coronis.com, dominique.barthel@orange-ftgroup.com +# RFC6552 || P. Thubert, Ed. || pthubert@cisco.com +# RFC6553 || J. Hui, JP. Vasseur || jonhui@cisco.com, jpv@cisco.com +# RFC6554 || J. Hui, JP. Vasseur, D. Culler, V. Manral || jonhui@cisco.com, jpv@cisco.com, culler@cs.berkeley.edu, vishwas.manral@hp.com +# RFC6555 || D. Wing, A. Yourtchenko || dwing-ietf@fuggles.com, ayourtch@cisco.com +# RFC6556 || F. Baker || fred@cisco.com +# RFC6557 || E. Lear, P. Eggert || lear@cisco.com, eggert@cs.ucla.edu +# RFC6558 || A. Melnikov, B. Leiba, K. Li || Alexey.Melnikov@isode.com, barryleiba@computer.org, likepeng@huawei.com +# RFC6559 || D. Farinacci, IJ. Wijnands, S. Venaas, M. Napierala || dino@cisco.com, ice@cisco.com, stig@cisco.com, mnapierala@att.com +# RFC6560 || G. Richards || gareth.richards@rsa.com +# RFC6561 || J. Livingood, N. Mody, M. O'Reirdan || jason_livingood@cable.comcast.com, nirmal_mody@cable.comcast.com, michael_oreirdan@cable.comcast.com +# RFC6562 || C. Perkins, JM. Valin || csp@csperkins.org, jmvalin@jmvalin.ca +# RFC6563 || S. Jiang, D. Conrad, B. Carpenter || jiangsheng@huawei.com, drc@cloudflare.com, brian.e.carpenter@gmail.com +# RFC6564 || S. Krishnan, J. Woodyatt, E. Kline, J. Hoagland, M. Bhatia || suresh.krishnan@ericsson.com, jhw@apple.com, ek@google.com, Jim_Hoagland@symantec.com, manav.bhatia@alcatel-lucent.com +# RFC6565 || P. Pillay-Esnault, P. Moyer, J. Doyle, E. Ertekin, M. Lundberg || ppe@cisco.com, pete@pollere.net, jdoyle@doyleassociates.net, ertekin_emre@bah.com, lundberg_michael@bah.com +# RFC6566 || Y. Lee, Ed., G. Bernstein, Ed., D. Li, G. Martinelli || leeyoung@huawei.com, gregb@grotto-networking.com, danli@huawei.com, giomarti@cisco.com +# RFC6567 || A. Johnston, L. Liess || alan.b.johnston@gmail.com, laura.liess.dt@gmail.com +# RFC6568 || E. Kim, D. Kaspar, JP. Vasseur || eunah.ietf@gmail.com, dokaspar.ietf@gmail.com, jpv@cisco.com +# RFC6569 || JM. Valin, S. Borilin, K. Vos, C. Montgomery, R. Chen || jmvalin@jmvalin.ca, borilin@spiritdsp.net, koen.vos@skype.net, xiphmont@xiph.org, rchen@broadcom.com +# RFC6570 || J. Gregorio, R. Fielding, M. Hadley, M. Nottingham, D. Orchard || joe@bitworking.org, fielding@gbiv.com, mhadley@mitre.org, mnot@mnot.net, orchard@pacificspirit.com +# RFC6571 || C. Filsfils, Ed., P. Francois, Ed., M. Shand, B. Decraene, J. Uttaro, N. Leymann, M. Horneffer || cf@cisco.com, pierre.francois@imdea.org, imc.shand@googlemail.com, bruno.decraene@orange.com, uttaro@att.com, N.Leymann@telekom.de, Martin.Horneffer@telekom.de +# RFC6572 || F. Xia, B. Sarikaya, J. Korhonen, Ed., S. Gundavelli, D. Damic || xiayangsong@huawei.com, sarikaya@ieee.org, jouni.nospam@gmail.com, sgundave@cisco.com, damjan.damic@siemens.com +# RFC6573 || M. Amundsen || mca@amundsen.com +# RFC6574 || H. Tschofenig, J. Arkko || Hannes.Tschofenig@gmx.net, jari.arkko@piuha.net +# RFC6575 || H. Shah, Ed., E. Rosen, Ed., G. Heron, Ed., V. Kompella, Ed. || hshah@ciena.com, erosen@cisco.com, giheron@cisco.com, vach.kompella@alcatel-lucent.com +# RFC6576 || R. Geib, Ed., A. Morton, R. Fardid, A. Steinmitz || Ruediger.Geib@telekom.de, acmorton@att.com, rfardid@cariden.com, Alexander.Steinmitz@telekom.de +# RFC6577 || M. Kucherawy || msk@cloudmark.com +# RFC6578 || C. Daboo, A. Quillaud || cyrus@daboo.name, arnaud.quillaud@oracle.com +# RFC6579 || M. Yevstifeyev || evnikita2@gmail.com +# RFC6580 || M. Ko, D. Black || mkosjc@gmail.com, david.black@emc.com +# RFC6581 || A. Kanevsky, Ed., C. Bestler, Ed., R. Sharp, S. Wise || arkady.kanevsky@gmail.com, Caitlin.Bestler@nexenta.com, robert.o.sharp@intel.com, swise@opengridcomputing.com +# RFC6582 || T. Henderson, S. Floyd, A. Gurtov, Y. Nishida || thomas.r.henderson@boeing.com, floyd@acm.org, gurtov@ee.oulu.fi, nishida@wide.ad.jp +# RFC6583 || I. Gashinsky, J. Jaeggli, W. Kumari || igor@yahoo-inc.com, jjaeggli@zynga.com, warren@kumari.net +# RFC6584 || V. Roca || vincent.roca@inria.fr +# RFC6585 || M. Nottingham, R. Fielding || mnot@mnot.net, fielding@gbiv.com +# RFC6586 || J. Arkko, A. Keranen || jari.arkko@piuha.net, ari.keranen@ericsson.com +# RFC6587 || R. Gerhards, C. Lonvick || rgerhards@adiscon.com, clonvick@cisco.com +# RFC6588 || C. Ishikawa || chiaki.ishikawa@ubin.jp +# RFC6589 || J. Livingood || jason_livingood@cable.comcast.com +# RFC6590 || J. Falk, Ed., M. Kucherawy, Ed. || ietf@cybernothing.org, msk@cloudmark.com +# RFC6591 || H. Fontana || hilda@hfontana.com +# RFC6592 || C. Pignataro || cpignata@cisco.com +# RFC6593 || C. Pignataro, J. Clarke, G. Salgueiro || cpignata@cisco.com, jclarke@cisco.com, gsalguei@cisco.com +# RFC6594 || O. Sury || ondrej.sury@nic.cz +# RFC6595 || K. Wierenga, E. Lear, S. Josefsson || klaas@cisco.com, lear@cisco.com, simon@josefsson.org +# RFC6596 || M. Ohye, J. Kupke || maileohye@gmail.com, joachim@kupke.za.net +# RFC6597 || J. Downs, Ed., J. Arbeiter, Ed. || jeff_downs@partech.com, jimsgti@gmail.com +# RFC6598 || J. Weil, V. Kuarsingh, C. Donley, C. Liljenstolpe, M. Azinger || jason.weil@twcable.com, victor.kuarsingh@gmail.com, c.donley@cablelabs.com, cdl@asgaard.org, marla.azinger@frontiercorp.com +# RFC6601 || G. Ash, Ed., D. McDysan || gash5107@yahoo.com, dave.mcdysan@verizon.com +# RFC6602 || F. Abinader, Ed., S. Gundavelli, Ed., K. Leung, S. Krishnan, D. Premec || fabinader@gmail.com, sgundave@cisco.com, kleung@cisco.com, suresh.krishnan@ericsson.com, domagoj.premec@gmail.com +# RFC6603 || J. Korhonen, Ed., T. Savolainen, S. Krishnan, O. Troan || jouni.nospam@gmail.com, teemu.savolainen@nokia.com, suresh.krishnan@ericsson.com, ot@cisco.com +# RFC6604 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC6605 || P. Hoffman, W.C.A. Wijngaards || paul.hoffman@vpnc.org, wouter@nlnetlabs.nl +# RFC6606 || E. Kim, D. Kaspar, C. Gomez, C. Bormann || eunah.ietf@gmail.com, dokaspar.ietf@gmail.com, carlesgo@entel.upc.edu, cabo@tzi.org +# RFC6607 || K. Kinnear, R. Johnson, M. Stapp || kkinnear@cisco.com, raj@cisco.com, mjs@cisco.com +# RFC6608 || J. Dong, M. Chen, A. Suryanarayana || jie.dong@huawei.com, mach.chen@huawei.com, asuryana@cisco.com +# RFC6609 || C. Daboo, A. Stone || cyrus@daboo.name, aaron@serendipity.cx +# RFC6610 || H. Jang, A. Yegin, K. Chowdhury, J. Choi, T. Lemon || heejin.jang@gmail.com, alper.yegin@yegin.org, kc@radiomobiles.com, jinchoe@gmail.com, Ted.Lemon@nominum.com +# RFC6611 || K. Chowdhury, Ed., A. Yegin || kc@radiomobiles.com, alper.yegin@yegin.org +# RFC6612 || G. Giaretta, Ed. || gerardog@qualcomm.com +# RFC6613 || A. DeKok || aland@freeradius.org +# RFC6614 || S. Winter, M. McCauley, S. Venaas, K. Wierenga || stefan.winter@restena.lu, mikem@open.com.au, stig@cisco.com, klaas@cisco.com +# RFC6615 || T. Dietz, Ed., A. Kobayashi, B. Claise, G. Muenz || Thomas.Dietz@neclab.eu, akoba@nttv6.net, bclaise@cisco.com, muenz@net.in.tum.de +# RFC6616 || E. Lear, H. Tschofenig, H. Mauldin, S. Josefsson || lear@cisco.com, Hannes.Tschofenig@gmx.net, hmauldin@cisco.com, simon@josefsson.org +# RFC6617 || D. Harkins || dharkins@arubanetworks.com +# RFC6618 || J. Korhonen, Ed., B. Patil, H. Tschofenig, D. Kroeselberg || jouni.nospam@gmail.com, basavaraj.patil@nokia.com, Hannes.Tschofenig@gmx.net, dirk.kroeselberg@siemens.com +# RFC6619 || J. Arkko, L. Eggert, M. Townsley || jari.arkko@piuha.net, lars@netapp.com, townsley@cisco.com +# RFC6620 || E. Nordmark, M. Bagnulo, E. Levy-Abegnoli || nordmark@acm.org, marcelo@it.uc3m.es, elevyabe@cisco.com +# RFC6621 || J. Macker, Ed. || macker@itd.nrl.navy.mil +# RFC6622 || U. Herberg, T. Clausen || ulrich@herberg.name, T.Clausen@computer.org +# RFC6623 || E. Burger || eburger@standardstrack.com +# RFC6624 || K. Kompella, B. Kothari, R. Cherukuri || kireeti@juniper.net, bhupesh@cisco.com, cherukuri@juniper.net +# RFC6625 || E. Rosen, Ed., Y. Rekhter, Ed., W. Hendrickx, R. Qiu || erosen@cisco.com, yakov@juniper.net, wim.henderickx@alcatel-lucent.be, rayq@huawei.com +# RFC6626 || G. Tsirtsis, V. Park, V. Narayanan, K. Leung || tsirtsis@googlemail.com, vpark@qualcomm.com, vidyan@qualcomm.com, kleung@cisco.com +# RFC6627 || G. Karagiannis, K. Chan, T. Moncaster, M. Menth, P. Eardley, B. Briscoe || g.karagiannis@utwente.nl, khchan.work@gmail.com, Toby.Moncaster@cl.cam.ac.uk, menth@informatik.uni-tuebingen.de, philip.eardley@bt.com, bob.briscoe@bt.com +# RFC6628 || S. Shin, K. Kobara || seonghan.shin@aist.go.jp, kobara_conf@m.aist.go.jp +# RFC6629 || J. Abley, M. Bagnulo, A. Garcia-Martinez || joe.abley@icann.org, marcelo@it.uc3m.es, alberto@it.uc3m.es +# RFC6630 || Z. Cao, H. Deng, Q. Wu, G. Zorn, Ed. || zehn.cao@gmail.com, denghui02@gmail.com, sunseawq@huawei.com, glenzorn@gmail.com +# RFC6631 || D. Kuegler, Y. Sheffer || dennis.kuegler@bsi.bund.de, yaronf.ietf@gmail.com +# RFC6632 || M. Ersue, Ed., B. Claise || mehmet.ersue@nsn.com, bclaise@cisco.com +# RFC6633 || F. Gont || fgont@si6networks.com +# RFC6635 || O. Kolkman, Ed., J. Halpern, Ed., IAB || olaf@nlnetlabs.nl, joel.halpern@ericsson.com, iab@iab.org +# RFC6636 || H. Asaeda, H. Liu, Q. Wu || asaeda@wide.ad.jp, helen.liu@huawei.com, bill.wu@huawei.com +# RFC6637 || A. Jivsov || Andrey_Jivsov@symantec.com +# RFC6638 || C. Daboo, B. Desruisseaux || cyrus@daboo.name, bernard.desruisseaux@oracle.com +# RFC6639 || D. King, Ed., M. Venkatesan, Ed. || daniel@olddog.co.uk, venkat.mahalingams@gmail.com +# RFC6640 || W. George || wesley.george@twcable.com +# RFC6641 || C. Everhart, W. Adamson, J. Zhang || everhart@netapp.com, andros@netapp.com, jiayingz@google.com +# RFC6642 || Q. Wu, Ed., F. Xia, R. Even || sunseawq@huawei.com, xiayangsong@huawei.com, even.roni@huawei.com +# RFC6643 || J. Schoenwaelder || j.schoenwaelder@jacobs-university.de +# RFC6644 || D. Evans, R. Droms, S. Jiang || N7DR@ipfonix.com, rdroms@cisco.com, jiangsheng@huawei.com +# RFC6645 || J. Novak || janovak@cisco.com +# RFC6646 || H. Song, N. Zong, Y. Yang, R. Alimi || haibin.song@huawei.com, zongning@huawei.com, yry@cs.yale.edu, ralimi@google.com +# RFC6647 || M. Kucherawy, D. Crocker || superuser@gmail.com, dcrocker@bbiw.net +# RFC6648 || P. Saint-Andre, D. Crocker, M. Nottingham || ietf@stpeter.im, dcrocker@bbiw.net, mnot@mnot.net +# RFC6649 || L. Hornquist Astrand, T. Yu || lha@apple.com, tlyu@mit.edu +# RFC6650 || J. Falk, M. Kucherawy, Ed. || none, superuser@gmail.com +# RFC6651 || M. Kucherawy || superuser@gmail.com +# RFC6652 || S. Kitterman || scott@kitterman.com +# RFC6653 || B. Sarikaya, F. Xia, T. Lemon || sarikaya@ieee.org, xiayangsong@huawei.com, mellon@nominum.com +# RFC6654 || T. Tsou, C. Zhou, T. Taylor, Q. Chen || Tina.Tsou.Zouting@huawei.com, cathy.zhou@huawei.com, tom.taylor.stds@gmail.com, chenqi.0819@gmail.com +# RFC6655 || D. McGrew, D. Bailey || mcgrew@cisco.com, dbailey@rsa.com +# RFC6656 || R. Johnson, K. Kinnear, M. Stapp || raj@cisco.com, kkinnear@cisco.com, mjs@cisco.com +# RFC6657 || A. Melnikov, J. Reschke || Alexey.Melnikov@isode.com, julian.reschke@greenbytes.de +# RFC6658 || S. Bryant, Ed., L. Martini, G. Swallow, A. Malis || stbryant@cisco.com, lmartini@cisco.com, swallow@cisco.com, andrew.g.malis@verizon.com +# RFC6659 || A. Begen || abegen@cisco.com +# RFC6660 || B. Briscoe, T. Moncaster, M. Menth || bob.briscoe@bt.com, toby.moncaster@cl.cam.ac.uk, menth@uni-tuebingen.de +# RFC6661 || A. Charny, F. Huang, G. Karagiannis, M. Menth, T. Taylor, Ed. || anna@mwsm.com, huangfuqing@huawei.com, g.karagiannis@utwente.nl, menth@uni-tuebingen.de, tom.taylor.stds@gmail.com +# RFC6662 || A. Charny, J. Zhang, G. Karagiannis, M. Menth, T. Taylor, Ed. || anna@mwsm.com, joyzhang@cisco.com, g.karagiannis@utwente.nl, menth@uni-tuebingen.de, tom.taylor.stds@gmail.com +# RFC6663 || G. Karagiannis, T. Taylor, K. Chan, M. Menth, P. Eardley || g.karagiannis@utwente.nl, tom.taylor.stds@gmail.com, khchan.work@gmail.com, menth@uni-tuebingen.de, philip.eardley@bt.com +# RFC6664 || J. Schaad || ietf@augustcellars.com +# RFC6665 || A.B. Roach || adam@nostrum.com +# RFC6666 || N. Hilliard, D. Freedman || nick@inex.ie, david.freedman@uk.clara.net +# RFC6667 || K. Raza, S. Boutros, C. Pignataro || skraza@cisco.com, sboutros@cisco.com, cpignata@cisco.com +# RFC6668 || D. Bider, M. Baushke || ietf-ssh2@denisbider.com, mdb@juniper.net +# RFC6669 || N. Sprecher, L. Fang || nurit.sprecher@nsn.com, lufang@cisco.com +# RFC6670 || N. Sprecher, KY. Hong || nurit.sprecher@nsn.com, hongk@cisco.com +# RFC6671 || M. Betts || malcolm.betts@zte.com.cn +# RFC6672 || S. Rose, W. Wijngaards || scott.rose@nist.gov, wouter@nlnetlabs.nl +# RFC6673 || A. Morton || acmorton@att.com +# RFC6674 || F. Brockners, S. Gundavelli, S. Speicher, D. Ward || fbrockne@cisco.com, sgundave@cisco.com, sebastian.speicher@telekom.de, wardd@cisco.com +# RFC6675 || E. Blanton, M. Allman, L. Wang, I. Jarvinen, M. Kojo, Y. Nishida || elb@psg.com, mallman@icir.org, liliw@juniper.net, ilpo.jarvinen@helsinki.fi, kojo@cs.helsinki.fi, nishida@wide.ad.jp +# RFC6676 || S. Venaas, R. Parekh, G. Van de Velde, T. Chown, M. Eubanks || stig@cisco.com, riparekh@cisco.com, gvandeve@cisco.com, tjc@ecs.soton.ac.uk, marshall.eubanks@iformata.com +# RFC6677 || S. Hartman, Ed., T. Clancy, K. Hoeper || hartmans-ietf@mit.edu, tcc@vt.edu, khoeper@motorolasolutions.com +# RFC6678 || K. Hoeper, S. Hanna, H. Zhou, J. Salowey, Ed. || khoeper@motorolasolutions.com, shanna@juniper.net, hzhou@cisco.com, jsalowey@cisco.com +# RFC6679 || M. Westerlund, I. Johansson, C. Perkins, P. O'Hanlon, K. Carlberg || magnus.westerlund@ericsson.com, ingemar.s.johansson@ericsson.com, csp@csperkins.org, piers.ohanlon@oii.ox.ac.uk, carlberg@g11.org.uk +# RFC6680 || N. Williams, L. Johansson, S. Hartman, S. Josefsson || nico@cryptonector.com, leifj@sunet.se, hartmans-ietf@mit.edu, simon@josefsson.org +# RFC6681 || M. Watson, T. Stockhammer, M. Luby || watsonm@netflix.com, stockhammer@nomor.de, luby@qti.qualcomm.com +# RFC6682 || M. Watson, T. Stockhammer, M. Luby || watsonm@netflix.com, stockhammer@nomor.de, luby@qti.qualcomm.com +# RFC6683 || A. Begen, T. Stockhammer || abegen@cisco.com, stockhammer@nomor.de +# RFC6684 || B. Trammell || trammell@tik.ee.ethz.ch +# RFC6685 || B. Trammell || trammell@tik.ee.ethz.ch +# RFC6686 || M. Kucherawy || superuser@gmail.com +# RFC6687 || J. Tripathi, Ed., J. de Oliveira, Ed., JP. Vasseur, Ed. || jt369@drexel.edu, jau@coe.drexel.edu, jpv@cisco.com +# RFC6688 || D. Black, Ed., J. Glasgow, S. Faibish || david.black@emc.com, jglasgow@google.com, sfaibish@emc.com +# RFC6689 || L. Berger || lberger@labn.net +# RFC6690 || Z. Shelby || zach@sensinode.com +# RFC6691 || D. Borman || david.borman@quantum.com +# RFC6692 || R. Clayton, M. Kucherawy || richard.clayton@cl.cam.ac.uk, superuser@gmail.com +# RFC6693 || A. Lindgren, A. Doria, E. Davies, S. Grasic || andersl@sics.se, avri@acm.org, elwynd@folly.org.uk, samo.grasic@ltu.se +# RFC6694 || S. Moonesamy, Ed. || sm+ietf@elandsys.com +# RFC6695 || R. Asati || rajiva@cisco.com +# RFC6696 || Z. Cao, B. He, Y. Shi, Q. Wu, Ed., G. Zorn, Ed. || caozhen@chinamobile.com, hebaohong@catr.cn, shiyang1@huawei.com, bill.wu@huawei.com, glenzorn@gmail.com +# RFC6697 || G. Zorn, Ed., Q. Wu, T. Taylor, Y. Nir, K. Hoeper, S. Decugis || glenzorn@gmail.com, bill.wu@huawei.com, tom.taylor.stds@gmail.com, ynir@checkpoint.com, khoeper@motorolasolutions.com, sdecugis@freediameter.net +# RFC6698 || P. Hoffman, J. Schlyter || paul.hoffman@vpnc.org, jakob@kirei.se +# RFC6701 || A. Farrel, P. Resnick || adrian@olddog.co.uk, presnick@qti.qualcomm.com +# RFC6702 || T. Polk, P. Saint-Andre || tim.polk@nist.gov, ietf@stpeter.im +# RFC6703 || A. Morton, G. Ramachandran, G. Maguluri || acmorton@att.com, gomathi@att.com, gmaguluri@att.com +# RFC6704 || D. Miles, W. Dec, J. Bristow, R. Maglione || davidmiles@google.com, wdec@cisco.com, James.Bristow@swisscom.com, roberta.maglione@telecomitalia.it +# RFC6705 || S. Krishnan, R. Koodli, P. Loureiro, Q. Wu, A. Dutta || suresh.krishnan@ericsson.com, rkoodli@cisco.com, loureiro@neclab.eu, Sunseawq@huawei.com, adutta@niksun.com +# RFC6706 || F. Templin, Ed. || fltemplin@acm.org +# RFC6707 || B. Niven-Jenkins, F. Le Faucheur, N. Bitar || ben@velocix.com, flefauch@cisco.com, nabil.n.bitar@verizon.com +# RFC6708 || S. Kiesel, Ed., S. Previdi, M. Stiemerling, R. Woundy, Y. Yang || ietf-alto@skiesel.de, sprevidi@cisco.com, martin.stiemerling@neclab.eu, Richard_Woundy@cable.comcast.com, yry@cs.yale.edu +# RFC6709 || B. Carpenter, B. Aboba, Ed., S. Cheshire || brian.e.carpenter@gmail.com, bernard_aboba@hotmail.com, cheshire@apple.com +# RFC6710 || A. Melnikov, K. Carlberg || Alexey.Melnikov@isode.com, carlberg@g11.org.uk +# RFC6711 || L. Johansson || leifj@nordu.net +# RFC6712 || T. Kause, M. Peylo || toka@ssh.com, martin.peylo@nsn.com +# RFC6713 || J. Levine || standards@taugh.com +# RFC6714 || C. Holmberg, S. Blau, E. Burger || christer.holmberg@ericsson.com, staffan.blau@ericsson.com, eburger@standardstrack.com +# RFC6715 || D. Cauchie, B. Leiba, K. Li || dany.cauchie@orange.com, barryleiba@computer.org, likepeng@huawei.com +# RFC6716 || JM. Valin, K. Vos, T. Terriberry || jmvalin@jmvalin.ca, koenvos74@gmail.com, tterriberry@mozilla.com +# RFC6717 || H. Hotz, R. Allbery || hotz@jpl.nasa.gov, rra@stanford.edu +# RFC6718 || P. Muley, M. Aissaoui, M. Bocci || praveen.muley@alcatel-lucent.com, mustapha.aissaoui@alcatel-lucent.com, matthew.bocci@alcatel-lucent.com +# RFC6719 || O. Gnawali, P. Levis || gnawali@cs.uh.edu, pal@cs.stanford.edu +# RFC6720 || C. Pignataro, R. Asati || cpignata@cisco.com, rajiva@cisco.com +# RFC6721 || J. Snell || jasnell@us.ibm.com +# RFC6722 || P. Hoffman, Ed. || paul.hoffman@vpnc.org +# RFC6723 || L. Jin, Ed., R. Key, Ed., S. Delord, T. Nadeau, S. Boutros || lizhong.jin@zte.com.cn, raymond.key@ieee.org, simon.delord@gmail.com, tnadeau@juniper.net, sboutros@cisco.com +# RFC6724 || D. Thaler, Ed., R. Draves, A. Matsumoto, T. Chown || dthaler@microsoft.com, richdr@microsoft.com, arifumi@nttv6.net, tjc@ecs.soton.ac.uk +# RFC6725 || S. Rose || scottr.nist@gmail.com +# RFC6726 || T. Paila, R. Walsh, M. Luby, V. Roca, R. Lehtonen || toni.paila@gmail.com, roderick.walsh@tut.fi, luby@qti.qualcomm.com, vincent.roca@inria.fr, rami.lehtonen@teliasonera.com +# RFC6727 || T. Dietz, Ed., B. Claise, J. Quittek || dietz@neclab.eu, bclaise@cisco.com, quittek@neclab.eu +# RFC6728 || G. Muenz, B. Claise, P. Aitken || muenz@net.in.tum.de, bclaise@cisco.com, paitken@cisco.com +# RFC6729 || D. Crocker, M. Kucherawy || dcrocker@bbiw.net, superuser@gmail.com +# RFC6730 || S. Krishnan, J. Halpern || suresh.krishnan@ericsson.com, joel.halpern@ericsson.com +# RFC6731 || T. Savolainen, J. Kato, T. Lemon || teemu.savolainen@nokia.com, kato@syce.net, Ted.Lemon@nominum.com +# RFC6732 || V. Kuarsingh, Ed., Y. Lee, O. Vautrin || victor.kuarsingh@gmail.com, yiu_lee@cable.comcast.com, olivier@juniper.net +# RFC6733 || V. Fajardo, Ed., J. Arkko, J. Loughney, G. Zorn, Ed. || vf0213@gmail.com, jari.arkko@ericsson.com, john.loughney@nokia.com, glenzorn@gmail.com +# RFC6734 || G. Zorn, Q. Wu, V. Cakulev || glenzorn@gmail.com, sunseawq@huawei.com, violeta.cakulev@alcatel-lucent.com +# RFC6735 || K. Carlberg, Ed., T. Taylor || carlberg@g11.org.uk, tom.taylor.stds@gmail.com +# RFC6736 || F. Brockners, S. Bhandari, V. Singh, V. Fajardo || fbrockne@cisco.com, shwethab@cisco.com, vaneeta.singh@gmail.com, vf0213@gmail.com +# RFC6737 || K. Jiao, G. Zorn || kangjiao@huawei.com, gwz@net-zen.net +# RFC6738 || V. Cakulev, A. Lior, S. Mizikovsky || violeta.cakulev@alcatel-lucent.com, avi.ietf@lior.org, Simon.Mizikovsky@alcatel-lucent.com +# RFC6739 || H. Schulzrinne, H. Tschofenig || hgs+ecrit@cs.columbia.edu, Hannes.Tschofenig@gmx.net +# RFC6740 || RJ Atkinson, SN Bhatti || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk +# RFC6741 || RJ Atkinson, SN Bhatti || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk +# RFC6742 || RJ Atkinson, SN Bhatti, S. Rose || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk, scottr.nist@gmail.com +# RFC6743 || RJ Atkinson, SN Bhatti || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk +# RFC6744 || RJ Atkinson, SN Bhatti || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk +# RFC6745 || RJ Atkinson, SN Bhatti || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk +# RFC6746 || RJ Atkinson, SN Bhatti || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk +# RFC6747 || RJ Atkinson, SN Bhatti || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk +# RFC6748 || RJ Atkinson, SN Bhatti || rja.lists@gmail.com, saleem@cs.st-andrews.ac.uk +# RFC6749 || D. Hardt, Ed. || dick.hardt@gmail.com +# RFC6750 || M. Jones, D. Hardt || mbj@microsoft.com, dick.hardt@gmail.com +# RFC6751 || R. Despres, Ed., B. Carpenter, D. Wing, S. Jiang || despres.remi@laposte.net, brian.e.carpenter@gmail.com, dwing-ietf@fuggles.com, shengjiang@huawei.com +# RFC6752 || A. Kirkham || tkirkham@paloaltonetworks.com +# RFC6753 || J. Winterbottom, H. Tschofenig, H. Schulzrinne, M. Thomson || james.winterbottom@commscope.com, Hannes.Tschofenig@gmx.net, hgs@cs.columbia.edu, martin.thomson@skype.net +# RFC6754 || Y. Cai, L. Wei, H. Ou, V. Arya, S. Jethwani || yiqunc@microsoft.com, lwei@cisco.com, hou@cisco.com, varya@directv.com, sjethwani@directv.com +# RFC6755 || B. Campbell, H. Tschofenig || brian.d.campbell@gmail.com, hannes.tschofenig@gmx.net +# RFC6756 || S. Trowbridge, Ed., E. Lear, Ed., G. Fishman, Ed., S. Bradner, Ed. || steve.trowbridge@alcatel-lucent.com, lear@cisco.com, gryfishman@aol.com, sob@harvard.edu +# RFC6757 || S. Gundavelli, Ed., J. Korhonen, Ed., M. Grayson, K. Leung, R. Pazhyannur || sgundave@cisco.com, jouni.nospam@gmail.com, mgrayson@cisco.com, kleung@cisco.com, rpazhyan@cisco.com +# RFC6758 || A. Melnikov, K. Carlberg || Alexey.Melnikov@isode.com, carlberg@g11.org.uk +# RFC6759 || B. Claise, P. Aitken, N. Ben-Dvora || bclaise@cisco.com, paitken@cisco.com, nirbd@cisco.com +# RFC6760 || S. Cheshire, M. Krochmal || cheshire@apple.com, marc@apple.com +# RFC6761 || S. Cheshire, M. Krochmal || cheshire@apple.com, marc@apple.com +# RFC6762 || S. Cheshire, M. Krochmal || cheshire@apple.com, marc@apple.com +# RFC6763 || S. Cheshire, M. Krochmal || cheshire@apple.com, marc@apple.com +# RFC6764 || C. Daboo || cyrus@daboo.name +# RFC6765 || E. Beili, M. Morgenstern || edward.beili@actelis.com, moti.morgenstern@ecitele.com +# RFC6766 || E. Beili || edward.beili@actelis.com +# RFC6767 || E. Beili, M. Morgenstern || edward.beili@actelis.com, moti.morgenstern@ecitele.com +# RFC6768 || E. Beili || edward.beili@actelis.com +# RFC6769 || R. Raszuk, J. Heitz, A. Lo, L. Zhang, X. Xu || robert@raszuk.net, jakob.heitz@ericsson.com, altonlo@aristanetworks.com, lixia@cs.ucla.edu, xuxh@huawei.com +# RFC6770 || G. Bertrand, Ed., E. Stephan, T. Burbridge, P. Eardley, K. Ma, G. Watson || gilles.bertrand@orange.com, emile.stephan@orange.com, trevor.burbridge@bt.com, philip.eardley@bt.com, kevin.ma@azukisystems.com, gwatson@velocix.com +# RFC6771 || L. Eggert, G. Camarillo || lars@netapp.com, Gonzalo.Camarillo@ericsson.com +# RFC6772 || H. Schulzrinne, Ed., H. Tschofenig, Ed., J. Cuellar, J. Polk, J. Morris, M. Thomson || schulzrinne@cs.columbia.edu, Hannes.Tschofenig@gmx.net, Jorge.Cuellar@siemens.com, jmpolk@cisco.com, ietf@jmorris.org, martin.thomson@gmail.com +# RFC6773 || T. Phelan, G. Fairhurst, C. Perkins || tphelan@sonusnet.com, gorry@erg.abdn.ac.uk, csp@csperkins.org +# RFC6774 || R. Raszuk, Ed., R. Fernando, K. Patel, D. McPherson, K. Kumaki || robert@raszuk.net, rex@cisco.com, keyupate@cisco.com, dmcpherson@verisign.com, ke-kumaki@kddi.com +# RFC6775 || Z. Shelby, Ed., S. Chakrabarti, E. Nordmark, C. Bormann || zach@sensinode.com, samita.chakrabarti@ericsson.com, nordmark@cisco.com, cabo@tzi.org +# RFC6776 || A. Clark, Q. Wu || alan.d.clark@telchemy.com, sunseawq@huawei.com +# RFC6777 || W. Sun, Ed., G. Zhang, Ed., J. Gao, G. Xie, R. Papneja || sun.weiqiang@gmail.com, zhangguoying@catr.cn, gjhhit@huawei.com, xieg@cs.ucr.edu, rajiv.papneja@huawei.com +# RFC6778 || R. Sparks || RjS@nostrum.com +# RFC6779 || U. Herberg, R. Cole, I. Chakeres || ulrich@herberg.name, robert.g.cole@us.army.mil, ian.chakeres@gmail.com +# RFC6780 || L. Berger, F. Le Faucheur, A. Narayanan || lberger@labn.net, flefauch@cisco.com, ashokn@cisco.com +# RFC6781 || O. Kolkman, W. Mekking, R. Gieben || olaf@nlnetlabs.nl, matthijs@nlnetlabs.nl, miek.gieben@sidn.nl +# RFC6782 || V. Kuarsingh, Ed., L. Howard || victor.kuarsingh@gmail.com, lee.howard@twcable.com +# RFC6783 || J. Levine, R. Gellens || standards@taugh.com, rg+ietf@qti.qualcomm.com +# RFC6784 || S. Sakane, M. Ishiyama || ssakane@cisco.com, masahiro.ishiyama@toshiba.co.jp +# RFC6785 || B. Leiba || barryleiba@computer.org +# RFC6786 || A. Yegin, R. Cragie || alper.yegin@yegin.org, robert.cragie@gridmerge.com +# RFC6787 || D. Burnett, S. Shanmugham || dburnett@voxeo.com, sarvi@cisco.com +# RFC6788 || S. Krishnan, A. Kavanagh, B. Varga, S. Ooghe, E. Nordmark || suresh.krishnan@ericsson.com, alan.kavanagh@ericsson.com, balazs.a.varga@ericsson.com, sven.ooghe@alcatel-lucent.com, nordmark@cisco.com +# RFC6789 || B. Briscoe, Ed., R. Woundy, Ed., A. Cooper, Ed. || bob.briscoe@bt.com, richard_woundy@cable.comcast.com, acooper@cdt.org +# RFC6790 || K. Kompella, J. Drake, S. Amante, W. Henderickx, L. Yong || kireeti.kompella@gmail.com, jdrake@juniper.net, shane@level3.net, wim.henderickx@alcatel-lucent.com, lucy.yong@huawei.com +# RFC6791 || X. Li, C. Bao, D. Wing, R. Vaithianathan, G. Huston || xing@cernet.edu.cn, congxiao@cernet.edu.cn, dwing-ietf@fuggles.com, rvaithia@cisco.com, gih@apnic.net +# RFC6792 || Q. Wu, Ed., G. Hunt, P. Arden || sunseawq@huawei.com, r.geoff.hunt@gmail.com, philip.arden@bt.com +# RFC6793 || Q. Vohra, E. Chen || quaizar.vohra@gmail.com, enkechen@cisco.com +# RFC6794 || V. Hilt, G. Camarillo, J. Rosenberg || volker.hilt@bell-labs.com, Gonzalo.Camarillo@ericsson.com, jdrosen@jdrosen.net +# RFC6795 || V. Hilt, G. Camarillo || volker.hilt@bell-labs.com, Gonzalo.Camarillo@ericsson.com +# RFC6796 || V. Hilt, G. Camarillo, J. Rosenberg, D. Worley || volker.hilt@bell-labs.com, Gonzalo.Camarillo@ericsson.com, jdrosen@jdrosen.net, worley@ariadne.com +# RFC6797 || J. Hodges, C. Jackson, A. Barth || Jeff.Hodges@PayPal.com, collin.jackson@sv.cmu.edu, ietf@adambarth.com +# RFC6798 || A. Clark, Q. Wu || alan.d.clark@telchemy.com, sunseawq@huawei.com +# RFC6801 || U. Kozat, A. Begen || kozat@docomolabs-usa.com, abegen@cisco.com +# RFC6802 || S. Baillargeon, C. Flinta, A. Johnsson || steve.baillargeon@ericsson.com, christofer.flinta@ericsson.com, andreas.a.johnsson@ericsson.com +# RFC6803 || G. Hudson || ghudson@mit.edu +# RFC6804 || B. Manning || bmanning@sfc.keio.ac.jp +# RFC6805 || D. King, Ed., A. Farrel, Ed. || daniel@olddog.co.uk, adrian@olddog.co.uk +# RFC6806 || S. Hartman, Ed., K. Raeburn, L. Zhu || hartmans-ietf@mit.edu, raeburn@mit.edu, lzhu@microsoft.com +# RFC6807 || D. Farinacci, G. Shepherd, S. Venaas, Y. Cai || dino@cisco.com, gjshep@gmail.com, stig@cisco.com, yiqunc@microsoft.com +# RFC6808 || L. Ciavattone, R. Geib, A. Morton, M. Wieser || lencia@att.com, Ruediger.Geib@telekom.de, acmorton@att.com, matthias_michael.wieser@stud.tu-darmstadt.de +# RFC6809 || C. Holmberg, I. Sedlacek, H. Kaplan || christer.holmberg@ericsson.com, ivo.sedlacek@ericsson.com, hkaplan@acmepacket.com +# RFC6810 || R. Bush, R. Austein || randy@psg.com, sra@hactrn.net +# RFC6811 || P. Mohapatra, J. Scudder, D. Ward, R. Bush, R. Austein || pmohapat@cisco.com, jgs@juniper.net, dward@cisco.com, randy@psg.com, sra@hactrn.net +# RFC6812 || M. Chiba, A. Clemm, S. Medley, J. Salowey, S. Thombare, E. Yedavalli || mchiba@cisco.com, alex@cisco.com, stmedley@cisco.com, jsalowey@cisco.com, thombare@cisco.com, eshwar@cisco.com +# RFC6813 || J. Salowey, S. Hanna || jsalowey@cisco.com, shanna@juniper.net +# RFC6814 || C. Pignataro, F. Gont || cpignata@cisco.com, fgont@si6networks.com +# RFC6815 || S. Bradner, K. Dubray, J. McQuaid, A. Morton || sob@harvard.edu, kdubray@juniper.net, jim@turnipvideo.com, acmorton@att.com +# RFC6816 || V. Roca, M. Cunche, J. Lacan || vincent.roca@inria.fr, mathieu.cunche@inria.fr, jerome.lacan@isae.fr +# RFC6817 || S. Shalunov, G. Hazel, J. Iyengar, M. Kuehlewind || shalunov@shlang.com, greg@bittorrent.com, jiyengar@fandm.edu, mirja.kuehlewind@ikr.uni-stuttgart.de +# RFC6818 || P. Yee || peter@akayla.com +# RFC6819 || T. Lodderstedt, Ed., M. McGloin, P. Hunt || torsten@lodderstedt.net, mark.mcgloin@ie.ibm.com, phil.hunt@yahoo.com +# RFC6820 || T. Narten, M. Karir, I. Foo || narten@us.ibm.com, mkarir@merit.edu, Ian.Foo@huawei.com +# RFC6821 || E. Marocco, A. Fusco, I. Rimac, V. Gurbani || enrico.marocco@telecomitalia.it, antonio2.fusco@telecomitalia.it, rimac@bell-labs.com, vkg@bell-labs.com +# RFC6822 || S. Previdi, Ed., L. Ginsberg, M. Shand, A. Roy, D. Ward || sprevidi@cisco.com, ginsberg@cisco.com, imc.shand@gmail.com, akr@cisco.com, wardd@cisco.com +# RFC6823 || L. Ginsberg, S. Previdi, M. Shand || ginsberg@cisco.com, sprevidi@cisco.com, imc.shand@gmail.com +# RFC6824 || A. Ford, C. Raiciu, M. Handley, O. Bonaventure || alanford@cisco.com, costin.raiciu@cs.pub.ro, m.handley@cs.ucl.ac.uk, olivier.bonaventure@uclouvain.be +# RFC6825 || M. Miyazawa, T. Otani, K. Kumaki, T. Nadeau || ma-miyazawa@kddilabs.jp, Tm-otani@kddi.com, ke-kumaki@kddi.com, tnadeau@juniper.net +# RFC6826 || IJ. Wijnands, Ed., T. Eckert, N. Leymann, M. Napierala || ice@cisco.com, eckert@cisco.com, n.leymann@telekom.de, mnapierala@att.com +# RFC6827 || A. Malis, Ed., A. Lindem, Ed., D. Papadimitriou, Ed. || andrew.g.malis@verizon.com, acee.lindem@ericsson.com, dimitri.papadimitriou@alcatel-lucent.com +# RFC6828 || J. Xia || xiajinwei@huawei.com +# RFC6829 || M. Chen, P. Pan, C. Pignataro, R. Asati || mach@huawei.com, ppan@infinera.com, cpignata@cisco.com, rajiva@cisco.com +# RFC6830 || D. Farinacci, V. Fuller, D. Meyer, D. Lewis || farinacci@gmail.com, vaf@vaf.net, dmm@1-4-5.net, darlewis@cisco.com +# RFC6831 || D. Farinacci, D. Meyer, J. Zwiebel, S. Venaas || farinacci@gmail.com, dmm@cisco.com, jzwiebel@cruzio.com, stig@cisco.com +# RFC6832 || D. Lewis, D. Meyer, D. Farinacci, V. Fuller || darlewis@cisco.com, dmm@1-4-5.net, farinacci@gmail.com, vaf@vaf.net +# RFC6833 || V. Fuller, D. Farinacci || vaf@vaf.net, farinacci@gmail.com +# RFC6834 || L. Iannone, D. Saucez, O. Bonaventure || luigi.iannone@telecom-paristech.fr, damien.saucez@inria.fr, olivier.bonaventure@uclouvain.be +# RFC6835 || D. Farinacci, D. Meyer || farinacci@gmail.com, dmm@cisco.com +# RFC6836 || V. Fuller, D. Farinacci, D. Meyer, D. Lewis || vaf@vaf.net, farinacci@gmail.com, dmm@1-4-5.net, darlewis@cisco.com +# RFC6837 || E. Lear || lear@cisco.com +# RFC6838 || N. Freed, J. Klensin, T. Hansen || ned+ietf@mrochek.com, john+ietf@jck.com, tony+mtsuffix@maillennium.att.com +# RFC6839 || T. Hansen, A. Melnikov || tony+sss@maillennium.att.com, Alexey.Melnikov@isode.com +# RFC6840 || S. Weiler, Ed., D. Blacka, Ed. || weiler@tislabs.com, davidb@verisign.com +# RFC6841 || F. Ljunggren, AM. Eklund Lowinder, T. Okubo || fredrik@kirei.se, amel@iis.se, tomofumi.okubo@icann.org +# RFC6842 || N. Swamy, G. Halwasia, P. Jhingran || nn.swamy@samsung.com, ghalwasi@cisco.com, pjhingra@cisco.com +# RFC6843 || A. Clark, K. Gross, Q. Wu || alan.d.clark@telchemy.com, kevin.gross@avanw.com, sunseawq@huawei.com +# RFC6844 || P. Hallam-Baker, R. Stradling || philliph@comodo.com, rob.stradling@comodo.com +# RFC6845 || N. Sheth, L. Wang, J. Zhang || nsheth@contrailsystems.com, liliw@juniper.net, zzhang@juniper.net +# RFC6846 || G. Pelletier, K. Sandlund, L-E. Jonsson, M. West || ghyslain.pelletier@interdigital.com, kristofer.sandlund@ericsson.com, lars-erik@lejonsson.com, mark.a.west@roke.co.uk +# RFC6847 || D. Melman, T. Mizrahi, D. Eastlake 3rd || davidme@marvell.com, talmi@marvell.com, d3e3e3@gmail.com +# RFC6848 || J. Winterbottom, M. Thomson, R. Barnes, B. Rosen, R. George || james.winterbottom@commscope.com, martin.thomson@gmail.com, rbarnes@bbn.com, br@brianrosen.net, robinsgv@gmail.com +# RFC6849 || H. Kaplan, Ed., K. Hedayat, N. Venna, P. Jones, N. Stratton || hkaplan@acmepacket.com, kh274@cornell.edu, vnagarjuna@saperix.com, paulej@packetizer.com, nathan@robotics.net +# RFC6850 || A. Rijhsinghani, K. Zebrose || anil@charter.net, zebrose@alum.mit.edu +# RFC6851 || A. Gulbrandsen, N. Freed, Ed. || arnt@gulbrandsen.priv.no, ned+ietf@mrochek.com +# RFC6852 || R. Housley, S. Mills, J. Jaffe, B. Aboba, L. St.Amour || housley@vigilsec.com, s.mills@ieee.org, jeff@w3.org, bernard_aboba@hotmail.com, st.amour@isoc.org +# RFC6853 || J. Brzozowski, J. Tremblay, J. Chen, T. Mrugalski || john_brzozowski@cable.comcast.com, jf@jftremblay.com, jack.chen@twcable.com, tomasz.mrugalski@gmail.com +# RFC6854 || B. Leiba || barryleiba@computer.org +# RFC6855 || P. Resnick, Ed., C. Newman, Ed., S. Shen, Ed. || presnick@qti.qualcomm.com, chris.newman@oracle.com, shenshuo@cnnic.cn +# RFC6856 || R. Gellens, C. Newman, J. Yao, K. Fujiwara || rg+ietf@qualcomm.com, chris.newman@oracle.com, yaojk@cnnic.cn, fujiwara@jprs.co.jp +# RFC6857 || K. Fujiwara || fujiwara@jprs.co.jp +# RFC6858 || A. Gulbrandsen || arnt@gulbrandsen.priv.no +# RFC6859 || B. Leiba || barryleiba@computer.org +# RFC6860 || Y. Yang, A. Retana, A. Roy || yiya@cisco.com, aretana@cisco.com, akr@cisco.com +# RFC6861 || I. Dzmanashvili || ioseb.dzmanashvili@gmail.com +# RFC6862 || G. Lebovitz, M. Bhatia, B. Weis || gregory.ietf@gmail.com, manav.bhatia@alcatel-lucent.com, bew@cisco.com +# RFC6863 || S. Hartman, D. Zhang || hartmans-ietf@mit.edu, zhangdacheng@huawei.com +# RFC6864 || J. Touch || touch@isi.edu +# RFC6865 || V. Roca, M. Cunche, J. Lacan, A. Bouabdallah, K. Matsuzono || vincent.roca@inria.fr, mathieu.cunche@inria.fr, jerome.lacan@isae.fr, abouabdallah@cdta.dz, kazuhisa@sfc.wide.ad.jp +# RFC6866 || B. Carpenter, S. Jiang || brian.e.carpenter@gmail.com, jiangsheng@huawei.com +# RFC6867 || Y. Nir, Q. Wu || ynir@checkpoint.com, sunseawq@huawei.com +# RFC6868 || C. Daboo || cyrus@daboo.name +# RFC6869 || G. Salgueiro, J. Clarke, P. Saint-Andre || gsalguei@cisco.com, jclarke@cisco.com, ietf@stpeter.im +# RFC6870 || P. Muley, Ed., M. Aissaoui, Ed. || praveen.muley@alcatel-lucent.com, mustapha.aissaoui@alcatel-lucent.com +# RFC6871 || R. Gilman, R. Even, F. Andreasen || bob_gilman@comcast.net, roni.even@mail01.huawei.com, fandreas@cisco.com +# RFC6872 || V. Gurbani, Ed., E. Burger, Ed., T. Anjali, H. Abdelnur, O. Festor || vkg@bell-labs.com, eburger@standardstrack.com, tricha@ece.iit.edu, humbol@gmail.com, Olivier.Festor@loria.fr +# RFC6873 || G. Salgueiro, V. Gurbani, A. B. Roach || gsalguei@cisco.com, vkg@bell-labs.com, adam@nostrum.com +# RFC6874 || B. Carpenter, S. Cheshire, R. Hinden || brian.e.carpenter@gmail.com, cheshire@apple.com, bob.hinden@gmail.com +# RFC6875 || S. Kamei, T. Momose, T. Inoue, T. Nishitani || skame@nttv6.jp, tmomose@cisco.com, inoue@jp.ntt.net, tomohiro.nishitani@ntt.com +# RFC6876 || P. Sangster, N. Cam-Winget, J. Salowey || paul_sangster@symantec.com, ncamwing@cisco.com, jsalowey@cisco.com +# RFC6877 || M. Mawatari, M. Kawashima, C. Byrne || mawatari@jpix.ad.jp, kawashimam@vx.jp.nec.com, cameron.byrne@t-mobile.com +# RFC6878 || A.B. Roach || adam@nostrum.com +# RFC6879 || S. Jiang, B. Liu, B. Carpenter || jiangsheng@huawei.com, leo.liubing@huawei.com, brian.e.carpenter@gmail.com +# RFC6880 || L. Johansson || leifj@sunet.se +# RFC6881 || B. Rosen, J. Polk || br@brianrosen.net, jmpolk@cisco.com +# RFC6882 || K. Kumaki, Ed., T. Murai, D. Cheng, S. Matsushima, P. Jiang || ke-kumaki@kddi.com, murai@fnsc.co.jp, dean.cheng@huawei.com, satoru.matsushima@g.softbank.co.jp, pe-jiang@kddi.com +# RFC6883 || B. Carpenter, S. Jiang || brian.e.carpenter@gmail.com, jiangsheng@huawei.com +# RFC6884 || Z. Fang || zfang@qualcomm.com +# RFC6885 || M. Blanchet, A. Sullivan || Marc.Blanchet@viagenie.ca, asullivan@dyn.com +# RFC6886 || S. Cheshire, M. Krochmal || cheshire@apple.com, marc@apple.com +# RFC6887 || D. Wing, Ed., S. Cheshire, M. Boucadair, R. Penno, P. Selkirk || dwing-ietf@fuggles.com, cheshire@apple.com, mohamed.boucadair@orange.com, repenno@cisco.com, pselkirk@isc.org +# RFC6888 || S. Perreault, Ed., I. Yamagata, S. Miyakawa, A. Nakagawa, H. Ashida || simon.perreault@viagenie.ca, ikuhei@nttv6.jp, miyakawa@nttv6.jp, a-nakagawa@jpix.ad.jp, hiashida@cisco.com +# RFC6889 || R. Penno, T. Saxena, M. Boucadair, S. Sivakumar || rpenno@juniper.net, tasaxena@cisco.com, mohamed.boucadair@orange.com, ssenthil@cisco.com +# RFC6890 || M. Cotton, L. Vegoda, R. Bonica, Ed., B. Haberman || michelle.cotton@icann.org, leo.vegoda@icann.org, rbonica@juniper.net, brian@innovationslab.net +# RFC6891 || J. Damas, M. Graff, P. Vixie || joao@bondis.org, explorer@flame.org, vixie@isc.org +# RFC6892 || E. Wilde || erik.wilde@emc.com +# RFC6893 || P. Higgs, P. Szucs || paul.higgs@ericsson.com, paul.szucs@eu.sony.com +# RFC6894 || R. Papneja, S. Vapiwala, J. Karthik, S. Poretsky, S. Rao, JL. Le Roux || rajiv.papneja@huawei.com, svapiwal@cisco.com, jkarthik@cisco.com, sporetsky@allot.com, shankar.rao@du.edu, jeanlouis.leroux@orange.com +# RFC6895 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC6896 || S. Barbato, S. Dorigotti, T. Fossati, Ed. || tat@koanlogic.com, stewy@koanlogic.com, tho@koanlogic.com +# RFC6897 || M. Scharf, A. Ford || michael.scharf@alcatel-lucent.com, alanford@cisco.com +# RFC6898 || D. Li, D. Ceccarelli, L. Berger || huawei.danli@huawei.com, daniele.ceccarelli@ericsson.com, lberger@labn.net +# RFC6901 || P. Bryan, Ed., K. Zyp, M. Nottingham, Ed. || pbryan@anode.ca, kris@sitepen.com, mnot@mnot.net +# RFC6902 || P. Bryan, Ed., M. Nottingham, Ed. || pbryan@anode.ca, mnot@mnot.net +# RFC6903 || J. Snell || jasnell@gmail.com +# RFC6904 || J. Lennox || jonathan@vidyo.com +# RFC6905 || T. Senevirathne, D. Bond, S. Aldrin, Y. Li, R. Watve || tsenevir@cisco.com, mokon@mokon.net, aldrin.ietf@gmail.com, liyizhou@huawei.com, rwatve@cisco.com +# RFC6906 || E. Wilde || erik.wilde@emc.com +# RFC6907 || T. Manderson, K. Sriram, R. White || terry.manderson@icann.org, ksriram@nist.gov, russ@riw.us +# RFC6908 || Y. Lee, R. Maglione, C. Williams, C. Jacquenet, M. Boucadair || yiu_lee@cable.comcast.com, robmgl@cisco.com, carlw@mcsr-labs.org, christian.jacquenet@orange.com, mohamed.boucadair@orange.com +# RFC6909 || S. Gundavelli, Ed., X. Zhou, J. Korhonen, G. Feige, R. Koodli || sgundave@cisco.com, zhou.xingyue@zte.com.cn, jouni.nospam@gmail.com, gfeige@cisco.com, rkoodli@cisco.com +# RFC6910 || D. Worley, M. Huelsemann, R. Jesske, D. Alexeitsev || worley@ariadne.com, martin.huelsemann@telekom.de, r.jesske@telekom.de, alexeitsev@teleflash.com +# RFC6911 || W. Dec, Ed., B. Sarikaya, G. Zorn, Ed., D. Miles, B. Lourdelet || wdec@cisco.com, sarikaya@ieee.org, glenzorn@gmail.com, davidmiles@google.com, blourdel@juniper.net +# RFC6912 || A. Sullivan, D. Thaler, J. Klensin, O. Kolkman || asullivan@dyn.com, dthaler@microsoft.com, john-ietf@jck.com, olaf@NLnetLabs.nl +# RFC6913 || D. Hanes, G. Salgueiro, K. Fleming || dhanes@cisco.com, gsalguei@cisco.com, kevin@kpfleming.us +# RFC6914 || J. Rosenberg || jdrosen@jdrosen.net +# RFC6915 || R. Bellis || ray.bellis@nominet.org.uk +# RFC6916 || R. Gagliano, S. Kent, S. Turner || rogaglia@cisco.com, kent@bbn.com, turners@ieca.com +# RFC6917 || C. Boulton, L. Miniero, G. Munson || chris@ns-technologies.com, lorenzo@meetecho.com, gamunson@gmail.com +# RFC6918 || F. Gont, C. Pignataro || fgont@si6networks.com, cpignata@cisco.com +# RFC6919 || R. Barnes, S. Kent, E. Rescorla || rlb@ipv.sx, kent@bbn.com, ekr@rtfm.com +# RFC6920 || S. Farrell, D. Kutscher, C. Dannewitz, B. Ohlman, A. Keranen, P. Hallam-Baker || stephen.farrell@cs.tcd.ie, kutscher@neclab.eu, cdannewitz@googlemail.com, Borje.Ohlman@ericsson.com, ari.keranen@ericsson.com, philliph@comodo.com +# RFC6921 || R. Hinden || bob.hinden@gmail.com +# RFC6922 || Y. Shafranovich || ietf@shaftek.org +# RFC6923 || R. Winter, E. Gray, H. van Helvoort, M. Betts || rolf.winter@neclab.eu, eric.gray@ericsson.com, huub.van.helvoort@huawei.com, malcolm.betts@zte.com.cn +# RFC6924 || B. Leiba || barryleiba@computer.org +# RFC6925 || B. Joshi, R. Desetti, M. Stapp || bharat_joshi@infosys.com, ramakrishnadtv@infosys.com, mjs@cisco.com +# RFC6926 || K. Kinnear, M. Stapp, R. Desetti, B. Joshi, N. Russell, P. Kurapati, B. Volz || kkinnear@cisco.com, mjs@cisco.com, ramakrishnadtv@infosys.com, bharat_joshi@infosys.com, neil.e.russell@gmail.com, kurapati@juniper.net, volz@cisco.com +# RFC6927 || J. Levine, P. Hoffman || standards@taugh.com, paul.hoffman@vpnc.org +# RFC6928 || J. Chu, N. Dukkipati, Y. Cheng, M. Mathis || hkchu@google.com, nanditad@google.com, ycheng@google.com, mattmathis@google.com +# RFC6929 || A. DeKok, A. Lior || aland@networkradius.com, avi.ietf@lior.org +# RFC6930 || D. Guo, S. Jiang, Ed., R. Despres, R. Maglione || guoseu@huawei.com, jiangsheng@huawei.com, despres.remi@laposte.net, robmgl@cisco.com +# RFC6931 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC6932 || D. Harkins, Ed. || dharkins@arubanetworks.com +# RFC6933 || A. Bierman, D. Romascanu, J. Quittek, M. Chandramouli || andy@yumaworks.com, dromasca@gmail.com , quittek@neclab.eu, moulchan@cisco.com +# RFC6934 || N. Bitar, Ed., S. Wadhwa, Ed., T. Haag, H. Li || nabil.n.bitar@verizon.com, sanjay.wadhwa@alcatel-lucent.com, HaagT@telekom.de, hongyu.lihongyu@huawei.com +# RFC6935 || M. Eubanks, P. Chimento, M. Westerlund || marshall.eubanks@gmail.com, Philip.Chimento@jhuapl.edu, magnus.westerlund@ericsson.com +# RFC6936 || G. Fairhurst, M. Westerlund || gorry@erg.abdn.ac.uk, magnus.westerlund@ericsson.com +# RFC6937 || M. Mathis, N. Dukkipati, Y. Cheng || mattmathis@google.com, nanditad@google.com, ycheng@google.com +# RFC6938 || J. Scudder || jgs@juniper.net +# RFC6939 || G. Halwasia, S. Bhandari, W. Dec || ghalwasi@cisco.com, shwethab@cisco.com, wdec@cisco.com +# RFC6940 || C. Jennings, B. Lowekamp, Ed., E. Rescorla, S. Baset, H. Schulzrinne || fluffy@cisco.com, bbl@lowekamp.net, ekr@rtfm.com, salman@cs.columbia.edu, hgs@cs.columbia.edu +# RFC6941 || L. Fang, Ed., B. Niven-Jenkins, Ed., S. Mansfield, Ed., R. Graveman, Ed. || lufang@cisco.com, ben@niven-jenkins.co.uk, scott.mansfield@ericsson.com, rfg@acm.org +# RFC6942 || J. Bournelle, L. Morand, S. Decugis, Q. Wu, G. Zorn || julien.bournelle@orange.com, lionel.morand@orange.com, sdecugis@freediameter.net, sunseawq@huawei.com, glenzorn@gmail.com +# RFC6943 || D. Thaler, Ed. || dthaler@microsoft.com +# RFC6944 || S. Rose || scottr.nist@gmail.com +# RFC6945 || R. Bush, B. Wijnen, K. Patel, M. Baer || randy@psg.com, bertietf@bwijnen.net, keyupate@cisco.com, baerm@tislabs.com +# RFC6946 || F. Gont || fgont@si6networks.com +# RFC6947 || M. Boucadair, H. Kaplan, R. Gilman, S. Veikkolainen || mohamed.boucadair@orange.com, hkaplan@acmepacket.com, bob_gilman@comcast.net, Simo.Veikkolainen@nokia.com +# RFC6948 || A. Keranen, J. Arkko || ari.keranen@ericsson.com, jari.arkko@piuha.net +# RFC6949 || H. Flanagan, N. Brownlee || rse@rfc-editor.org, rfc-ise@rfc-editor.org +# RFC6950 || J. Peterson, O. Kolkman, H. Tschofenig, B. Aboba || jon.peterson@neustar.biz, olaf@nlnetlabs.nl, Hannes.Tschofenig@gmx.net, Bernard_aboba@hotmail.com +# RFC6951 || M. Tuexen, R. Stewart || tuexen@fh-muenster.de, randall@lakerest.net +# RFC6952 || M. Jethanandani, K. Patel, L. Zheng || mjethanandani@gmail.com, keyupate@cisco.com, vero.zheng@huawei.com +# RFC6953 || A. Mancuso, Ed., S. Probasco, B. Patil || amancuso@google.com, scott@probasco.me, basavpat@cisco.com +# RFC6954 || J. Merkle, M. Lochter || johannes.merkle@secunet.com, manfred.lochter@bsi.bund.de +# RFC6955 || J. Schaad, H. Prafullchandra || ietf@augustcellars.com, HPrafullchandra@hytrust.com +# RFC6956 || W. Wang, E. Haleplidis, K. Ogawa, C. Li, J. Halpern || wmwang@zjsu.edu.cn, ehalep@ece.upatras.gr, ogawa.kentaro@lab.ntt.co.jp, chuanhuang_li@zjsu.edu.cn, joel.halpern@ericsson.com +# RFC6957 || F. Costa, J-M. Combes, Ed., X. Pougnard, H. Li || fabio.costa@orange.com, jeanmichel.combes@orange.com, xavier.pougnard@orange.com, lihy@huawei.com +# RFC6958 || A. Clark, S. Zhang, J. Zhao, Q. Wu, Ed. || alan.d.clark@telchemy.com, zhangyx@sttri.com.cn, zhaojing@sttri.com.cn, sunseawq@huawei.com +# RFC6959 || D. McPherson, F. Baker, J. Halpern || dmcpherson@verisign.com, fred@cisco.com, joel.halpern@ericsson.com +# RFC6960 || S. Santesson, M. Myers, R. Ankney, A. Malpani, S. Galperin, C. Adams || sts@aaa-sec.com, mmyers@fastq.com, none, ambarish@gmail.com, slava.galperin@gmail.com, cadams@eecs.uottawa.ca +# RFC6961 || Y. Pettersen || yngve@spec-work.net +# RFC6962 || B. Laurie, A. Langley, E. Kasper || benl@google.com, agl@google.com, ekasper@google.com +# RFC6963 || P. Saint-Andre || ietf@stpeter.im +# RFC6964 || F. Templin || fltemplin@acm.org +# RFC6965 || L. Fang, Ed., N. Bitar, R. Zhang, M. Daikoku, P. Pan || lufang@cisco.com, nabil.bitar@verizon.com, raymond.zhang@alcatel-lucent.com, ms-daikoku@kddi.com, ppan@infinera.com +# RFC6967 || M. Boucadair, J. Touch, P. Levis, R. Penno || mohamed.boucadair@orange.com, touch@isi.edu, pierre.levis@orange.com, repenno@cisco.com +# RFC6968 || V. Roca, B. Adamson || vincent.roca@inria.fr, adamson@itd.nrl.navy.mil +# RFC6969 || A. Retana, D. Cheng || aretana@cisco.com, dean.cheng@huawei.com +# RFC6970 || M. Boucadair, R. Penno, D. Wing || mohamed.boucadair@orange.com, repenno@cisco.com, dwing-ietf@fuggles.com +# RFC6971 || U. Herberg, Ed., A. Cardenas, T. Iwao, M. Dow, S. Cespedes || ulrich.herberg@us.fujitsu.com, alvaro.cardenas@me.com, smartnetpro-iwao_std@ml.css.fujitsu.com, m.dow@freescale.com, scespedes@icesi.edu.co +# RFC6972 || Y. Zhang, N. Zong || hishigh@gmail.com, zongning@huawei.com +# RFC6973 || A. Cooper, H. Tschofenig, B. Aboba, J. Peterson, J. Morris, M. Hansen, R. Smith || acooper@cdt.org, Hannes.Tschofenig@gmx.net, bernard_aboba@hotmail.com, jon.peterson@neustar.biz, ietf@jmorris.org, marit.hansen@datenschutzzentrum.de, rhys.smith@ja.net +# RFC6974 || Y. Weingarten, S. Bryant, D. Ceccarelli, D. Caviglia, F. Fondelli, M. Corsi, B. Wu, X. Dai || wyaacov@gmail.com, stbryant@cisco.com, daniele.ceccarelli@ericsson.com, diego.caviglia@ericsson.com, francesco.fondelli@ericsson.com, corsi.marco@gmail.com, wu.bo@zte.com.cn, dai.xuehui@zte.com.cn +# RFC6975 || S. Crocker, S. Rose || steve@shinkuro.com, scottr.nist@gmail.com +# RFC6976 || M. Shand, S. Bryant, S. Previdi, C. Filsfils, P. Francois, O. Bonaventure || imc.shand@googlemail.com, stbryant@cisco.com, sprevidi@cisco.com, cfilsfil@cisco.com, pierre.francois@imdea.org, Olivier.Bonaventure@uclouvain.be +# RFC6977 || M. Boucadair, X. Pougnard || mohamed.boucadair@orange.com, xavier.pougnard@orange.com +# RFC6978 || J. Touch || touch@isi.edu +# RFC6979 || T. Pornin || pornin@bolet.org +# RFC6980 || F. Gont || fgont@si6networks.com +# RFC6981 || S. Bryant, S. Previdi, M. Shand || stbryant@cisco.com, sprevidi@cisco.com, imc.shand@googlemail.com +# RFC6982 || Y. Sheffer, A. Farrel || yaronf.ietf@gmail.com, adrian@olddog.co.uk +# RFC6983 || R. van Brandenburg, O. van Deventer, F. Le Faucheur, K. Leung || ray.vanbrandenburg@tno.nl, oskar.vandeventer@tno.nl, flefauch@cisco.com, kleung@cisco.com +# RFC6984 || W. Wang, K. Ogawa, E. Haleplidis, M. Gao, J. Hadi Salim || wmwang@zjsu.edu.cn, ogawa.kentaro@lab.ntt.co.jp, ehalep@ece.upatras.gr, gaoming@mail.zjgsu.edu.cn, hadi@mojatatu.com +# RFC6985 || A. Morton || acmorton@att.com +# RFC6986 || V. Dolmatov, Ed., A. Degtyarev || dol@cryptocom.ru, alexey@renatasystems.org +# RFC6987 || A. Retana, L. Nguyen, A. Zinin, R. White, D. McPherson || aretana@cisco.com, lhnguyen@cisco.com, alex.zinin@gmail.com, Russ.White@vce.com, dmcpherson@verisign.com +# RFC6988 || J. Quittek, Ed., M. Chandramouli, R. Winter, T. Dietz, B. Claise || quittek@neclab.eu, moulchan@cisco.com, Rolf.Winter@neclab.eu, Thomas.Dietz@neclab.eu, bclaise@cisco.com +# RFC6989 || Y. Sheffer, S. Fluhrer || yaronf.ietf@gmail.com, sfluhrer@cisco.com +# RFC6990 || R. Huang, Q. Wu, H. Asaeda, G. Zorn || rachel.huang@huawei.com, bill.wu@huawei.com, asaeda@nict.go.jp, glenzorn@gmail.com +# RFC6991 || J. Schoenwaelder, Ed. || j.schoenwaelder@jacobs-university.de +# RFC6992 || D. Cheng, M. Boucadair, A. Retana || dean.cheng@huawei.com, mohamed.boucadair@orange.com, aretana@cisco.com +# RFC6993 || P. Saint-Andre || ietf@stpeter.im +# RFC6994 || J. Touch || touch@isi.edu +# RFC6996 || J. Mitchell || Jon.Mitchell@microsoft.com +# RFC6997 || M. Goyal, Ed., E. Baccelli, M. Philipp, A. Brandt, J. Martocci || mukul@uwm.edu, Emmanuel.Baccelli@inria.fr, matthias-philipp@gmx.de, abr@sdesigns.dk, jerald.p.martocci@jci.com +# RFC6998 || M. Goyal, Ed., E. Baccelli, A. Brandt, J. Martocci || mukul@uwm.edu, Emmanuel.Baccelli@inria.fr, abr@sdesigns.dk, jerald.p.martocci@jci.com +# RFC7001 || M. Kucherawy || superuser@gmail.com +# RFC7002 || A. Clark, G. Zorn, Q. Wu || alan.d.clark@telchemy.com, glenzorn@gmail.com, sunseawq@huawei.com +# RFC7003 || A. Clark, R. Huang, Q. Wu, Ed. || alan.d.clark@telchemy.com, Rachel@huawei.com, sunseawq@huawei.com +# RFC7004 || G. Zorn, R. Schott, Q. Wu, Ed., R. Huang || glenzorn@gmail.com, Roland.Schott@telekom.de, sunseawq@huawei.com, Rachel@huawei.com +# RFC7005 || A. Clark, V. Singh, Q. Wu || alan.d.clark@telchemy.com, varun@comnet.tkk.fi, sunseawq@huawei.com +# RFC7006 || M. Garcia-Martin, S. Veikkolainen, R. Gilman || miguel.a.garcia@ericsson.com, simo.veikkolainen@nokia.com, bob_gilman@comcast.net +# RFC7007 || T. Terriberry || tterribe@xiph.org +# RFC7008 || S. Kiyomoto, W. Shin || kiyomoto@kddilabs.jp, ohpato@hanmail.net +# RFC7009 || T. Lodderstedt, Ed., S. Dronia, M. Scurtescu || torsten@lodderstedt.net, sdronia@gmx.de, mscurtescu@google.com +# RFC7010 || B. Liu, S. Jiang, B. Carpenter, S. Venaas, W. George || leo.liubing@huawei.com, jiangsheng@huawei.com, brian.e.carpenter@gmail.com, stig@cisco.com, wesley.george@twcable.com +# RFC7011 || B. Claise, Ed., B. Trammell, Ed., P. Aitken || bclaise@cisco.com, trammell@tik.ee.ethz.ch, paitken@cisco.com +# RFC7012 || B. Claise, Ed., B. Trammell, Ed. || bclaise@cisco.com, trammell@tik.ee.ethz.ch +# RFC7013 || B. Trammell, B. Claise || trammell@tik.ee.ethz.ch, bclaise@cisco.com +# RFC7014 || S. D'Antonio, T. Zseby, C. Henke, L. Peluso || salvatore.dantonio@uniparthenope.it, tanja@caida.org, christian.henke@tektronix.com, lorenzo.peluso@unina.it +# RFC7015 || B. Trammell, A. Wagner, B. Claise || trammell@tik.ee.ethz.ch, arno@wagner.name, bclaise@cisco.com +# RFC7016 || M. Thornburgh || mthornbu@adobe.com +# RFC7017 || R. Sparks || rjsparks@nostrum.com +# RFC7018 || V. Manral, S. Hanna || vishwas.manral@hp.com, shanna@juniper.net +# RFC7019 || J. Buford, M. Kolberg, Ed. || buford@avaya.com, mkolberg@ieee.org +# RFC7020 || R. Housley, J. Curran, G. Huston, D. Conrad || housley@vigilsec.com, jcurran@arin.net, gih@apnic.net, drc@virtualized.org +# RFC7021 || C. Donley, Ed., L. Howard, V. Kuarsingh, J. Berg, J. Doshi || c.donley@cablelabs.com, william.howard@twcable.com, victor@jvknet.com, j.berg@cablelabs.com, jineshd@juniper.net +# RFC7022 || A. Begen, C. Perkins, D. Wing, E. Rescorla || abegen@cisco.com, csp@csperkins.org, dwing-ietf@fuggles.com, ekr@rtfm.com +# RFC7023 || D. Mohan, Ed., N. Bitar, Ed., A. Sajassi, Ed., S. DeLord, P. Niger, R. Qiu || dinmohan@hotmail.com, nabil.n.bitar@verizon.com, sajassi@cisco.com, simon.delord@gmail.com, philippe.niger@orange.com, rqiu@juniper.net +# RFC7024 || H. Jeng, J. Uttaro, L. Jalil, B. Decraene, Y. Rekhter, R. Aggarwal || hj2387@att.com, ju1738@att.com, luay.jalil@verizon.com, bruno.decraene@orange.com, yakov@juniper.net, raggarwa_1@yahoo.com +# RFC7025 || T. Otani, K. Ogaki, D. Caviglia, F. Zhang, C. Margaria || tm-otani@kddi.com, ke-oogaki@kddi.com, diego.caviglia@ericsson.com, zhangfatai@huawei.com, cyril.margaria@coriant.com +# RFC7026 || A. Farrel, S. Bryant || adrian@olddog.co.uk, stbryant@cisco.com +# RFC7027 || J. Merkle, M. Lochter || johannes.merkle@secunet.com, manfred.lochter@bsi.bund.de +# RFC7028 || JC. Zuniga, LM. Contreras, CJ. Bernardos, S. Jeon, Y. Kim || JuanCarlos.Zuniga@InterDigital.com, lmcm@tid.es, cjbc@it.uc3m.es, seiljeon@av.it.pt, yhkim@dcn.ssu.ac.kr +# RFC7029 || S. Hartman, M. Wasserman, D. Zhang || hartmans-ietf@mit.edu, mrw@painless-security.com, zhangdacheng@huawei.com +# RFC7030 || M. Pritikin, Ed., P. Yee, Ed., D. Harkins, Ed. || pritikin@cisco.com, peter@akayla.com, dharkins@arubanetworks.com +# RFC7031 || T. Mrugalski, K. Kinnear || tomasz.mrugalski@gmail.com, kkinnear@cisco.com +# RFC7032 || T. Beckhaus, Ed., B. Decraene, K. Tiruveedhula, M. Konstantynowicz, Ed., L. Martini || thomas.beckhaus@telekom.de, bruno.decraene@orange.com, kishoret@juniper.net, maciek@cisco.com, lmartini@cisco.com +# RFC7033 || P. Jones, G. Salgueiro, M. Jones, J. Smarr || paulej@packetizer.com, gsalguei@cisco.com, mbj@microsoft.com, jsmarr@google.com +# RFC7034 || D. Ross, T. Gondrom || dross@microsoft.com, tobias.gondrom@gondrom.org +# RFC7035 || M. Thomson, B. Rosen, D. Stanley, G. Bajko, A. Thomson || martin.thomson@skype.net, br@brianrosen.net, dstanley@arubanetworks.com, Gabor.Bajko@nokia.com, athomson@lgscout.com +# RFC7036 || R. Housley || housley@vigilsec.com +# RFC7037 || L. Yeh, M. Boucadair || leaf.yeh.sdo@gmail.com, mohamed.boucadair@orange.com +# RFC7038 || R. Ogier || ogier@earthlink.net +# RFC7039 || J. Wu, J. Bi, M. Bagnulo, F. Baker, C. Vogt, Ed. || jianping@cernet.edu.cn, junbi@tsinghua.edu.cn, marcelo@it.uc3m.es, fred@cisco.com, mail@christianvogt.net +# RFC7040 || Y. Cui, J. Wu, P. Wu, O. Vautrin, Y. Lee || yong@csnet1.cs.tsinghua.edu.cn, jianping@cernet.edu.cn, pengwu.thu@gmail.com, Olivier@juniper.net, yiu_lee@cable.comcast.com +# RFC7041 || F. Balus, Ed., A. Sajassi, Ed., N. Bitar, Ed. || florin.balus@alcatel-lucent.com, sajassi@cisco.com, nabil.n.bitar@verizon.com +# RFC7042 || D. Eastlake 3rd, J. Abley || d3e3e3@gmail.com, jabley@dyn.com +# RFC7043 || J. Abley || jabley@dyn.com +# RFC7044 || M. Barnes, F. Audet, S. Schubert, J. van Elburg, C. Holmberg || mary.ietf.barnes@gmail.com, francois.audet@skype.net, shida@ntt-at.com, ietf.hanserik@gmail.com, christer.holmberg@ericsson.com +# RFC7045 || B. Carpenter, S. Jiang || brian.e.carpenter@gmail.com, jiangsheng@huawei.com +# RFC7046 || M. Waehlisch, T. Schmidt, S. Venaas || mw@link-lab.net, Schmidt@informatik.haw-hamburg.de, stig@cisco.com +# RFC7047 || B. Pfaff, B. Davie, Ed. || blp@nicira.com, bsd@nicira.com +# RFC7048 || E. Nordmark, I. Gashinsky || nordmark@acm.org, igor@yahoo-inc.com +# RFC7049 || C. Bormann, P. Hoffman || cabo@tzi.org, paul.hoffman@vpnc.org +# RFC7050 || T. Savolainen, J. Korhonen, D. Wing || teemu.savolainen@nokia.com, jouni.nospam@gmail.com, dwing-ietf@fuggles.com +# RFC7051 || J. Korhonen, Ed., T. Savolainen, Ed. || jouni.nospam@gmail.com, teemu.savolainen@nokia.com +# RFC7052 || G. Schudel, A. Jain, V. Moreno || gschudel@cisco.com, atjain@juniper.net, vimoreno@cisco.com +# RFC7053 || M. Tuexen, I. Ruengeler, R. Stewart || tuexen@fh-muenster.de, i.ruengeler@fh-muenster.de, randall@lakerest.net +# RFC7054 || A. Farrel, H. Endo, R. Winter, Y. Koike, M. Paul || adrian@olddog.co.uk, hideki.endo.es@hitachi.com, rolf.winter@neclab.eu, koike.yoshinori@lab.ntt.co.jp, Manuel.Paul@telekom.de +# RFC7055 || S. Hartman, Ed., J. Howlett || hartmans-ietf@mit.edu, josh.howlett@ja.net +# RFC7056 || S. Hartman, J. Howlett || hartmans-ietf@mit.edu, josh.howlett@ja.net +# RFC7057 || S. Winter, J. Salowey || stefan.winter@restena.lu, jsalowey@cisco.com +# RFC7058 || A. Amirante, T. Castaldi, L. Miniero, S P. Romano || alessandro.amirante@unina.it, tcastaldi@meetecho.com, lorenzo@meetecho.com, spromano@unina.it +# RFC7059 || S. Steffann, I. van Beijnum, R. van Rein || sander@steffann.nl, iljitsch@muada.com, rick@openfortress.nl +# RFC7060 || M. Napierala, E. Rosen, IJ. Wijnands || mnapierala@att.com, erosen@cisco.com, ice@cisco.com +# RFC7061 || R. Sinnema, E. Wilde || remon.sinnema@emc.com, erik.wilde@emc.com +# RFC7062 || F. Zhang, Ed., D. Li, H. Li, S. Belotti, D. Ceccarelli || zhangfatai@huawei.com, huawei.danli@huawei.com, lihan@chinamobile.com, sergio.belotti@alcatel-lucent.it, daniele.ceccarelli@ericsson.com +# RFC7063 || L. Zheng, J. Zhang, R. Parekh || vero.zheng@huawei.com, zzhang@juniper.net, riparekh@cisco.com +# RFC7064 || S. Nandakumar, G. Salgueiro, P. Jones, M. Petit-Huguenin || snandaku@cisco.com, gsalguei@cisco.com, paulej@packetizer.com, petithug@acm.org +# RFC7065 || M. Petit-Huguenin, S. Nandakumar, G. Salgueiro, P. Jones || petithug@acm.org, snandaku@cisco.com, gsalguei@cisco.com, paulej@packetizer.com +# RFC7066 || J. Korhonen, Ed., J. Arkko, Ed., T. Savolainen, S. Krishnan || jouni.nospam@gmail.com, jari.arkko@piuha.net, teemu.savolainen@nokia.com, suresh.krishnan@ericsson.com +# RFC7067 || L. Dunbar, D. Eastlake 3rd, R. Perlman, I. Gashinsky || ldunbar@huawei.com, d3e3e3@gmail.com, Radia@alum.mit.edu, igor@yahoo-inc.com +# RFC7068 || E. McMurry, B. Campbell || emcmurry@computer.org, ben@nostrum.com +# RFC7069 || R. Alimi, A. Rahman, D. Kutscher, Y. Yang, H. Song, K. Pentikousis || ralimi@google.com, Akbar.Rahman@InterDigital.com, dirk.kutscher@neclab.eu, yry@cs.yale.edu, haibin.song@huawei.com, k.pentikousis@eict.de +# RFC7070 || N. Borenstein, M. Kucherawy || nsb@guppylake.com, superuser@gmail.com +# RFC7071 || N. Borenstein, M. Kucherawy || nsb@guppylake.com, superuser@gmail.com +# RFC7072 || N. Borenstein, M. Kucherawy || nsb@guppylake.com, superuser@gmail.com +# RFC7073 || N. Borenstein, M. Kucherawy || nsb@guppylake.com, superuser@gmail.com +# RFC7074 || L. Berger, J. Meuric || lberger@labn.net, julien.meuric@orange.com +# RFC7075 || T. Tsou, R. Hao, T. Taylor, Ed. || tina.tsou.zouting@huawei.com, ruibing_hao@cable.comcast.com, tom.taylor.stds@gmail.com +# RFC7076 || M. Joseph, J. Susoy || mark@p6r.com, jim@p6r.com +# RFC7077 || S. Krishnan, S. Gundavelli, M. Liebsch, H. Yokota, J. Korhonen || suresh.krishnan@ericsson.com, sgundave@cisco.com, marco.liebsch@neclab.eu, yokota@kddilabs.jp, jouni.nospam@gmail.com +# RFC7078 || A. Matsumoto, T. Fujisaki, T. Chown || arifumi@nttv6.net, fujisaki@nttv6.net, tjc@ecs.soton.ac.uk +# RFC7079 || N. Del Regno, Ed., A. Malis, Ed. || nick.delregno@verizon.com, amalis@gmail.com +# RFC7080 || A. Sajassi, S. Salam, N. Bitar, F. Balus || sajassi@cisco.com, ssalam@cisco.com, nabil.n.bitar@verizon.com, florin.balus@nuagenetworks.net +# RFC7081 || E. Ivov, P. Saint-Andre, E. Marocco || emcho@jitsi.org, ietf@stpeter.im, enrico.marocco@telecomitalia.it +# RFC7082 || R. Shekh-Yusef, M. Barnes || rifaat.ietf@gmail.com, mary.ietf.barnes@gmail.com +# RFC7083 || R. Droms || rdroms@cisco.com +# RFC7084 || H. Singh, W. Beebee, C. Donley, B. Stark || shemant@cisco.com, wbeebee@cisco.com, c.donley@cablelabs.com, barbara.stark@att.com +# RFC7085 || J. Levine, P. Hoffman || standards@taugh.com, paul.hoffman@cybersecurity.org +# RFC7086 || A. Keranen, G. Camarillo, J. Maenpaa || Ari.Keranen@ericsson.com, Gonzalo.Camarillo@ericsson.com, Jouni.Maenpaa@ericsson.com +# RFC7087 || H. van Helvoort, Ed., L. Andersson, Ed., N. Sprecher, Ed. || Huub.van.Helvoort@huawei.com, loa@mail01.huawei.com, nurit.sprecher@nsn.com +# RFC7088 || D. Worley || worley@ariadne.com +# RFC7089 || H. Van de Sompel, M. Nelson, R. Sanderson || hvdsomp@gmail.com, mln@cs.odu.edu, azaroth42@gmail.com +# RFC7090 || H. Schulzrinne, H. Tschofenig, C. Holmberg, M. Patel || hgs+ecrit@cs.columbia.edu, Hannes.Tschofenig@gmx.net, christer.holmberg@ericsson.com, Milan.Patel@huawei.com +# RFC7091 || V. Dolmatov, Ed., A. Degtyarev || dol@cryptocom.ru, alexey@renatasystems.org +# RFC7092 || H. Kaplan, V. Pascual || hadriel.kaplan@oracle.com, victor.pascual@quobis.com +# RFC7093 || S. Turner, S. Kent, J. Manger || turners@ieca.com, kent@bbn.com, james.h.manger@team.telstra.com +# RFC7094 || D. McPherson, D. Oran, D. Thaler, E. Osterweil || dmcpherson@verisign.com, oran@cisco.com, dthaler@microsoft.com, eosterweil@verisign.com +# RFC7095 || P. Kewisch || mozilla@kewis.ch +# RFC7096 || S. Belotti, Ed., P. Grandi, D. Ceccarelli, Ed., D. Caviglia, F. Zhang, D. Li || sergio.belotti@alcatel-lucent.com, pietro_vittorio.grandi@alcatel-lucent.com, daniele.ceccarelli@ericsson.com, diego.caviglia@ericsson.com, zhangfatai@huawei.com, danli@huawei.com +# RFC7097 || J. Ott, V. Singh, Ed., I. Curcio || jo@comnet.tkk.fi, varun@comnet.tkk.fi, igor.curcio@nokia.com +# RFC7098 || B. Carpenter, S. Jiang, W. Tarreau || brian.e.carpenter@gmail.com, jiangsheng@huawei.com, willy@haproxy.com +# RFC7100 || P. Resnick || presnick@qti.qualcomm.com +# RFC7101 || S. Ginoza || sginoza@amsl.com +# RFC7102 || JP. Vasseur || jpv@cisco.com +# RFC7103 || M. Kucherawy, G. Shapiro, N. Freed || superuser@gmail.com, gshapiro@proofpoint.com, ned.freed@mrochek.com +# RFC7104 || A. Begen, Y. Cai, H. Ou || abegen@cisco.com, yiqunc@microsoft.com, hou@cisco.com +# RFC7105 || M. Thomson, J. Winterbottom || martin.thomson@gmail.com, a.james.winterbottom@gmail.com +# RFC7106 || E. Ivov || emcho@jitsi.org +# RFC7107 || R. Housley || housley@vigilsec.com +# RFC7108 || J. Abley, T. Manderson || jabley@dyn.com, terry.manderson@icann.org +# RFC7109 || H. Yokota, D. Kim, B. Sarikaya, F. Xia || yokota@kddilabs.jp, dskim@jejutp.or.kr, sarikaya@ieee.org, xiayangsong@huawei.com +# RFC7110 || M. Chen, W. Cao, S. Ning, F. Jounay, S. Delord || mach.chen@huawei.com, wayne.caowei@huawei.com, ning.so@tatacommunications.com, frederic.jounay@orange.ch, simon.delord@alcatel-lucent.com +# RFC7111 || M. Hausenblas, E. Wilde, J. Tennison || mhausenblas@maprtech.com, dret@berkeley.edu, jeni@jenitennison.com +# RFC7112 || F. Gont, V. Manral, R. Bonica || fgont@si6networks.com, vishwas@ionosnetworks.com, rbonica@juniper.net +# RFC7113 || F. Gont || fgont@si6networks.com +# RFC7114 || B. Leiba || barryleiba@computer.org +# RFC7115 || R. Bush || randy@psg.com +# RFC7116 || K. Scott, M. Blanchet || kscott@mitre.org, marc.blanchet@viagenie.ca +# RFC7117 || R. Aggarwal, Ed., Y. Kamite, L. Fang, Y. Rekhter, C. Kodeboniya || raggarwa_1@yahoo.com, y.kamite@ntt.com, lufang@microsoft.com, yakov@juniper.net, chaitk@yahoo.com +# RFC7118 || I. Baz Castillo, J. Millan Villegas, V. Pascual || ibc@aliax.net, jmillan@aliax.net, victor.pascual@quobis.com +# RFC7119 || B. Claise, A. Kobayashi, B. Trammell || bclaise@cisco.com, akoba@nttv6.net, trammell@tik.ee.ethz.ch +# RFC7120 || M. Cotton || michelle.cotton@icann.org +# RFC7121 || K. Ogawa, W. Wang, E. Haleplidis, J. Hadi Salim || k.ogawa@ntt.com, wmwang@mail.zjgsu.edu.cn, ehalep@ece.upatras.gr, hadi@mojatatu.com +# RFC7122 || H. Kruse, S. Jero, S. Ostermann || kruse@ohio.edu, sjero@purdue.edu, ostermann@eecs.ohiou.edu +# RFC7123 || F. Gont, W. Liu || fgont@si6networks.com, liushucheng@huawei.com +# RFC7124 || E. Beili || edward.beili@actelis.com +# RFC7125 || B. Trammell, P. Aitken || trammell@tik.ee.ethz.ch, paitken@cisco.com +# RFC7126 || F. Gont, R. Atkinson, C. Pignataro || fgont@si6networks.com, rja.lists@gmail.com, cpignata@cisco.com +# RFC7127 || O. Kolkman, S. Bradner, S. Turner || olaf@nlnetlabs.nl, sob@harvard.edu, turners@ieca.com +# RFC7128 || R. Bush, R. Austein, K. Patel, H. Gredler, M. Waehlisch || randy@psg.com, sra@hactrn.net, keyupate@cisco.com, hannes@juniper.net, waehlisch@ieee.org +# RFC7129 || R. Gieben, W. Mekking || miek@google.com, matthijs@nlnetlabs.nl +# RFC7130 || M. Bhatia, Ed., M. Chen, Ed., S. Boutros, Ed., M. Binderberger, Ed., J. Haas, Ed. || manav.bhatia@alcatel-lucent.com, mach@huawei.com, sboutros@cisco.com, mbinderb@cisco.com, jhaas@juniper.net +# RFC7131 || M. Barnes, F. Audet, S. Schubert, H. van Elburg, C. Holmberg || mary.ietf.barnes@gmail.com, francois.audet@skype.net, shida@ntt-at.com, ietf.hanserik@gmail.com, christer.holmberg@ericsson.com +# RFC7132 || S. Kent, A. Chi || kent@bbn.com, achi@cs.unc.edu +# RFC7133 || S. Kashima, A. Kobayashi, Ed., P. Aitken || kashima@nttv6.net, akoba@nttv6.net, paitken@cisco.com +# RFC7134 || B. Rosen || br@brianrosen.net +# RFC7135 || J. Polk || jmpolk@cisco.com +# RFC7136 || B. Carpenter, S. Jiang || brian.e.carpenter@gmail.com, jiangsheng@huawei.com +# RFC7137 || A. Retana, S. Ratliff || aretana@cisco.com, sratliff@cisco.com +# RFC7138 || D. Ceccarelli, Ed., F. Zhang, S. Belotti, R. Rao, J. Drake || daniele.ceccarelli@ericsson.com, zhangfatai@huawei.com, sergio.belotti@alcatel-lucent.com, rrao@infinera.com, jdrake@juniper.net +# RFC7139 || F. Zhang, Ed., G. Zhang, S. Belotti, D. Ceccarelli, K. Pithewan || zhangfatai@huawei.com, zhangguoying@mail.ritt.com.cn, sergio.belotti@alcatel-lucent.it, daniele.ceccarelli@ericsson.com, kpithewan@infinera.com +# RFC7140 || L. Jin, F. Jounay, IJ. Wijnands, N. Leymann || lizho.jin@gmail.com, frederic.jounay@orange.ch, ice@cisco.com, n.leymann@telekom.de +# RFC7141 || B. Briscoe, J. Manner || bob.briscoe@bt.com, jukka.manner@aalto.fi +# RFC7142 || M. Shand, L. Ginsberg || imc.shand@googlemail.com, ginsberg@cisco.com +# RFC7143 || M. Chadalapaka, J. Satran, K. Meth, D. Black || cbm@chadalapaka.com, julians@infinidat.com, meth@il.ibm.com, david.black@emc.com +# RFC7144 || F. Knight, M. Chadalapaka || knight@netapp.com, cbm@chadalapaka.com +# RFC7145 || M. Ko, A. Nezhinsky || mkosjc@gmail.com, alexandern@mellanox.com +# RFC7146 || D. Black, P. Koning || david.black@emc.com, paul_koning@Dell.com +# RFC7147 || M. Bakke, P. Venkatesen || mark_bakke@dell.com, prakashvn@hcl.com +# RFC7148 || X. Zhou, J. Korhonen, C. Williams, S. Gundavelli, CJ. Bernardos || zhou.xingyue@zte.com.cn, jouni.nospam@gmail.com, carlw@mcsr-labs.org, sgundave@cisco.com, cjbc@it.uc3m.es +# RFC7149 || M. Boucadair, C. Jacquenet || mohamed.boucadair@orange.com, christian.jacquenet@orange.com +# RFC7150 || F. Zhang, A. Farrel || zhangfatai@huawei.com, adrian@olddog.co.uk +# RFC7151 || P. Hethmon, R. McMurray || phethmon@hethmon.com, robmcm@microsoft.com +# RFC7152 || R. Key, Ed., S. DeLord, F. Jounay, L. Huang, Z. Liu, M. Paul || raymond.key@ieee.org, simon.delord@gmail.com, frederic.jounay@orange.ch, huanglu@chinamobile.com, zhliu@gsta.com, manuel.paul@telekom.de +# RFC7153 || E. Rosen, Y. Rekhter || erosen@cisco.com, yakov@juniper.net +# RFC7154 || S. Moonesamy, Ed. || sm+ietf@elandsys.com +# RFC7155 || G. Zorn, Ed. || glenzorn@gmail.com +# RFC7156 || G. Zorn, Q. Wu, J. Korhonen || glenzorn@gmail.com, bill.wu@huawei.com, jouni.nospam@gmail.com +# RFC7157 || O. Troan, Ed., D. Miles, S. Matsushima, T. Okimoto, D. Wing || ot@cisco.com, davidmiles@google.com, satoru.matsushima@g.softbank.co.jp, t.okimoto@west.ntt.co.jp, dwing-ietf@fuggles.com +# RFC7158 || T. Bray, Ed. || tbray@textuality.com +# RFC7159 || T. Bray, Ed. || tbray@textuality.com +# RFC7160 || M. Petit-Huguenin, G. Zorn, Ed. || petithug@acm.org, glenzorn@gmail.com +# RFC7161 || LM. Contreras, CJ. Bernardos, I. Soto || lmcm@tid.es, cjbc@it.uc3m.es, isoto@it.uc3m.es +# RFC7162 || A. Melnikov, D. Cridland || Alexey.Melnikov@isode.com, dave.cridland@surevine.com +# RFC7163 || C. Holmberg, I. Sedlacek || christer.holmberg@ericsson.com, ivo.sedlacek@ericsson.com +# RFC7164 || K. Gross, R. Brandenburg || kevin.gross@avanw.com, ray.vanbrandenburg@tno.nl +# RFC7165 || R. Barnes || rlb@ipv.sx +# RFC7166 || M. Bhatia, V. Manral, A. Lindem || manav.bhatia@alcatel-lucent.com, vishwas@ionosnetworks.com, acee.lindem@ericsson.com +# RFC7167 || D. Frost, S. Bryant, M. Bocci, L. Berger || frost@mm.st, stbryant@cisco.com, matthew.bocci@alcatel-lucent.com, lberger@labn.net +# RFC7168 || I. Nazar || inazar@deviantart.com +# RFC7169 || S. Turner || turners@ieca.com +# RFC7170 || H. Zhou, N. Cam-Winget, J. Salowey, S. Hanna || hzhou@cisco.com, ncamwing@cisco.com, jsalowey@cisco.com, steve.hanna@infineon.com +# RFC7171 || N. Cam-Winget, P. Sangster || ncamwing@cisco.com, paul_sangster@symantec.com +# RFC7172 || D. Eastlake 3rd, M. Zhang, P. Agarwal, R. Perlman, D. Dutt || d3e3e3@gmail.com, zhangmingui@huawei.com, pagarwal@broadcom.com, Radia@alum.mit.edu, ddutt.ietf@hobbesdutt.com +# RFC7173 || L. Yong, D. Eastlake 3rd, S. Aldrin, J. Hudson || lucy.yong@huawei.com, d3e3e3@gmail.com, sam.aldrin@huawei.com, jon.hudson@gmail.com +# RFC7174 || S. Salam, T. Senevirathne, S. Aldrin, D. Eastlake 3rd || ssalam@cisco.com, tsenevir@cisco.com, sam.aldrin@gmail.com, d3e3e3@gmail.com +# RFC7175 || V. Manral, D. Eastlake 3rd, D. Ward, A. Banerjee || vishwas@ionosnetworks.com, d3e3e3@gmail.com, dward@cisco.com, ayabaner@gmail.com +# RFC7176 || D. Eastlake 3rd, T. Senevirathne, A. Ghanwani, D. Dutt, A. Banerjee || d3e3e3@gmail.com, tsenevir@cisco.com, anoop@alumni.duke.edu, ddutt.ietf@hobbesdutt.com, ayabaner@gmail.com +# RFC7177 || D. Eastlake 3rd, R. Perlman, A. Ghanwani, H. Yang, V. Manral || d3e3e3@gmail.com, radia@alum.mit.edu, anoop@alumni.duke.edu, howardy@cisco.com, vishwas@ionosnetworks.com +# RFC7178 || D. Eastlake 3rd, V. Manral, Y. Li, S. Aldrin, D. Ward || d3e3e3@gmail.com, vishwas@ionosnetworks.com, liyizhou@huawei.com, sam.aldrin@huawei.com, dward@cisco.com +# RFC7179 || D. Eastlake 3rd, A. Ghanwani, V. Manral, Y. Li, C. Bestler || d3e3e3@gmail.com, anoop@alumni.duke.edu, vishwas@ionosnetworks.com, liyizhou@huawei.com, caitlin.bestler@nexenta.com +# RFC7180 || D. Eastlake 3rd, M. Zhang, A. Ghanwani, V. Manral, A. Banerjee || d3e3e3@gmail.com, zhangmingui@huawei.com, anoop@alumni.duke.edu, vishwas@ionosnetworks.com, ayabaner@gmail.com +# RFC7181 || T. Clausen, C. Dearlove, P. Jacquet, U. Herberg || T.Clausen@computer.org, chris.dearlove@baesystems.com, philippe.jacquet@alcatel-lucent.com, ulrich@herberg.name +# RFC7182 || U. Herberg, T. Clausen, C. Dearlove || ulrich@herberg.name, T.Clausen@computer.org, chris.dearlove@baesystems.com +# RFC7183 || U. Herberg, C. Dearlove, T. Clausen || ulrich@herberg.name, chris.dearlove@baesystems.com, T.Clausen@computer.org +# RFC7184 || U. Herberg, R. Cole, T. Clausen || ulrich@herberg.name, robert.g.cole@us.army.mil, T.Clausen@computer.org +# RFC7185 || C. Dearlove, T. Clausen, P. Jacquet || chris.dearlove@baesystems.com, T.Clausen@computer.org, philippe.jacquet@alcatel-lucent.com +# RFC7186 || J. Yi, U. Herberg, T. Clausen || jiazi@jiaziyi.com, ulrich@herberg.name, T.Clausen@computer.org +# RFC7187 || C. Dearlove, T. Clausen || chris.dearlove@baesystems.com, T.Clausen@computer.org +# RFC7188 || C. Dearlove, T. Clausen || chris.dearlove@baesystems.com, T.Clausen@computer.org +# RFC7189 || G. Mirsky || gregory.mirsky@ericsson.com +# RFC7190 || C. Villamizar || curtis@occnc.com +# RFC7191 || R. Housley || housley@vigilsec.com +# RFC7192 || S. Turner || turners@ieca.com +# RFC7193 || S. Turner, R. Housley, J. Schaad || turners@ieca.com, housley@vigilsec.com, ietf@augustcellars.com +# RFC7194 || R. Hartmann || richih.mailinglist@gmail.com +# RFC7195 || M. Garcia-Martin, S. Veikkolainen || miguel.a.garcia@ericsson.com, simo.veikkolainen@nokia.com +# RFC7196 || C. Pelsser, R. Bush, K. Patel, P. Mohapatra, O. Maennel || cristel@iij.ad.jp, randy@psg.com, keyupate@cisco.com, mpradosh@yahoo.com, o@maennel.net +# RFC7197 || A. Begen, Y. Cai, H. Ou || abegen@cisco.com, yiqunc@microsoft.com, hou@cisco.com +# RFC7198 || A. Begen, C. Perkins || abegen@cisco.com, csp@csperkins.org +# RFC7199 || R. Barnes, M. Thomson, J. Winterbottom, H. Tschofenig || rlb@ipv.sx, martin.thomson@gmail.com, a.james.winterbottom@gmail.com, Hannes.Tschofenig@gmx.net +# RFC7200 || C. Shen, H. Schulzrinne, A. Koike || charles@cs.columbia.edu, schulzrinne@cs.columbia.edu, koike.arata@lab.ntt.co.jp +# RFC7201 || M. Westerlund, C. Perkins || magnus.westerlund@ericsson.com, csp@csperkins.org +# RFC7202 || C. Perkins, M. Westerlund || csp@csperkins.org, magnus.westerlund@ericsson.com +# RFC7203 || T. Takahashi, K. Landfield, Y. Kadobayashi || takeshi_takahashi@nict.go.jp, kent_landfield@mcafee.com, youki-k@is.aist-nara.ac.jp +# RFC7204 || T. Haynes || tdh@excfb.com +# RFC7205 || A. Romanow, S. Botzko, M. Duckworth, R. Even, Ed. || allyn@cisco.com, stephen.botzko@polycom.com, mark.duckworth@polycom.com, roni.even@mail01.huawei.com +# RFC7206 || P. Jones, G. Salgueiro, J. Polk, L. Liess, H. Kaplan || paulej@packetizer.com, gsalguei@cisco.com, jmpolk@cisco.com, laura.liess.dt@gmail.com, hadriel.kaplan@oracle.com +# RFC7207 || M. Ortseifen, G. Dickfeld || iso20022@bundesbank.de, iso20022@bundesbank.de +# RFC7208 || S. Kitterman || scott@kitterman.com +# RFC7209 || A. Sajassi, R. Aggarwal, J. Uttaro, N. Bitar, W. Henderickx, A. Isaac || sajassi@cisco.com, raggarwa_1@yahoo.com, uttaro@att.com, nabil.n.bitar@verizon.com, wim.henderickx@alcatel-lucent.com, aisaac71@bloomberg.net +# RFC7210 || R. Housley, T. Polk, S. Hartman, D. Zhang || housley@vigilsec.com, tim.polk@nist.gov, hartmans-ietf@mit.edu, zhangdacheng@huawei.com +# RFC7211 || S. Hartman, D. Zhang || hartmans-ietf@mit.edu, zhangdacheng@huawei.com +# RFC7212 || D. Frost, S. Bryant, M. Bocci || frost@mm.st, stbryant@cisco.com, matthew.bocci@alcatel-lucent.com +# RFC7213 || D. Frost, S. Bryant, M. Bocci || frost@mm.st, stbryant@cisco.com, matthew.bocci@alcatel-lucent.com +# RFC7214 || L. Andersson, C. Pignataro || loa@mail01.huawei.com, cpignata@cisco.com +# RFC7215 || L. Jakab, A. Cabellos-Aparicio, F. Coras, J. Domingo-Pascual, D. Lewis || lojakab@cisco.com, acabello@ac.upc.edu, fcoras@ac.upc.edu, jordi.domingo@ac.upc.edu, darlewis@cisco.com +# RFC7216 || M. Thomson, R. Bellis || martin.thomson@gmail.com, ray.bellis@nominet.org.uk +# RFC7217 || F. Gont || fgont@si6networks.com +# RFC7218 || O. Gudmundsson || ogud@ogud.com +# RFC7219 || M. Bagnulo, A. Garcia-Martinez || marcelo@it.uc3m.es, alberto@it.uc3m.es +# RFC7220 || M. Boucadair, R. Penno, D. Wing || mohamed.boucadair@orange.com, repenno@cisco.com, dwing-ietf@fuggles.com +# RFC7221 || A. Farrel, D. Crocker, Ed. || adrian@olddog.co.uk, dcrocker@bbiw.net +# RFC7222 || M. Liebsch, P. Seite, H. Yokota, J. Korhonen, S. Gundavelli || liebsch@neclab.eu, pierrick.seite@orange.com, yokota@kddilabs.jp, jouni.nospam@gmail.com, sgundave@cisco.com +# RFC7223 || M. Bjorklund || mbj@tail-f.com +# RFC7224 || M. Bjorklund || mbj@tail-f.com +# RFC7225 || M. Boucadair || mohamed.boucadair@orange.com +# RFC7226 || C. Villamizar, Ed., D. McDysan, Ed., S. Ning, A. Malis, L. Yong || curtis@occnc.com, dave.mcdysan@verizon.com, ning.so@tatacommunications.com, agmalis@gmail.com, lucy.yong@huawei.com +# RFC7227 || D. Hankins, T. Mrugalski, M. Siodelski, S. Jiang, S. Krishnan || dhankins@google.com, tomasz.mrugalski@gmail.com, msiodelski@gmail.com, jiangsheng@huawei.com, suresh.krishnan@ericsson.com +# RFC7228 || C. Bormann, M. Ersue, A. Keranen || cabo@tzi.org, mehmet.ersue@nsn.com, ari.keranen@ericsson.com +# RFC7229 || R. Housley || housley@vigilsec.com +# RFC7230 || R. Fielding, Ed., J. Reschke, Ed. || fielding@gbiv.com, julian.reschke@greenbytes.de +# RFC7231 || R. Fielding, Ed., J. Reschke, Ed. || fielding@gbiv.com, julian.reschke@greenbytes.de +# RFC7232 || R. Fielding, Ed., J. Reschke, Ed. || fielding@gbiv.com, julian.reschke@greenbytes.de +# RFC7233 || R. Fielding, Ed., Y. Lafon, Ed., J. Reschke, Ed. || fielding@gbiv.com, ylafon@w3.org, julian.reschke@greenbytes.de +# RFC7234 || R. Fielding, Ed., M. Nottingham, Ed., J. Reschke, Ed. || fielding@gbiv.com, mnot@mnot.net, julian.reschke@greenbytes.de +# RFC7235 || R. Fielding, Ed., J. Reschke, Ed. || fielding@gbiv.com, julian.reschke@greenbytes.de +# RFC7236 || J. Reschke || julian.reschke@greenbytes.de +# RFC7237 || J. Reschke || julian.reschke@greenbytes.de +# RFC7238 || J. Reschke || julian.reschke@greenbytes.de +# RFC7239 || A. Petersson, M. Nilsson || andreas@sbin.se, nilsson@opera.com +# RFC7240 || J. Snell || jasnell@gmail.com +# RFC7241 || S. Dawkins, P. Thaler, D. Romascanu, B. Aboba, Ed. || spencerdawkins.ietf@gmail.com, pthaler@broadcom.com, dromasca@gmail.com , bernard_aboba@hotmail.com +# RFC7242 || M. Demmer, J. Ott, S. Perreault || demmer@cs.berkeley.edu, jo@netlab.tkk.fi, simon@per.reau.lt +# RFC7243 || V. Singh, Ed., J. Ott, I. Curcio || varun@comnet.tkk.fi, jo@comnet.tkk.fi, igor.curcio@nokia.com +# RFC7244 || H. Asaeda, Q. Wu, R. Huang || asaeda@nict.go.jp, bill.wu@huawei.com, Rachel@huawei.com +# RFC7245 || A. Hutton, Ed., L. Portman, Ed., R. Jain, K. Rehor || andrew.hutton@unify.com, leon.portman@gmail.com, rajnish.jain@outlook.com, krehor@cisco.com +# RFC7246 || IJ. Wijnands, Ed., P. Hitchen, N. Leymann, W. Henderickx, A. Gulko, J. Tantsura || ice@cisco.com, paul.hitchen@bt.com, n.leymann@telekom.de, wim.henderickx@alcatel-lucent.com, arkadiy.gulko@thomsonreuters.com, jeff.tantsura@ericsson.com +# RFC7247 || P. Saint-Andre, A. Houri, J. Hildebrand || ietf@stpeter.im, avshalom@il.ibm.com, jhildebr@cisco.com +# RFC7248 || P. Saint-Andre, A. Houri, J. Hildebrand || ietf@stpeter.im, avshalom@il.ibm.com, jhildebr@cisco.com +# RFC7249 || R. Housley || housley@vigilsec.com +# RFC7250 || P. Wouters, Ed., H. Tschofenig, Ed., J. Gilmore, S. Weiler, T. Kivinen || pwouters@redhat.com, Hannes.Tschofenig@gmx.net, gnu@toad.com, weiler@tislabs.com, kivinen@iki.fi +# RFC7251 || D. McGrew, D. Bailey, M. Campagna, R. Dugal || mcgrew@cisco.com, danbailey@sth.rub.de, mcampagna@gmail.com, rdugal@certicom.com +# RFC7252 || Z. Shelby, K. Hartke, C. Bormann || zach.shelby@arm.com, hartke@tzi.org, cabo@tzi.org +# RFC7253 || T. Krovetz, P. Rogaway || ted@krovetz.net, rogaway@cs.ucdavis.edu +# RFC7254 || M. Montemurro, Ed., A. Allen, D. McDonald, P. Gosden || mmontemurro@blackberry.com, aallen@blackberry.com, david.mcdonald@meteor.ie, pgosden@gsma.com +# RFC7255 || A. Allen, Ed. || aallen@blackberry.com +# RFC7256 || F. Le Faucheur, R. Maglione, T. Taylor || flefauch@cisco.com, robmgl@cisco.com, tom.taylor.stds@gmail.com +# RFC7257 || T. Nadeau, Ed., A. Kiran Koushik, Ed., R. Mediratta, Ed. || tnadeau@lucidvision.com, kkoushik@brocade.com, romedira@cisco.com +# RFC7258 || S. Farrell, H. Tschofenig || stephen.farrell@cs.tcd.ie, Hannes.Tschofenig@gmx.net +# RFC7259 || P. Saint-Andre || ietf@stpeter.im +# RFC7260 || A. Takacs, D. Fedyk, J. He || attila.takacs@ericsson.com, don.fedyk@hp.com, hejia@huawei.com +# RFC7261 || M. Perumal, P. Ravindran || mperumal@cisco.com, partha@parthasarathi.co.in +# RFC7262 || A. Romanow, S. Botzko, M. Barnes || allyn@cisco.com, stephen.botzko@polycom.com, mary.ietf.barnes@gmail.com +# RFC7263 || N. Zong, X. Jiang, R. Even, Y. Zhang || zongning@huawei.com, jiang.x.f@huawei.com, roni.even@mail01.huawei.com, hishigh@gmail.com +# RFC7264 || N. Zong, X. Jiang, R. Even, Y. Zhang || zongning@huawei.com, jiang.x.f@huawei.com, roni.even@mail01.huawei.com, hishigh@gmail.com +# RFC7265 || P. Kewisch, C. Daboo, M. Douglass || mozilla@kewis.ch, cyrus@daboo.name, douglm@rpi.edu +# RFC7266 || A. Clark, Q. Wu, R. Schott, G. Zorn || alan.d.clark@telchemy.com, sunseawq@huawei.com, Roland.Schott@telekom.de, gwz@net-zen.net +# RFC7267 || L. Martini, Ed., M. Bocci, Ed., F. Balus, Ed. || lmartini@cisco.com, matthew.bocci@alcatel-lucent.com, florin@nuagenetworks.net +# RFC7268 || B. Aboba, J. Malinen, P. Congdon, J. Salowey, M. Jones || Bernard_Aboba@hotmail.com, j@w1.fi, paul.congdon@tallac.com, jsalowey@cisco.com, mark@azu.ca +# RFC7269 || G. Chen, Z. Cao, C. Xie, D. Binet || chengang@chinamobile.com, caozhen@chinamobile.com, xiechf@ctbri.com.cn, david.binet@orange.com +# RFC7270 || A. Yourtchenko, P. Aitken, B. Claise || ayourtch@cisco.com, paitken@cisco.com, bclaise@cisco.com +# RFC7271 || J. Ryoo, Ed., E. Gray, Ed., H. van Helvoort, A. D'Alessandro, T. Cheung, E. Osborne || ryoo@etri.re.kr, eric.gray@ericsson.com, huub.van.helvoort@huawei.com, alessandro.dalessandro@telecomitalia.it, cts@etri.re.kr, eric.osborne@notcom.com +# RFC7272 || R. van Brandenburg, H. Stokking, O. van Deventer, F. Boronat, M. Montagud, K. Gross || ray.vanbrandenburg@tno.nl, hans.stokking@tno.nl, oskar.vandeventer@tno.nl, fboronat@dcom.upv.es, mamontor@posgrado.upv.es, kevin.gross@avanw.com +# RFC7273 || A. Williams, K. Gross, R. van Brandenburg, H. Stokking || aidan.williams@audinate.com, kevin.gross@avanw.com, ray.vanbrandenburg@tno.nl, hans.stokking@tno.nl +# RFC7274 || K. Kompella, L. Andersson, A. Farrel || kireeti.kompella@gmail.com, loa@mail01.huawei.com, adrian@olddog.co.uk +# RFC7275 || L. Martini, S. Salam, A. Sajassi, M. Bocci, S. Matsushima, T. Nadeau || lmartini@cisco.com, ssalam@cisco.com, sajassi@cisco.com, matthew.bocci@alcatel-lucent.com, satoru.matsushima@gmail.com, tnadeau@brocade.com +# RFC7276 || T. Mizrahi, N. Sprecher, E. Bellagamba, Y. Weingarten || talmi@marvell.com, nurit.sprecher@nsn.com, elisa.bellagamba@ericsson.com, wyaacov@gmail.com +# RFC7277 || M. Bjorklund || mbj@tail-f.com +# RFC7278 || C. Byrne, D. Drown, A. Vizdal || cameron.byrne@t-mobile.com, dan@drown.org, ales.vizdal@t-mobile.cz +# RFC7279 || M. Shore, C. Pignataro || melinda.shore@nomountain.net, cpignata@cisco.com +# RFC7280 || G. Fairhurst || gorry@erg.abdn.ac.uk +# RFC7281 || A. Melnikov || Alexey.Melnikov@isode.com +# RFC7282 || P. Resnick || presnick@qti.qualcomm.com +# RFC7283 || Y. Cui, Q. Sun, T. Lemon || yong@csnet1.cs.tsinghua.edu.cn, sunqi@csnet1.cs.tsinghua.edu.cn, Ted.Lemon@nominum.com +# RFC7284 || M. Lanthaler || mail@markus-lanthaler.com +# RFC7285 || R. Alimi, Ed., R. Penno, Ed., Y. Yang, Ed., S. Kiesel, S. Previdi, W. Roome, S. Shalunov, R. Woundy || ralimi@google.com, repenno@cisco.com, yry@cs.yale.edu, ietf-alto@skiesel.de, sprevidi@cisco.com, w.roome@alcatel-lucent.com, shalunov@shlang.com, Richard_Woundy@cable.comcast.com +# RFC7286 || S. Kiesel, M. Stiemerling, N. Schwan, M. Scharf, H. Song || ietf-alto@skiesel.de, mls.ietf@gmail.com, ietf@nico-schwan.de, michael.scharf@alcatel-lucent.com, haibin.song@huawei.com +# RFC7287 || T. Schmidt, Ed., S. Gao, H. Zhang, M. Waehlisch || Schmidt@informatik.haw-hamburg.de, shgao@bjtu.edu.cn, hkzhang@bjtu.edu.cn, mw@link-lab.net +# RFC7288 || D. Thaler || dthaler@microsoft.com +# RFC7289 || V. Kuarsingh, Ed., J. Cianfarani || victor@jvknet.com, john.cianfarani@rci.rogers.com +# RFC7290 || L. Ciavattone, R. Geib, A. Morton, M. Wieser || lencia@att.com, Ruediger.Geib@telekom.de, acmorton@att.com, matthias_michael.wieser@stud.tu-darmstadt.de +# RFC7291 || M. Boucadair, R. Penno, D. Wing || mohamed.boucadair@orange.com, repenno@cisco.com, dwing-ietf@fuggles.com +# RFC7292 || K. Moriarty, Ed., M. Nystrom, S. Parkinson, A. Rusch, M. Scott || Kathleen.Moriarty@emc.com, mnystrom@microsoft.com, sean.parkinson@rsa.com, andreas.rusch@rsa.com, michael2.scott@rsa.com +# RFC7293 || W. Mills, M. Kucherawy || wmills_92105@yahoo.com, msk@fb.com +# RFC7294 || A. Clark, G. Zorn, C. Bi, Q. Wu || alan.d.clark@telchemy.com, gwz@net-zen.net, bijy@sttri.com.cn, sunseawq@huawei.com +# RFC7295 || H. Tschofenig, L. Eggert, Z. Sarker || Hannes.Tschofenig@gmx.net, lars@netapp.com, Zaheduzzaman.Sarker@ericsson.com +# RFC7296 || C. Kaufman, P. Hoffman, Y. Nir, P. Eronen, T. Kivinen || charliekaufman@outlook.com, paul.hoffman@vpnc.org, nir.ietf@gmail.com, pe@iki.fi, kivinen@iki.fi +# RFC7297 || M. Boucadair, C. Jacquenet, N. Wang || mohamed.boucadair@orange.com, christian.jacquenet@orange.com, n.wang@surrey.ac.uk +# RFC7298 || D. Ovsienko || infrastation@yandex.ru +# RFC7299 || R. Housley || housley@vigilsec.com +# RFC7300 || J. Haas, J. Mitchell || jhaas@juniper.net, jon.mitchell@microsoft.com +# RFC7301 || S. Friedl, A. Popov, A. Langley, E. Stephan || sfriedl@cisco.com, andreipo@microsoft.com, agl@google.com, emile.stephan@orange.com +# RFC7302 || P. Lemieux || pal@sandflow.com +# RFC7303 || H. Thompson, C. Lilley || ht@inf.ed.ac.uk, chris@w3.org +# RFC7304 || W. Kumari || warren@kumari.net +# RFC7305 || E. Lear, Ed. || lear@cisco.com +# RFC7306 || H. Shah, F. Marti, W. Noureddine, A. Eiriksson, R. Sharp || hemal@broadcom.com, felix@chelsio.com, asgeir@chelsio.com, wael@chelsio.com, robert.o.sharp@intel.com +# RFC7307 || Q. Zhao, K. Raza, C. Zhou, L. Fang, L. Li, D. King || quintin.zhao@huawei.com, skraza@cisco.com, czhou@cisco.com, lufang@microsoft.com, lilianyuan@chinamobile.com, daniel@olddog.co.uk +# RFC7308 || E. Osborne || none +# RFC7309 || Z. Liu, L. Jin, R. Chen, D. Cai, S. Salam || zhliu@gsta.com, lizho.jin@gmail.com, chen.ran@zte.com.cn, dcai@cisco.com, ssalam@cisco.com +# RFC7310 || J. Lindsay, H. Foerster || lindsay@worldcastsystems.com, foerster@worldcastsystems.com +# RFC7311 || P. Mohapatra, R. Fernando, E. Rosen, J. Uttaro || mpradosh@yahoo.com, rex@cisco.com, erosen@cisco.com, uttaro@att.com +# RFC7312 || J. Fabini, A. Morton || joachim.fabini@tuwien.ac.at, acmorton@att.com +# RFC7313 || K. Patel, E. Chen, B. Venkatachalapathy || keyupate@cisco.com, enkechen@cisco.com, balaji_pv@hotmail.com +# RFC7314 || M. Andrews || marka@isc.org +# RFC7315 || R. Jesske, K. Drage, C. Holmberg || r.jesske@telekom.de, drage@alcatel-lucent.com, christer.holmberg@ericsson.com +# RFC7316 || J. van Elburg, K. Drage, M. Ohsugi, S. Schubert, K. Arai || ietf.hanserik@gmail.com, drage@alcatel-lucent.com, mayumi.ohsugi@ntt-at.co.jp, shida@ntt-at.com, arai.kenjiro@lab.ntt.co.jp +# RFC7317 || A. Bierman, M. Bjorklund || andy@yumaworks.com, mbj@tail-f.com +# RFC7318 || A. Newton, G. Huston || andy@arin.net, gih@apnic.net +# RFC7319 || D. Eastlake 3rd || d3e3e3@gmail.com +# RFC7320 || M. Nottingham || mnot@mnot.net +# RFC7321 || D. McGrew, P. Hoffman || mcgrew@cisco.com, paul.hoffman@vpnc.org +# RFC7322 || H. Flanagan, S. Ginoza || rse@rfc-editor.org, rfc-editor@rfc-editor.org +# RFC7323 || D. Borman, B. Braden, V. Jacobson, R. Scheffenegger, Ed. || david.borman@quantum.com, braden@isi.edu, vanj@google.com, rs@netapp.com +# RFC7324 || E. Osborne || eric.osborne@notcom.com +# RFC7325 || C. Villamizar, Ed., K. Kompella, S. Amante, A. Malis, C. Pignataro || curtis@occnc.com, kireeti@juniper.net, amante@apple.com, agmalis@gmail.com, cpignata@cisco.com +# RFC7326 || J. Parello, B. Claise, B. Schoening, J. Quittek || jparello@cisco.com, bclaise@cisco.com, brad.schoening@verizon.net, quittek@netlab.nec.de +# RFC7328 || R. Gieben || miek@google.com +# RFC7329 || H. Kaplan || hadrielk@yahoo.com +# RFC7330 || T. Nadeau, Z. Ali, N. Akiya || tnadeau@lucidvision.com, zali@cisco.com, nobo@cisco.com +# RFC7331 || T. Nadeau, Z. Ali, N. Akiya || tnadeau@lucidvision.com, zali@cisco.com, nobo@cisco.com +# RFC7332 || H. Kaplan, V. Pascual || hadrielk@yahoo.com, victor.pascual@quobis.com +# RFC7333 || H. Chan, Ed., D. Liu, P. Seite, H. Yokota, J. Korhonen || h.a.chan@ieee.org, liudapeng@chinamobile.com, pierrick.seite@orange.com, hidetoshi.yokota@landisgyr.com, jouni.nospam@gmail.com +# RFC7334 || Q. Zhao, D. Dhody, D. King, Z. Ali, R. Casellas || quintin.zhao@huawei.com, dhruv.dhody@huawei.com, daniel@olddog.co.uk, zali@cisco.com, ramon.casellas@cttc.es +# RFC7335 || C. Byrne || cameron.byrne@t-mobile.com +# RFC7336 || L. Peterson, B. Davie, R. van Brandenburg, Ed. || lapeters@akamai.com, bdavie@vmware.com, ray.vanbrandenburg@tno.nl +# RFC7337 || K. Leung, Ed., Y. Lee, Ed. || kleung@cisco.com, yiu_lee@cable.comcast.com +# RFC7338 || F. Jounay, Ed., Y. Kamite, Ed., G. Heron, M. Bocci || frederic.jounay@orange.ch, y.kamite@ntt.com, giheron@cisco.com, Matthew.Bocci@alcatel-lucent.com +# RFC7339 || V. Gurbani, Ed., V. Hilt, H. Schulzrinne || vkg@bell-labs.com, volker.hilt@bell-labs.com, hgs@cs.columbia.edu +# RFC7340 || J. Peterson, H. Schulzrinne, H. Tschofenig || jon.peterson@neustar.biz, hgs@cs.columbia.edu, Hannes.Tschofenig@gmx.net +# RFC7341 || Q. Sun, Y. Cui, M. Siodelski, S. Krishnan, I. Farrer || sunqi@csnet1.cs.tsinghua.edu.cn, yong@csnet1.cs.tsinghua.edu.cn, msiodelski@gmail.com, suresh.krishnan@ericsson.com, ian.farrer@telekom.de +# RFC7342 || L. Dunbar, W. Kumari, I. Gashinsky || ldunbar@huawei.com, warren@kumari.net, igor@yahoo-inc.com +# RFC7343 || J. Laganier, F. Dupont || julien.ietf@gmail.com, fdupont@isc.org +# RFC7344 || W. Kumari, O. Gudmundsson, G. Barwood || warren@kumari.net, ogud@ogud.com, george.barwood@blueyonder.co.uk +# RFC7345 || C. Holmberg, I. Sedlacek, G. Salgueiro || christer.holmberg@ericsson.com, ivo.sedlacek@ericsson.com, gsalguei@cisco.com +# RFC7346 || R. Droms || rdroms.ietf@gmail.com +# RFC7347 || H. van Helvoort, Ed., J. Ryoo, Ed., H. Zhang, F. Huang, H. Li, A. D'Alessandro || huub@van-helvoort.eu, ryoo@etri.re.kr, zhanghaiyan@huawei.com, feng.huang@philips.com, lihan@chinamobile.com, alessandro.dalessandro@telecomitalia.it +# RFC7348 || M. Mahalingam, D. Dutt, K. Duda, P. Agarwal, L. Kreeger, T. Sridhar, M. Bursell, C. Wright || mallik_mahalingam@yahoo.com, ddutt.ietf@hobbesdutt.com, kduda@arista.com, pagarwal@broadcom.com, kreeger@cisco.com, tsridhar@vmware.com, mike.bursell@intel.com, chrisw@redhat.com +# RFC7349 || L. Zheng, M. Chen, M. Bhatia || vero.zheng@huawei.com, mach.chen@huawei.com, manav@ionosnetworks.com +# RFC7350 || M. Petit-Huguenin, G. Salgueiro || marcph@getjive.com, gsalguei@cisco.com +# RFC7351 || E. Wilde || dret@berkeley.edu +# RFC7352 || S. Bosch || stephan@rename-it.nl +# RFC7353 || S. Bellovin, R. Bush, D. Ward || bellovin@acm.org, randy@psg.com, dward@cisco.com +# RFC7354 || A. Adolf, P. Siebert || alexander.adolf@condition-alpha.com, dvb@dvb.org +# RFC7355 || G. Salgueiro, V. Pascual, A. Roman, S. Garcia || gsalguei@cisco.com, victor.pascual@quobis.com, anton.roman@quobis.com, sergio.garcia@quobis.com +# RFC7356 || L. Ginsberg, S. Previdi, Y. Yang || ginsberg@cisco.com, sprevidi@cisco.com, yiya@cisco.com +# RFC7357 || H. Zhai, F. Hu, R. Perlman, D. Eastlake 3rd, O. Stokes || zhai.hongjun@zte.com.cn, hu.fangwei@zte.com.cn, Radia@alum.mit.edu, d3e3e3@gmail.com, ostokes@extremenetworks.com +# RFC7358 || K. Raza, S. Boutros, L. Martini, N. Leymann || skraza@cisco.com, sboutros@cisco.com, lmartini@cisco.com, n.leymann@telekom.de +# RFC7359 || F. Gont || fgont@si6networks.com +# RFC7360 || A. DeKok || aland@freeradius.org +# RFC7361 || P. Dutta, F. Balus, O. Stokes, G. Calvignac, D. Fedyk || pranjal.dutta@alcatel-lucent.com, florin.balus@alcatel-lucent.com, ostokes@extremenetworks.com, geraldine.calvignac@orange.com, don.fedyk@hp.com +# RFC7362 || E. Ivov, H. Kaplan, D. Wing || emcho@jitsi.org, hadrielk@yahoo.com, dwing-ietf@fuggles.com +# RFC7363 || J. Maenpaa, G. Camarillo || Jouni.Maenpaa@ericsson.com, Gonzalo.Camarillo@ericsson.com +# RFC7364 || T. Narten, Ed., E. Gray, Ed., D. Black, L. Fang, L. Kreeger, M. Napierala || narten@us.ibm.com, Eric.Gray@Ericsson.com, david.black@emc.com, lufang@microsoft.com, kreeger@cisco.com, mnapierala@att.com +# RFC7365 || M. Lasserre, F. Balus, T. Morin, N. Bitar, Y. Rekhter || marc.lasserre@alcatel-lucent.com, florin.balus@alcatel-lucent.com, thomas.morin@orange.com, nabil.n.bitar@verizon.com, yakov@juniper.net +# RFC7366 || P. Gutmann || pgut001@cs.auckland.ac.nz +# RFC7367 || R. Cole, J. Macker, B. Adamson || robert.g.cole@us.army.mil, macker@itd.nrl.navy.mil, adamson@itd.nrl.navy.mil +# RFC7368 || T. Chown, Ed., J. Arkko, A. Brandt, O. Troan, J. Weil || tjc@ecs.soton.ac.uk, jari.arkko@piuha.net, Anders_Brandt@sigmadesigns.com, ot@cisco.com, jason.weil@twcable.com +# RFC7369 || A. Takacs, B. Gero, H. Long || attila.takacs@ericsson.com, balazs.peter.gero@ericsson.com, lonho@huawei.com +# RFC7370 || L. Ginsberg || ginsberg@cisco.com +# RFC7371 || M. Boucadair, S. Venaas || mohamed.boucadair@orange.com, stig@cisco.com +# RFC7372 || M. Kucherawy || superuser@gmail.com +# RFC7373 || B. Trammell || ietf@trammell.ch +# RFC7374 || J. Maenpaa, G. Camarillo || Jouni.Maenpaa@ericsson.com, gonzalo.camarillo@ericsson.com +# RFC7375 || J. Peterson || jon.peterson@neustar.biz +# RFC7376 || T. Reddy, R. Ravindranath, M. Perumal, A. Yegin || tireddy@cisco.com, rmohanr@cisco.com, muthu.arul@gmail.com, alper.yegin@yegin.org +# RFC7377 || B. Leiba, A. Melnikov || barryleiba@computer.org, alexey.melnikov@isode.com +# RFC7378 || H. Tschofenig, H. Schulzrinne, B. Aboba, Ed. || Hannes.Tschofenig@gmx.net, hgs@cs.columbia.edu, Bernard_Aboba@hotmail.com +# RFC7379 || Y. Li, W. Hao, R. Perlman, J. Hudson, H. Zhai || liyizhou@huawei.com, haoweiguo@huawei.com, radia@alum.mit.edu, jon.hudson@gmail.com, honjun.zhai@tom.com +# RFC7380 || J. Tong, C. Bi, Ed., R. Even, Q. Wu, Ed., R. Huang || tongjg@sttri.com.cn, bijy@sttri.com.cn, roni.even@mail01.huawei.com, bill.wu@huawei.com, rachel.huang@huawei.com +# RFC7381 || K. Chittimaneni, T. Chown, L. Howard, V. Kuarsingh, Y. Pouffary, E. Vyncke || kk@dropbox.com, tjc@ecs.soton.ac.uk, lee.howard@twcable.com, victor@jvknet.com, yanick.pouffary@hp.com, evyncke@cisco.com +# RFC7382 || S. Kent, D. Kong, K. Seo || skent@bbn.com, dkong@bbn.com, kseo@bbn.com +# RFC7383 || V. Smyslov || svan@elvis.ru +# RFC7384 || T. Mizrahi || talmi@marvell.com +# RFC7385 || L. Andersson, G. Swallow || loa@mail01.huawei.com, swallow@cisco.com +# RFC7386 || P. Hoffman, J. Snell || paul.hoffman@vpnc.org, jasnell@gmail.com +# RFC7387 || R. Key, Ed., L. Yong, Ed., S. Delord, F. Jounay, L. Jin || raymond.key@ieee.org, lucy.yong@huawei.com, simon.delord@gmail.com, frederic.jounay@orange.ch, lizho.jin@gmail.com +# RFC7388 || J. Schoenwaelder, A. Sehgal, T. Tsou, C. Zhou || j.schoenwaelder@jacobs-university.de, s.anuj@jacobs-university.de, tina.tsou.zouting@huawei.com, cathyzhou@huawei.com +# RFC7389 || R. Wakikawa, R. Pazhyannur, S. Gundavelli, C. Perkins || ryuji.wakikawa@gmail.com, rpazhyan@cisco.com, sgundave@cisco.com, charliep@computer.org +# RFC7390 || A. Rahman, Ed., E. Dijk, Ed. || Akbar.Rahman@InterDigital.com, esko.dijk@philips.com +# RFC7391 || J. Hadi Salim || hadi@mojatatu.com +# RFC7392 || P. Dutta, M. Bocci, L. Martini || pranjal.dutta@alcatel-lucent.com, matthew.bocci@alcatel-lucent.com, lmartini@cisco.com +# RFC7393 || X. Deng, M. Boucadair, Q. Zhao, J. Huang, C. Zhou || dxhbupt@gmail.com, mohamed.boucadair@orange.com, zhaoqin.bupt@gmail.com, james.huang@huawei.com, cathy.zhou@huawei.com +# RFC7394 || S. Boutros, S. Sivabalan, G. Swallow, S. Saxena, V. Manral, S. Aldrin || sboutros@cisco.com, msiva@cisco.com, swallow@cisco.com, ssaxena@cisco.com, vishwas@ionosnetworks.com, aldrin.ietf@gmail.com +# RFC7395 || L. Stout, Ed., J. Moffitt, E. Cestari || lance@andyet.net, jack@metajack.im, eric@cstar.io +# RFC7396 || P. Hoffman, J. Snell || paul.hoffman@vpnc.org, jasnell@gmail.com +# RFC7397 || J. Gilger, H. Tschofenig || Gilger@ITSec.RWTH-Aachen.de, Hannes.tschofenig@gmx.net +# RFC7398 || M. Bagnulo, T. Burbridge, S. Crawford, P. Eardley, A. Morton || marcelo@it.uc3m.es, trevor.burbridge@bt.com, sam@samknows.com, philip.eardley@bt.com, acmorton@att.com +# RFC7399 || A. Farrel, D. King || adrian@olddog.co.uk, daniel@olddog.co.uk +# RFC7400 || C. Bormann || cabo@tzi.org +# RFC7401 || R. Moskowitz, Ed., T. Heer, P. Jokela, T. Henderson || rgm@labs.htt-consult.com, tobias.heer@belden.com, petri.jokela@nomadiclab.com, tomhend@u.washington.edu +# RFC7402 || P. Jokela, R. Moskowitz, J. Melen || petri.jokela@nomadiclab.com, rgm@labs.htt-consult.com, jan.melen@nomadiclab.com +# RFC7403 || H. Kaplan || hadrielk@yahoo.com +# RFC7404 || M. Behringer, E. Vyncke || mbehring@cisco.com, evyncke@cisco.com +# RFC7405 || P. Kyzivat || pkyzivat@alum.mit.edu +# RFC7406 || H. Schulzrinne, S. McCann, G. Bajko, H. Tschofenig, D. Kroeselberg || hgs+ecrit@cs.columbia.edu, smccann@blackberry.com, gabor.bajko@mediatek.com, Hannes.Tschofenig@gmx.net, dirk.kroeselberg@siemens.com +# RFC7407 || M. Bjorklund, J. Schoenwaelder || mbj@tail-f.com, j.schoenwaelder@jacobs-university.de +# RFC7408 || E. Haleplidis || ehalep@ece.upatras.gr +# RFC7409 || E. Haleplidis, J. Halpern || ehalep@ece.upatras.gr, joel.halpern@ericsson.com +# RFC7410 || M. Kucherawy || superuser@gmail.com +# RFC7411 || T. Schmidt, Ed., M. Waehlisch, R. Koodli, G. Fairhurst, D. Liu || t.schmidt@haw-hamburg.de, mw@link-lab.net, rajeev.koodli@intel.com, gorry@erg.abdn.ac.uk, liudapeng@chinamobile.com +# RFC7412 || Y. Weingarten, S. Aldrin, P. Pan, J. Ryoo, G. Mirsky || wyaacov@gmail.com, aldrin.ietf@gmail.com, ppan@infinera.com, ryoo@etri.re.kr, gregory.mirsky@ericsson.com +# RFC7413 || Y. Cheng, J. Chu, S. Radhakrishnan, A. Jain || ycheng@google.com, hkchu@google.com, sivasankar@cs.ucsd.edu, arvind@google.com +# RFC7414 || M. Duke, R. Braden, W. Eddy, E. Blanton, A. Zimmermann || m.duke@f5.com, braden@isi.edu, wes@mti-systems.com, elb@interruptsciences.com, alexander.zimmermann@netapp.com +# RFC7415 || E. Noel, P. Williams || ecnoel@att.com, phil.m.williams@bt.com +# RFC7416 || T. Tsao, R. Alexander, M. Dohler, V. Daza, A. Lozano, M. Richardson, Ed. || tzetatsao@eaton.com, rogeralexander@eaton.com, mischa.dohler@kcl.ac.uk, vanesa.daza@upf.edu, angel.lozano@upf.edu, mcr+ietf@sandelman.ca +# RFC7417 || G. Karagiannis, A. Bhargava || georgios.karagiannis@huawei.com, anuragb@cisco.com +# RFC7418 || S. Dawkins, Ed. || spencerdawkins.ietf@gmail.com +# RFC7419 || N. Akiya, M. Binderberger, G. Mirsky || nobo@cisco.com, mbinderb@cisco.com, gregory.mirsky@ericsson.com +# RFC7420 || A. Koushik, E. Stephan, Q. Zhao, D. King, J. Hardwick || kkoushik@brocade.com, emile.stephan@orange.com, qzhao@huawei.com, daniel@olddog.co.uk, jonathan.hardwick@metaswitch.com +# RFC7421 || B. Carpenter, Ed., T. Chown, F. Gont, S. Jiang, A. Petrescu, A. Yourtchenko || brian.e.carpenter@gmail.com, tjc@ecs.soton.ac.uk, fgont@si6networks.com, jiangsheng@huawei.com, alexandru.petrescu@cea.fr, ayourtch@cisco.com +# RFC7422 || C. Donley, C. Grundemann, V. Sarawat, K. Sundaresan, O. Vautrin || c.donley@cablelabs.com, cgrundemann@gmail.com, v.sarawat@cablelabs.com, k.sundaresan@cablelabs.com, Olivier@juniper.net +# RFC7423 || L. Morand, Ed., V. Fajardo, H. Tschofenig || lionel.morand@orange.com, vf0213@gmail.com, Hannes.Tschofenig@gmx.net +# RFC7424 || R. Krishnan, L. Yong, A. Ghanwani, N. So, B. Khasnabish || ramkri123@gmail.com, lucy.yong@huawei.com, anoop@alumni.duke.edu, ningso@yahoo.com, vumip1@gmail.com +# RFC7425 || M. Thornburgh || mthornbu@adobe.com +# RFC7426 || E. Haleplidis, Ed., K. Pentikousis, Ed., S. Denazis, J. Hadi Salim, D. Meyer, O. Koufopavlou || ehalep@ece.upatras.gr, k.pentikousis@eict.de, sdena@upatras.gr, hadi@mojatatu.com, dmm@1-4-5.net, odysseas@ece.upatras.gr +# RFC7427 || T. Kivinen, J. Snyder || kivinen@iki.fi, jms@opus1.com +# RFC7428 || A. Brandt, J. Buron || anders_brandt@sigmadesigns.com, jakob_buron@sigmadesigns.com +# RFC7429 || D. Liu, Ed., JC. Zuniga, Ed., P. Seite, H. Chan, CJ. Bernardos || liudapeng@chinamobile.com, JuanCarlos.Zuniga@InterDigital.com, pierrick.seite@orange.com, h.a.chan@ieee.org, cjbc@it.uc3m.es +# RFC7430 || M. Bagnulo, C. Paasch, F. Gont, O. Bonaventure, C. Raiciu || marcelo@it.uc3m.es, christoph.paasch@gmail.com, fgont@si6networks.com, Olivier.Bonaventure@uclouvain.be, costin.raiciu@cs.pub.ro +# RFC7431 || A. Karan, C. Filsfils, IJ. Wijnands, Ed., B. Decraene || apoorva@cisco.com, cfilsfil@cisco.com, ice@cisco.com, bruno.decraene@orange.com +# RFC7432 || A. Sajassi, Ed., R. Aggarwal, N. Bitar, A. Isaac, J. Uttaro, J. Drake, W. Henderickx || sajassi@cisco.com, raggarwa_1@yahoo.com, nabil.n.bitar@verizon.com, aisaac71@bloomberg.net, uttaro@att.com, jdrake@juniper.net, wim.henderickx@alcatel-lucent.com +# RFC7433 || A. Johnston, J. Rafferty || alan.b.johnston@gmail.com, jay@humancomm.com +# RFC7434 || K. Drage, Ed., A. Johnston || keith.drage@alcatel-lucent.com, alan.b.johnston@gmail.com +# RFC7435 || V. Dukhovni || ietf-dane@dukhovni.org +# RFC7436 || H. Shah, E. Rosen, F. Le Faucheur, G. Heron || hshah@ciena.com, erosen@juniper.net, flefauch@cisco.com, giheron@cisco.com +# RFC7437 || M. Kucherawy, Ed. || superuser@gmail.com +# RFC7438 || IJ. Wijnands, Ed., E. Rosen, A. Gulko, U. Joorde, J. Tantsura || ice@cisco.com, erosen@juniper.net, arkadiy.gulko@thomsonreuters.com, uwe.joorde@telekom.de, jeff.tantsura@ericsson.com +# RFC7439 || W. George, Ed., C. Pignataro, Ed. || wesley.george@twcable.com, cpignata@cisco.com +# RFC7440 || P. Masotta || patrick.masotta.ietf@vercot.com +# RFC7441 || IJ. Wijnands, E. Rosen, U. Joorde || ice@cisco.com, erosen@juniper.net, uwe.joorde@telekom.de +# RFC7442 || Y. Rekhter, R. Aggarwal, N. Leymann, W. Henderickx, Q. Zhao, R. Li || yakov@juniper.net, raggarwa_1@yahoo.com, N.Leymann@telekom.de, wim.henderickx@alcatel-lucent.com, quintin.zhao@huawei.com, renwei.li@huawei.com +# RFC7443 || P. Patil, T. Reddy, G. Salgueiro, M. Petit-Huguenin || praspati@cisco.com, tireddy@cisco.com, gsalguei@cisco.com, marc@petit-huguenin.org +# RFC7444 || K. Zeilenga, A. Melnikov || kurt.zeilenga@isode.com, alexey.melnikov@isode.com +# RFC7445 || G. Chen, H. Deng, D. Michaud, J. Korhonen, M. Boucadair || phdgang@gmail.com, denghui@chinamobile.com, dave.michaud@rci.rogers.com, jouni.nospam@gmail.com, mohamed.boucadair@orange.com +# RFC7446 || Y. Lee, Ed., G. Bernstein, Ed., D. Li, W. Imajuku || leeyoung@huawei.com, gregb@grotto-networking.com, danli@huawei.com, imajuku.wataru@lab.ntt.co.jp +# RFC7447 || J. Scudder, K. Kompella || jgs@juniper.net, kireeti@juniper.net +# RFC7448 || T. Taylor, Ed., D. Romascanu || tom.taylor.stds@gmail.com, dromasca@gmail.com +# RFC7449 || Y. Lee, Ed., G. Bernstein, Ed., J. Martensson, T. Takeda, T. Tsuritani, O. Gonzalez de Dios || leeyoung@huawei.com, gregb@grotto-networking.com, jonas.martensson@acreo.se, tomonori.takeda@ntt.com, tsuri@kddilabs.jp, oscar.gonzalezdedios@telefonica.com +# RFC7450 || G. Bumgardner || gbumgard@gmail.com +# RFC7451 || S. Hollenbeck || shollenbeck@verisign.com +# RFC7452 || H. Tschofenig, J. Arkko, D. Thaler, D. McPherson || Hannes.Tschofenig@gmx.net, jari.arkko@piuha.net, dthaler@microsoft.com, dmcpherson@verisign.com +# RFC7453 || V. Mahalingam, K. Sampath, S. Aldrin, T. Nadeau || venkat.mahalingams@gmail.com, kannankvs@gmail.com, aldrin.ietf@gmail.com, tnadeau@lucidvision.com +# RFC7454 || J. Durand, I. Pepelnjak, G. Doering || jerduran@cisco.com, ip@ipspace.net, gert@space.net +# RFC7455 || T. Senevirathne, N. Finn, S. Salam, D. Kumar, D. Eastlake 3rd, S. Aldrin, Y. Li || tsenevir@cisco.com, nfinn@cisco.com, ssalam@cisco.com, dekumar@cisco.com, d3e3e3@gmail.com, aldrin.ietf@gmail.com, liyizhou@huawei.com +# RFC7456 || T. Mizrahi, T. Senevirathne, S. Salam, D. Kumar, D. Eastlake 3rd || talmi@marvell.com, tsenevir@cisco.com, ssalam@cisco.com, dekumar@cisco.com, d3e3e3@gmail.com +# RFC7457 || Y. Sheffer, R. Holz, P. Saint-Andre || yaronf.ietf@gmail.com, holz@net.in.tum.de, peter@andyet.com +# RFC7458 || R. Valmikam, R. Koodli || valmikam@gmail.com, rajeev.koodli@intel.com +# RFC7459 || M. Thomson, J. Winterbottom || martin.thomson@gmail.com, a.james.winterbottom@gmail.com +# RFC7460 || M. Chandramouli, B. Claise, B. Schoening, J. Quittek, T. Dietz || moulchan@cisco.com, bclaise@cisco.com, brad.schoening@verizon.net, quittek@neclab.eu, Thomas.Dietz@neclab.eu +# RFC7461 || J. Parello, B. Claise, M. Chandramouli || jparello@cisco.com, bclaise@cisco.com, moulchan@cisco.com +# RFC7462 || L. Liess, Ed., R. Jesske, A. Johnston, D. Worley, P. Kyzivat || laura.liess.dt@gmail.com, r.jesske@telekom.de, alan.b.johnston@gmail.com, worley@ariadne.com, pkyzivat@alum.mit.edu +# RFC7463 || A. Johnston, Ed., M. Soroushnejad, Ed., V. Venkataramanan || alan.b.johnston@gmail.com, msoroush@gmail.com, vvenkatar@gmail.com +# RFC7464 || N. Williams || nico@cryptonector.com +# RFC7465 || A. Popov || andreipo@microsoft.com +# RFC7466 || C. Dearlove, T. Clausen || chris.dearlove@baesystems.com, T.Clausen@computer.org +# RFC7467 || A. Murdock || Aidan.murdock@ncia.nato.int +# RFC7468 || S. Josefsson, S. Leonard || simon@josefsson.org, dev+ietf@seantek.com +# RFC7469 || C. Evans, C. Palmer, R. Sleevi || cevans@google.com, palmer@google.com, sleevi@google.com +# RFC7470 || F. Zhang, A. Farrel || zhangfatai@huawei.com, adrian@olddog.co.uk +# RFC7471 || S. Giacalone, D. Ward, J. Drake, A. Atlas, S. Previdi || spencer.giacalone@gmail.com, dward@cisco.com, jdrake@juniper.net, akatlas@juniper.net, sprevidi@cisco.com +# RFC7472 || I. McDonald, M. Sweet || blueroofmusic@gmail.com, msweet@apple.com +# RFC7473 || K. Raza, S. Boutros || skraza@cisco.com, sboutros@cisco.com +# RFC7474 || M. Bhatia, S. Hartman, D. Zhang, A. Lindem, Ed. || manav@ionosnetworks.com, hartmans-ietf@mit.edu, dacheng.zhang@gmail.com, acee@cisco.com +# RFC7475 || S. Dawkins || spencerdawkins.ietf@gmail.com +# RFC7476 || K. Pentikousis, Ed., B. Ohlman, D. Corujo, G. Boggia, G. Tyson, E. Davies, A. Molinaro, S. Eum || k.pentikousis@eict.de, Borje.Ohlman@ericsson.com, dcorujo@av.it.pt, g.boggia@poliba.it, gareth.tyson@eecs.qmul.ac.uk, davieseb@scss.tcd.ie, antonella.molinaro@unirc.it, suyong@nict.go.jp +# RFC7477 || W. Hardaker || ietf@hardakers.net +# RFC7478 || C. Holmberg, S. Hakansson, G. Eriksson || christer.holmberg@ericsson.com, stefan.lk.hakansson@ericsson.com, goran.ap.eriksson@ericsson.com +# RFC7479 || S. Moonesamy || sm+ietf@elandsys.com +# RFC7480 || A. Newton, B. Ellacott, N. Kong || andy@arin.net, bje@apnic.net, nkong@cnnic.cn +# RFC7481 || S. Hollenbeck, N. Kong || shollenbeck@verisign.com, nkong@cnnic.cn +# RFC7482 || A. Newton, S. Hollenbeck || andy@arin.net, shollenbeck@verisign.com +# RFC7483 || A. Newton, S. Hollenbeck || andy@arin.net, shollenbeck@verisign.com +# RFC7484 || M. Blanchet || Marc.Blanchet@viagenie.ca +# RFC7485 || L. Zhou, N. Kong, S. Shen, S. Sheng, A. Servin || zhoulinlin@cnnic.cn, nkong@cnnic.cn, shenshuo@cnnic.cn, steve.sheng@icann.org, arturo.servin@gmail.com +# RFC7486 || S. Farrell, P. Hoffman, M. Thomas || stephen.farrell@cs.tcd.ie, paul.hoffman@vpnc.org, mike@phresheez.com +# RFC7487 || E. Bellagamba, A. Takacs, G. Mirsky, L. Andersson, P. Skoldstrom, D. Ward || elisa.bellagamba@ericsson.com, attila.takacs@ericsson.com, gregory.mirsky@ericsson.com, loa@mail01.huawei.com, pontus.skoldstrom@acreo.se, dward@cisco.com +# RFC7488 || M. Boucadair, R. Penno, D. Wing, P. Patil, T. Reddy || mohamed.boucadair@orange.com, repenno@cisco.com, dwing-ietf@fuggles.com, praspati@cisco.com, tireddy@cisco.com +# RFC7489 || M. Kucherawy, Ed., E. Zwicky, Ed. || superuser@gmail.com, zwicky@yahoo-inc.com +# RFC7490 || S. Bryant, C. Filsfils, S. Previdi, M. Shand, N. So || stbryant@cisco.com, cfilsfil@cisco.com, sprevidi@cisco.com, imc.shand@gmail.com, ningso@vinci-systems.com +# RFC7491 || D. King, A. Farrel || daniel@olddog.co.uk, adrian@olddog.co.uk +# RFC7492 || M. Bhatia, D. Zhang, M. Jethanandani || manav@ionosnetworks.com, dacheng.zhang@gmail.com, mjethanandani@gmail.com +# RFC7493 || T. Bray, Ed. || tbray@textuality.com +# RFC7494 || C. Shao, H. Deng, R. Pazhyannur, F. Bari, R. Zhang, S. Matsushima || shaochunju@chinamobile.com, denghui@chinamobile.com, rpazhyan@cisco.com, farooq.bari@att.com, zhangr@gsta.com, satoru.matsushima@g.softbank.co.jp +# RFC7495 || A. Montville, D. Black || adam.w.montville@gmail.com, david.black@emc.com +# RFC7496 || M. Tuexen, R. Seggelmann, R. Stewart, S. Loreto || tuexen@fh-muenster.de, rfc@robin-seggelmann.com, randall@lakerest.net, Salvatore.Loreto@ericsson.com +# RFC7497 || A. Morton || acmorton@att.com +# RFC7498 || P. Quinn, Ed., T. Nadeau, Ed. || paulq@cisco.com, tnadeau@lucidvision.com +# RFC7499 || A. Perez-Mendez, Ed., R. Marin-Lopez, F. Pereniguez-Garcia, G. Lopez-Millan, D. Lopez, A. DeKok || alex@um.es, rafa@um.es, pereniguez@um.es, gabilm@um.es, diego@tid.es, aland@networkradius.com +# RFC7500 || R. Housley, Ed., O. Kolkman, Ed. || housley@vigilsec.com, kolkman@isoc.org +# RFC7501 || C. Davids, V. Gurbani, S. Poretsky || davids@iit.edu, vkg@bell-labs.com, sporetsky@allot.com +# RFC7502 || C. Davids, V. Gurbani, S. Poretsky || davids@iit.edu, vkg@bell-labs.com, sporetsky@allot.com +# RFC7503 || A. Lindem, J. Arkko || acee@cisco.com, jari.arkko@piuha.net +# RFC7504 || J. Klensin || john-ietf@jck.com +# RFC7505 || J. Levine, M. Delany || standards@taugh.com, mx0dot@yahoo.com +# RFC7506 || K. Raza, N. Akiya, C. Pignataro || skraza@cisco.com, nobo.akiya.dev@gmail.com, cpignata@cisco.com +# RFC7507 || B. Moeller, A. Langley || bmoeller@acm.org, agl@google.com +# RFC7508 || L. Cailleux, C. Bonatti || laurent.cailleux@intradef.gouv.fr, bonatti252@ieca.com +# RFC7509 || R. Huang, V. Singh || rachel.huang@huawei.com, varun@comnet.tkk.fi +# RFC7510 || X. Xu, N. Sheth, L. Yong, R. Callon, D. Black || xuxiaohu@huawei.com, nsheth@juniper.net, lucy.yong@huawei.com, rcallon@juniper.net, david.black@emc.com +# RFC7511 || M. Wilhelm || max@rfc2324.org +# RFC7512 || J. Pechanec, D. Moffat || Jan.Pechanec@Oracle.COM, Darren.Moffat@Oracle.COM +# RFC7513 || J. Bi, J. Wu, G. Yao, F. Baker || junbi@tsinghua.edu.cn, jianping@cernet.edu.cn, yaoguang@cernet.edu.cn, fred@cisco.com +# RFC7514 || M. Luckie || mjl@caida.org +# RFC7515 || M. Jones, J. Bradley, N. Sakimura || mbj@microsoft.com, ve7jtb@ve7jtb.com, n-sakimura@nri.co.jp +# RFC7516 || M. Jones, J. Hildebrand || mbj@microsoft.com, jhildebr@cisco.com +# RFC7517 || M. Jones || mbj@microsoft.com +# RFC7518 || M. Jones || mbj@microsoft.com +# RFC7519 || M. Jones, J. Bradley, N. Sakimura || mbj@microsoft.com, ve7jtb@ve7jtb.com, n-sakimura@nri.co.jp +# RFC7520 || M. Miller || mamille2@cisco.com +# RFC7521 || B. Campbell, C. Mortimore, M. Jones, Y. Goland || brian.d.campbell@gmail.com, cmortimore@salesforce.com, mbj@microsoft.com, yarong@microsoft.com +# RFC7522 || B. Campbell, C. Mortimore, M. Jones || brian.d.campbell@gmail.com, cmortimore@salesforce.com, mbj@microsoft.com +# RFC7523 || M. Jones, B. Campbell, C. Mortimore || mbj@microsoft.com, brian.d.campbell@gmail.com, cmortimore@salesforce.com +# RFC7524 || Y. Rekhter, E. Rosen, R. Aggarwal, T. Morin, I. Grosclaude, N. Leymann, S. Saad || yakov@juniper.net, erosen@juniper.net, raggarwa_1@yahoo.com, thomas.morin@orange.com, irene.grosclaude@orange.com, n.leymann@telekom.de, samirsaad1@outlook.com +# RFC7525 || Y. Sheffer, R. Holz, P. Saint-Andre || yaronf.ietf@gmail.com, ralph.ietf@gmail.com, peter@andyet.com +# RFC7526 || O. Troan, B. Carpenter, Ed. || ot@cisco.com, brian.e.carpenter@gmail.com +# RFC7527 || R. Asati, H. Singh, W. Beebee, C. Pignataro, E. Dart, W. George || rajiva@cisco.com, shemant@cisco.com, wbeebee@cisco.com, cpignata@cisco.com, dart@es.net, wesley.george@twcable.com +# RFC7528 || P. Higgs, J. Piesing || paul.higgs@ericsson.com, jon.piesing@tpvision.com +# RFC7529 || C. Daboo, G. Yakushev || cyrus@daboo.name, gyakushev@yahoo.com +# RFC7530 || T. Haynes, Ed., D. Noveck, Ed. || thomas.haynes@primarydata.com, dave_noveck@dell.com +# RFC7531 || T. Haynes, Ed., D. Noveck, Ed. || thomas.haynes@primarydata.com, dave_noveck@dell.com +# RFC7532 || J. Lentini, R. Tewari, C. Lever, Ed. || jlentini@netapp.com, tewarir@us.ibm.com, chuck.lever@oracle.com +# RFC7533 || J. Lentini, R. Tewari, C. Lever, Ed. || jlentini@netapp.com, tewarir@us.ibm.com, chuck.lever@oracle.com +# RFC7534 || J. Abley, W. Sotomayor || jabley@dyn.com, wfms@ottix.net +# RFC7535 || J. Abley, B. Dickson, W. Kumari, G. Michaelson || jabley@dyn.com, bdickson@twitter.com, warren@kumari.net, ggm@apnic.net +# RFC7536 || M. Linsner, P. Eardley, T. Burbridge, F. Sorensen || mlinsner@cisco.com, philip.eardley@bt.com, trevor.burbridge@bt.com, frode.sorensen@nkom.no +# RFC7537 || B. Decraene, N. Akiya, C. Pignataro, L. Andersson, S. Aldrin || bruno.decraene@orange.com, nobo.akiya.dev@gmail.com, cpignata@cisco.com, loa@mail01.huawei.com, aldrin.ietf@gmail.com +# RFC7538 || J. Reschke || julian.reschke@greenbytes.de +# RFC7539 || Y. Nir, A. Langley || ynir.ietf@gmail.com, agl@google.com +# RFC7540 || M. Belshe, R. Peon, M. Thomson, Ed. || mike@belshe.com, fenix@google.com, martin.thomson@gmail.com +# RFC7541 || R. Peon, H. Ruellan || fenix@google.com, herve.ruellan@crf.canon.fr +# RFC7542 || A. DeKok || aland@freeradius.org +# RFC7543 || H. Jeng, L. Jalil, R. Bonica, K. Patel, L. Yong || hj2387@att.com, luay.jalil@verizon.com, rbonica@juniper.net, keyupate@cisco.com, lucy.yong@huawei.com +# RFC7544 || M. Mohali || marianne.mohali@orange.com +# RFC7545 || V. Chen, Ed., S. Das, L. Zhu, J. Malyar, P. McCann || vchen@google.com, sdas@appcomsci.com, lei.zhu@huawei.com, jmalyar@iconectiv.com, peter.mccann@huawei.com +# RFC7546 || B. Kaduk || kaduk@mit.edu +# RFC7547 || M. Ersue, Ed., D. Romascanu, J. Schoenwaelder, U. Herberg || mehmet.ersue@nsn.com, dromasca@gmail.com , j.schoenwaelder@jacobs-university.de, ulrich@herberg.name +# RFC7548 || M. Ersue, Ed., D. Romascanu, J. Schoenwaelder, A. Sehgal || mehmet.ersue@nsn.com, dromasca@gmail.com , j.schoenwaelder@jacobs-university.de, s.anuj@jacobs-university.de +# RFC7549 || C. Holmberg, J. Holm, R. Jesske, M. Dolly || christer.holmberg@ericsson.com, jan.holm@ericsson.com, r.jesske@telekom.de, md3135@att.com +# RFC7550 || O. Troan, B. Volz, M. Siodelski || ot@cisco.com, volz@cisco.com, msiodelski@gmail.com +# RFC7551 || F. Zhang, Ed., R. Jing, R. Gandhi, Ed. || zhangfei7@huawei.com, jingrq@ctbri.com.cn, rgandhi@cisco.com +# RFC7552 || R. Asati, C. Pignataro, K. Raza, V. Manral, R. Papneja || rajiva@cisco.com, cpignata@cisco.com, skraza@cisco.com, vishwas@ionosnetworks.com, rajiv.papneja@huawei.com +# RFC7553 || P. Faltstrom, O. Kolkman || paf@netnod.se, kolkman@isoc.org +# RFC7554 || T. Watteyne, Ed., M. Palattella, L. Grieco || twatteyne@linear.com, maria-rita.palattella@uni.lu, a.grieco@poliba.it +# RFC7555 || G. Swallow, V. Lim, S. Aldrin || swallow@cisco.com, vlim@cisco.com, aldrin.ietf@gmail.com +# RFC7556 || D. Anipko, Ed. || dmitry.anipko@gmail.com +# RFC7557 || J. Chroboczek || jch@pps.univ-paris-diderot.fr +# RFC7558 || K. Lynn, S. Cheshire, M. Blanchet, D. Migault || kerry.lynn@verizon.com, cheshire@apple.com, Marc.Blanchet@viagenie.ca, daniel.migault@ericsson.com +# RFC7559 || S. Krishnan, D. Anipko, D. Thaler || suresh.krishnan@ericsson.com, dmitry.anipko@gmail.com, dthaler@microsoft.com +# RFC7560 || M. Kuehlewind, Ed., R. Scheffenegger, B. Briscoe || mirja.kuehlewind@tik.ee.ethz.ch, rs@netapp.com, ietf@bobbriscoe.net +# RFC7561 || J. Kaippallimalil, R. Pazhyannur, P. Yegani || john.kaippallimalil@huawei.com, rpazhyan@cisco.com, pyegani@juniper.net +# RFC7562 || D. Thakore || d.thakore@cablelabs.com +# RFC7563 || R. Pazhyannur, S. Speicher, S. Gundavelli, J. Korhonen, J. Kaippallimalil || rpazhyan@cisco.com, sespeich@cisco.com, sgundave@cisco.com, jouni.nospam@gmail.com, john.kaippallimalil@huawei.com +# RFC7564 || P. Saint-Andre, M. Blanchet || peter@andyet.com, Marc.Blanchet@viagenie.ca +# RFC7565 || P. Saint-Andre || peter@andyet.com +# RFC7566 || L. Goix, K. Li || laurent.goix@econocom-osiatis.com, kepeng.likp@gmail.com +# RFC7567 || F. Baker, Ed., G. Fairhurst, Ed. || fred@cisco.com, gorry@erg.abdn.ac.uk +# RFC7568 || R. Barnes, M. Thomson, A. Pironti, A. Langley || rlb@ipv.sx, martin.thomson@gmail.com, alfredo@pironti.eu, agl@google.com +# RFC7569 || D. Quigley, J. Lu, T. Haynes || dpquigl@davequigley.com, Jarrett.Lu@oracle.com, thomas.haynes@primarydata.com +# RFC7570 || C. Margaria, Ed., G. Martinelli, S. Balls, B. Wright || cmargaria@juniper.net, giomarti@cisco.com, steve.balls@metaswitch.com, ben.wright@metaswitch.com +# RFC7571 || J. Dong, M. Chen, Z. Li, D. Ceccarelli || jie.dong@huawei.com, mach.chen@huawei.com, lizhenqiang@chinamobile.com, daniele.ceccarelli@ericsson.com +# RFC7572 || P. Saint-Andre, A. Houri, J. Hildebrand || peter@andyet.com, avshalom@il.ibm.com, jhildebr@cisco.com +# RFC7573 || P. Saint-Andre, S. Loreto || peter@andyet.com, Salvatore.Loreto@ericsson.com +# RFC7574 || A. Bakker, R. Petrocco, V. Grishchenko || arno@cs.vu.nl, r.petrocco@gmail.com, victor.grishchenko@gmail.com +# RFC7575 || M. Behringer, M. Pritikin, S. Bjarnason, A. Clemm, B. Carpenter, S. Jiang, L. Ciavaglia || mbehring@cisco.com, pritikin@cisco.com, sbjarnas@cisco.com, alex@cisco.com, brian.e.carpenter@gmail.com, jiangsheng@huawei.com, Laurent.Ciavaglia@alcatel-lucent.com +# RFC7576 || S. Jiang, B. Carpenter, M. Behringer || jiangsheng@huawei.com, brian.e.carpenter@gmail.com, mbehring@cisco.com +# RFC7577 || J. Quittek, R. Winter, T. Dietz || quittek@neclab.eu, rolf.winter@neclab.eu, Thomas.Dietz@neclab.eu +# RFC7578 || L. Masinter || masinter@adobe.com +# RFC7579 || G. Bernstein, Ed., Y. Lee, Ed., D. Li, W. Imajuku, J. Han || gregb@grotto-networking.com, ylee@huawei.com, danli@huawei.com, imajuku.wataru@lab.ntt.co.jp, hanjianrui@huawei.com +# RFC7580 || F. Zhang, Y. Lee, J. Han, G. Bernstein, Y. Xu || zhangfatai@huawei.com, leeyoung@huawei.com, hanjianrui@huawei.com, gregb@grotto-networking.com, xuyunbin@mail.ritt.com.cn +# RFC7581 || G. Bernstein, Ed., Y. Lee, Ed., D. Li, W. Imajuku, J. Han || gregb@grotto-networking.com, leeyoung@huawei.com, danli@huawei.com, imajuku.wataru@lab.ntt.co.jp, hanjianrui@huawei.com +# RFC7582 || E. Rosen, IJ. Wijnands, Y. Cai, A. Boers || erosen@juniper.net, ice@cisco.com, yiqunc@microsoft.com, arjen@boers.com +# RFC7583 || S. Morris, J. Ihren, J. Dickinson, W. Mekking || stephen@isc.org, johani@netnod.se, jad@sinodun.com, mmekking@dyn.com +# RFC7584 || R. Ravindranath, T. Reddy, G. Salgueiro || rmohanr@cisco.com, tireddy@cisco.com, gsalguei@cisco.com +# RFC7585 || S. Winter, M. McCauley || stefan.winter@restena.lu, mikem@airspayce.com +# RFC7586 || Y. Nachum, L. Dunbar, I. Yerushalmi, T. Mizrahi || youval.nachum@gmail.com, ldunbar@huawei.com, yilan@marvell.com, talmi@marvell.com +# RFC7587 || J. Spittka, K. Vos, JM. Valin || jspittka@gmail.com, koenvos74@gmail.com, jmvalin@jmvalin.ca +# RFC7588 || R. Bonica, C. Pignataro, J. Touch || rbonica@juniper.net, cpignata@cisco.com, touch@isi.edu +# RFC7589 || M. Badra, A. Luchuk, J. Schoenwaelder || mohamad.badra@zu.ac.ae, luchuk@snmp.com, j.schoenwaelder@jacobs-university.de +# RFC7590 || P. Saint-Andre, T. Alkemade || peter@andyet.com, me@thijsalkema.de +# RFC7591 || J. Richer, Ed., M. Jones, J. Bradley, M. Machulak, P. Hunt || ietf@justin.richer.org, mbj@microsoft.com, ve7jtb@ve7jtb.com, maciej.machulak@gmail.com, phil.hunt@yahoo.com +# RFC7592 || J. Richer, Ed., M. Jones, J. Bradley, M. Machulak || ietf@justin.richer.org, mbj@microsoft.com, ve7jtb@ve7jtb.com, maciej.machulak@gmail.com +# RFC7593 || K. Wierenga, S. Winter, T. Wolniewicz || klaas@cisco.com, stefan.winter@restena.lu, twoln@umk.pl +# RFC7594 || P. Eardley, A. Morton, M. Bagnulo, T. Burbridge, P. Aitken, A. Akhter || philip.eardley@bt.com, acmorton@att.com, marcelo@it.uc3m.es, trevor.burbridge@bt.com, paitken@brocade.com, aakhter@gmail.com +# RFC7595 || D. Thaler, Ed., T. Hansen, T. Hardie || dthaler@microsoft.com, tony+urireg@maillennium.att.com, ted.ietf@gmail.com +# RFC7596 || Y. Cui, Q. Sun, M. Boucadair, T. Tsou, Y. Lee, I. Farrer || yong@csnet1.cs.tsinghua.edu.cn, sunqiong@ctbri.com.cn, mohamed.boucadair@orange.com, tena@huawei.com, yiu_lee@cable.comcast.com, ian.farrer@telekom.de +# RFC7597 || O. Troan, Ed., W. Dec, X. Li, C. Bao, S. Matsushima, T. Murakami, T. Taylor, Ed. || ot@cisco.com, wdec@cisco.com, xing@cernet.edu.cn, congxiao@cernet.edu.cn, satoru.matsushima@g.softbank.co.jp, tetsuya@ipinfusion.com, tom.taylor.stds@gmail.com +# RFC7598 || T. Mrugalski, O. Troan, I. Farrer, S. Perreault, W. Dec, C. Bao, L. Yeh, X. Deng || tomasz.mrugalski@gmail.com, ot@cisco.com, ian.farrer@telekom.de, sperreault@jive.com, wdec@cisco.com, congxiao@cernet.edu.cn, leaf.y.yeh@hotmail.com, dxhbupt@gmail.com +# RFC7599 || X. Li, C. Bao, W. Dec, Ed., O. Troan, S. Matsushima, T. Murakami || xing@cernet.edu.cn, congxiao@cernet.edu.cn, wdec@cisco.com, ot@cisco.com, satoru.matsushima@g.softbank.co.jp, tetsuya@ipinfusion.com +# RFC7600 || R. Despres, S. Jiang, Ed., R. Penno, Y. Lee, G. Chen, M. Chen || despres.remi@laposte.net, jiangsheng@huawei.com, repenno@cisco.com, yiu_lee@cable.comcast.com, phdgang@gmail.com, maoke@bbix.net +# RFC7601 || M. Kucherawy || superuser@gmail.com +# RFC7602 || U. Chunduri, W. Lu, A. Tian, N. Shen || uma.chunduri@ericsson.com, wenhu.lu@ericsson.com, albert.tian@ericsson.com, naiming@cisco.com +# RFC7603 || B. Schoening, M. Chandramouli, B. Nordman || brad.schoening@verizon.net, moulchan@cisco.com, bnordman@lbl.gov +# RFC7604 || M. Westerlund, T. Zeng || magnus.westerlund@ericsson.com, thomas.zeng@gmail.com +# RFC7605 || J. Touch || touch@isi.edu +# RFC7606 || E. Chen, Ed., J. Scudder, Ed., P. Mohapatra, K. Patel || enkechen@cisco.com, jgs@juniper.net, mpradosh@yahoo.com, keyupate@cisco.com +# RFC7607 || W. Kumari, R. Bush, H. Schiller, K. Patel || warren@kumari.net, randy@psg.com, has@google.com, keyupate@cisco.com +# RFC7608 || M. Boucadair, A. Petrescu, F. Baker || mohamed.boucadair@orange.com, alexandre.petrescu@cea.fr, fred@cisco.com +# RFC7609 || M. Fox, C. Kassimis, J. Stevens || mjfox@us.ibm.com, kassimis@us.ibm.com, sjerry@us.ibm.com +# RFC7610 || F. Gont, W. Liu, G. Van de Velde || fgont@si6networks.com, liushucheng@huawei.com, gunter.van_de_velde@alcatel-lucent.com +# RFC7611 || J. Uttaro, P. Mohapatra, D. Smith, R. Raszuk, J. Scudder || uttaro@att.com, mpradosh@yahoo.com, djsmith@cisco.com, robert@raszuk.net, jgs@juniper.net +# RFC7612 || P. Fleming, I. McDonald || patfleminghtc@gmail.com, blueroofmusic@gmail.com +# RFC7613 || P. Saint-Andre, A. Melnikov || peter@andyet.com, alexey.melnikov@isode.com +# RFC7614 || R. Sparks || rjsparks@nostrum.com +# RFC7615 || J. Reschke || julian.reschke@greenbytes.de +# RFC7616 || R. Shekh-Yusef, Ed., D. Ahrens, S. Bremer || rifaat.ietf@gmail.com, ahrensdc@gmail.com, sophie.bremer@netzkonform.de +# RFC7617 || J. Reschke || julian.reschke@greenbytes.de +# RFC7618 || Y. Cui, Q. Sun, I. Farrer, Y. Lee, Q. Sun, M. Boucadair || yong@csnet1.cs.tsinghua.edu.cn, sunqi.ietf@gmail.com, ian.farrer@telekom.de, yiu_lee@cable.comcast.com, sunqiong@ctbri.com.cn, mohamed.boucadair@orange.com +# RFC7619 || V. Smyslov, P. Wouters || svan@elvis.ru, pwouters@redhat.com +# RFC7620 || M. Boucadair, Ed., B. Chatras, T. Reddy, B. Williams, B. Sarikaya || mohamed.boucadair@orange.com, bruno.chatras@orange.com, tireddy@cisco.com, brandon.williams@akamai.com, sarikaya@ieee.org +# RFC7621 || A.B. Roach || adam@nostrum.com +# RFC7622 || P. Saint-Andre || peter@andyet.com +# RFC7623 || A. Sajassi, Ed., S. Salam, N. Bitar, A. Isaac, W. Henderickx || sajassi@cisco.com, ssalam@cisco.com, nabil.n.bitar@verizon.com, aisaac@juniper.net, wim.henderickx@alcatel-lucent.com +# RFC7624 || R. Barnes, B. Schneier, C. Jennings, T. Hardie, B. Trammell, C. Huitema, D. Borkmann || rlb@ipv.sx, schneier@schneier.com, fluffy@cisco.com, ted.ietf@gmail.com, ietf@trammell.ch, huitema@huitema.net, daniel@iogearbox.net +# RFC7625 || J. T. Hao, P. Maheshwari, R. Huang, L. Andersson, M. Chen || haojiangtao@huawei.com, praveen.maheshwari@in.airtel.com, river.huang@huawei.com, loa@mail01.huawei.com, mach.chen@huawei.com +# RFC7626 || S. Bortzmeyer || bortzmeyer+ietf@nic.fr +# RFC7627 || K. Bhargavan, Ed., A. Delignat-Lavaud, A. Pironti, A. Langley, M. Ray || karthikeyan.bhargavan@inria.fr, antoine.delignat-lavaud@inria.fr, alfredo.pironti@inria.fr, agl@google.com, maray@microsoft.com +# RFC7628 || W. Mills, T. Showalter, H. Tschofenig || wmills_92105@yahoo.com, tjs@psaux.com, Hannes.Tschofenig@gmx.net +# RFC7629 || S. Gundavelli, Ed., K. Leung, G. Tsirtsis, A. Petrescu || sgundave@cisco.com, kleung@cisco.com, tsirtsis@qualcomm.com, alexandru.petrescu@cea.fr +# RFC7630 || J. Merkle, Ed., M. Lochter || johannes.merkle@secunet.com, manfred.lochter@bsi.bund.de +# RFC7631 || C. Dearlove, T. Clausen || chris.dearlove@baesystems.com, T.Clausen@computer.org +# RFC7632 || D. Waltermire, D. Harrington || david.waltermire@nist.gov, ietfdbh@gmail.com +# RFC7633 || P. Hallam-Baker || philliph@comodo.com +# RFC7634 || Y. Nir || ynir.ietf@gmail.com +# RFC7635 || T. Reddy, P. Patil, R. Ravindranath, J. Uberti || tireddy@cisco.com, praspati@cisco.com, rmohanr@cisco.com, justin@uberti.name +# RFC7636 || N. Sakimura, Ed., J. Bradley, N. Agarwal || n-sakimura@nri.co.jp, ve7jtb@ve7jtb.com, naa@google.com +# RFC7637 || P. Garg, Ed., Y. Wang, Ed. || pankajg@microsoft.com, yushwang@microsoft.com +# RFC7638 || M. Jones, N. Sakimura || mbj@microsoft.com, n-sakimura@nri.co.jp +# RFC7639 || A. Hutton, J. Uberti, M. Thomson || andrew.hutton@unify.com, justin@uberti.name, martin.thomson@gmail.com +# RFC7640 || B. Constantine, R. Krishnan || barry.constantine@jdsu.com, ramkri123@gmail.com +# RFC7641 || K. Hartke || hartke@tzi.org +# RFC7642 || K. LI, Ed., P. Hunt, B. Khasnabish, A. Nadalin, Z. Zeltsan || kepeng.lkp@alibaba-inc.com, phil.hunt@oracle.com, vumip1@gmail.com, tonynad@microsoft.com, zachary.zeltsan@gmail.com +# RFC7643 || P. Hunt, Ed., K. Grizzle, E. Wahlstroem, C. Mortimore || phil.hunt@yahoo.com, kelly.grizzle@sailpoint.com, erik.wahlstrom@nexusgroup.com, cmortimore@salesforce.com +# RFC7644 || P. Hunt, Ed., K. Grizzle, M. Ansari, E. Wahlstroem, C. Mortimore || phil.hunt@yahoo.com, kelly.grizzle@sailpoint.com, morteza.ansari@cisco.com, erik.wahlstrom@nexusgroup.com, cmortimore@salesforce.com +# RFC7645 || U. Chunduri, A. Tian, W. Lu || uma.chunduri@ericsson.com, albert.tian@ericsson.com, wenhu.lu@ericsson.com +# RFC7646 || P. Ebersman, W. Kumari, C. Griffiths, J. Livingood, R. Weber || ebersman-ietf@dragon.net, warren@kumari.net, cgriffiths@gmail.com, jason_livingood@cable.comcast.com, ralf.weber@nominum.com +# RFC7647 || R. Sparks, A.B. Roach || rjsparks@nostrum.com, adam@nostrum.com +# RFC7648 || S. Perreault, M. Boucadair, R. Penno, D. Wing, S. Cheshire || sperreault@jive.com, mohamed.boucadair@orange.com, repenno@cisco.com, dwing-ietf@fuggles.com, cheshire@apple.com +# RFC7649 || P. Saint-Andre, D. York || peter@andyet.com, york@isoc.org +# RFC7650 || J. Jimenez, J. Lopez-Vega, J. Maenpaa, G. Camarillo || jaime.jimenez@ericsson.com, jmlvega@ugr.es, jouni.maenpaa@ericsson.com, gonzalo.camarillo@ericsson.com +# RFC7651 || A. Dodd-Noble, S. Gundavelli, J. Korhonen, F. Baboescu, B. Weis || noblea@cisco.com, sgundave@cisco.com, jouni.nospam@gmail.com, baboescu@broadcom.com, bew@cisco.com +# RFC7652 || M. Cullen, S. Hartman, D. Zhang, T. Reddy || margaret@painless-security.com, hartmans@painless-security.com, zhang_dacheng@hotmail.com, tireddy@cisco.com +# RFC7653 || D. Raghuvanshi, K. Kinnear, D. Kukrety || draghuva@cisco.com, kkinnear@cisco.com, dkukrety@cisco.com +# RFC7654 || S. Banks, F. Calabria, G. Czirjak, R. Machat || sbanks@encrypted.net, fcalabri@cisco.com, gczirjak@juniper.net, rmachat@juniper.net +# RFC7655 || M. Ramalho, Ed., P. Jones, N. Harada, M. Perumal, L. Miao || mramalho@cisco.com, paulej@packetizer.com, harada.noboru@lab.ntt.co.jp, muthu.arul@gmail.com, lei.miao@huawei.com +# RFC7656 || J. Lennox, K. Gross, S. Nandakumar, G. Salgueiro, B. Burman, Ed. || jonathan@vidyo.com, kevin.gross@avanw.com, snandaku@cisco.com, gsalguei@cisco.com, bo.burman@ericsson.com +# RFC7657 || D. Black, Ed., P. Jones || david.black@emc.com, paulej@packetizer.com +# RFC7658 || S. Perreault, T. Tsou, S. Sivakumar, T. Taylor || sperreault@jive.com, tina.tsou.zouting@huawei.com, ssenthil@cisco.com, tom.taylor.stds@gmail.com +# RFC7659 || S. Perreault, T. Tsou, S. Sivakumar, T. Taylor || sperreault@jive.com, tina.tsou.zouting@huawei.com, ssenthil@cisco.com, tom.taylor.stds@gmail.com +# RFC7660 || L. Bertz, S. Manning, B. Hirschman || lyleb551144@gmail.com, sergem913@gmail.com, Brent.Hirschman@gmail.com +# RFC7661 || G. Fairhurst, A. Sathiaseelan, R. Secchi || gorry@erg.abdn.ac.uk, arjuna@erg.abdn.ac.uk, raffaello@erg.abdn.ac.uk +# RFC7662 || J. Richer, Ed. || ietf@justin.richer.org +# RFC7663 || B. Trammell, Ed., M. Kuehlewind, Ed. || ietf@trammell.ch, mirja.kuehlewind@tik.ee.ethz.ch +# RFC7664 || D. Harkins, Ed. || dharkins@arubanetworks.com +# RFC7665 || J. Halpern, Ed., C. Pignataro, Ed. || jmh@joelhalpern.com, cpignata@cisco.com +# RFC7666 || H. Asai, M. MacFaden, J. Schoenwaelder, K. Shima, T. Tsou || panda@hongo.wide.ad.jp, mrm@vmware.com, j.schoenwaelder@jacobs-university.de, keiichi@iijlab.net, tina.tsou.zouting@huawei.com +# RFC7667 || M. Westerlund, S. Wenger || magnus.westerlund@ericsson.com, stewe@stewe.org +# RFC7668 || J. Nieminen, T. Savolainen, M. Isomaki, B. Patil, Z. Shelby, C. Gomez || johannamaria.nieminen@gmail.com, teemu.savolainen@nokia.com, markus.isomaki@nokia.com, basavaraj.patil@att.com, zach.shelby@arm.com, carlesgo@entel.upc.edu +# RFC7669 || J. Levine || standards@taugh.com +# RFC7670 || T. Kivinen, P. Wouters, H. Tschofenig || kivinen@iki.fi, pwouters@redhat.com, Hannes.Tschofenig@gmx.net +# RFC7671 || V. Dukhovni, W. Hardaker || ietf-dane@dukhovni.org, ietf@hardakers.net +# RFC7672 || V. Dukhovni, W. Hardaker || ietf-dane@dukhovni.org, ietf@hardakers.net +# RFC7673 || T. Finch, M. Miller, P. Saint-Andre || dot@dotat.at, mamille2@cisco.com, peter@andyet.com +# RFC7674 || J. Haas, Ed. || jhaas@juniper.net +# RFC7675 || M. Perumal, D. Wing, R. Ravindranath, T. Reddy, M. Thomson || muthu.arul@gmail.com, dwing-ietf@fuggles.com, rmohanr@cisco.com, tireddy@cisco.com, martin.thomson@gmail.com +# RFC7676 || C. Pignataro, R. Bonica, S. Krishnan || cpignata@cisco.com, rbonica@juniper.net, suresh.krishnan@ericsson.com +# RFC7677 || T. Hansen || tony+scramsha256@maillennium.att.com +# RFC7678 || C. Zhou, T. Taylor, Q. Sun, M. Boucadair || cathy.zhou@huawei.com, tom.taylor.stds@gmail.com, sunqiong@ctbri.com.cn, mohamed.boucadair@orange.com +# RFC7679 || G. Almes, S. Kalidindi, M. Zekauskas, A. Morton, Ed. || almes@acm.org, skalidindi@ixiacom.com, matt@internet2.edu, acmorton@att.com +# RFC7680 || G. Almes, S. Kalidindi, M. Zekauskas, A. Morton, Ed. || almes@acm.org, skalidindi@ixiacom.com, matt@internet2.edu, acmorton@att.com +# RFC7681 || J. Davin || info@eesst.org +# RFC7682 || D. McPherson, S. Amante, E. Osterweil, L. Blunk, D. Mitchell || dmcpherson@verisign.com, amante@apple.com, eosterweil@verisign.com, ljb@merit.edu, dave@singularity.cx +# RFC7683 || J. Korhonen, Ed., S. Donovan, Ed., B. Campbell, L. Morand || jouni.nospam@gmail.com, srdonovan@usdonovans.com, ben@nostrum.com, lionel.morand@orange.com +# RFC7684 || P. Psenak, H. Gredler, R. Shakir, W. Henderickx, J. Tantsura, A. Lindem || ppsenak@cisco.com, hannes@gredler.at, rjs@rob.sh, wim.henderickx@alcatel-lucent.com, jeff.tantsura@ericsson.com, acee@cisco.com +# RFC7685 || A. Langley || agl@google.com +# RFC7686 || J. Appelbaum, A. Muffett || jacob@appelbaum.net, alecm@fb.com +# RFC7687 || S. Farrell, R. Wenning, B. Bos, M. Blanchet, H. Tschofenig || stephen.farrell@cs.tcd.ie, rigo@w3.org, bert@w3.org, Marc.Blanchet@viagenie.ca, Hannes.Tschofenig@gmx.net +# RFC7688 || Y. Lee, Ed., G. Bernstein, Ed. || leeyoung@huawei.com, gregb@grotto-networking.com +# RFC7689 || G. Bernstein, Ed., S. Xu, Y. Lee, Ed., G. Martinelli, H. Harai || gregb@grotto-networking.com, xsg@nict.go.jp, leeyoung@huawei.com, giomarti@cisco.com, harai@nict.go.jp +# RFC7690 || M. Byerly, M. Hite, J. Jaeggli || suckawha@gmail.com, mhite@hotmail.com, joelja@gmail.com +# RFC7691 || S. Bradner, Ed. || sob@harvard.edu +# RFC7692 || T. Yoshino || tyoshino@google.com +# RFC7693 || M-J. Saarinen, Ed., J-P. Aumasson || m.saarinen@qub.ac.uk, jean-philippe.aumasson@nagra.com +# RFC7694 || J. Reschke || julian.reschke@greenbytes.de +# RFC7695 || P. Pfister, B. Paterson, J. Arkko || pierre.pfister@darou.fr, paterson.b@gmail.com, jari.arkko@piuha.net +# RFC7696 || R. Housley || housley@vigilsec.com +# RFC7697 || P. Pan, S. Aldrin, M. Venkatesan, K. Sampath, T. Nadeau, S. Boutros || none, aldrin.ietf@gmail.com, venkat.mahalingams@gmail.com, kannankvs@gmail.com, tnadeau@lucidvision.com, sboutros@vmware.com +# RFC7698 || O. Gonzalez de Dios, Ed., R. Casellas, Ed., F. Zhang, X. Fu, D. Ceccarelli, I. Hussain || oscar.gonzalezdedios@telefonica.com, ramon.casellas@cttc.es, zhangfatai@huawei.com, fu.xihua@stairnote.com, daniele.ceccarelli@ericsson.com, ihussain@infinera.com +# RFC7699 || A. Farrel, D. King, Y. Li, F. Zhang || adrian@olddog.co.uk, daniel@olddog.co.uk, wsliguotou@hotmail.com, zhangfatai@huawei.com +# RFC7700 || P. Saint-Andre || peter@andyet.com +# RFC7701 || A. Niemi, M. Garcia-Martin, G. Sandbakken || aki.niemi@iki.fi, miguel.a.garcia@ericsson.com, geirsand@cisco.com +# RFC7702 || P. Saint-Andre, S. Ibarra, S. Loreto || peter@andyet.com, saul@ag-projects.com, Salvatore.Loreto@ericsson.com +# RFC7703 || E. Cordeiro, R. Carnier, A. Moreiras || edwin@scordeiro.net, rodrigocarnier@gmail.com, moreiras@nic.br +# RFC7704 || D. Crocker, N. Clark || dcrocker@bbiw.net, narelle.clark@pavonis.com.au +# RFC7705 || W. George, S. Amante || wesley.george@twcable.com, amante@apple.com +# RFC7706 || W. Kumari, P. Hoffman || warren@kumari.net, paul.hoffman@icann.org +# RFC7707 || F. Gont, T. Chown || fgont@si6networks.com, tim.chown@jisc.ac.uk +# RFC7708 || T. Nadeau, L. Martini, S. Bryant || tnadeau@lucidvision.com, lmartini@cisco.com, stewart.bryant@gmail.com +# RFC7709 || A. Malis, Ed., B. Wilson, G. Clapp, V. Shukla || agmalis@gmail.com, bwilson@appcomsci.com, clapp@research.att.com, vishnu.shukla@verizon.com +# RFC7710 || W. Kumari, O. Gudmundsson, P. Ebersman, S. Sheng || warren@kumari.net, olafur@cloudflare.com, ebersman-ietf@dragon.net, steve.sheng@icann.org +# RFC7711 || M. Miller, P. Saint-Andre || mamille2@cisco.com, peter@andyet.com +# RFC7712 || P. Saint-Andre, M. Miller, P. Hancke || peter@andyet.com, mamille2@cisco.com, fippo@andyet.com +# RFC7713 || M. Mathis, B. Briscoe || mattmathis@google.com, ietf@bobbriscoe.net +# RFC7714 || D. McGrew, K. Igoe || mcgrew@cisco.com, mythicalkevin@yahoo.com +# RFC7715 || IJ. Wijnands, Ed., K. Raza, A. Atlas, J. Tantsura, Q. Zhao || ice@cisco.com, skraza@cisco.com, akatlas@juniper.net, jeff.tantsura@ericsson.com, quintin.zhao@huawei.com +# RFC7716 || J. Zhang, L. Giuliano, E. Rosen, Ed., K. Subramanian, D. Pacella || zzhang@juniper.net, lenny@juniper.net, erosen@juniper.net, kartsubr@cisco.com, dante.j.pacella@verizonbusiness.com +# RFC7717 || K. Pentikousis, Ed., E. Zhang, Y. Cui || k.pentikousis@eict.de, emma.zhanglijia@huawei.com, cuiyang@huawei.com +# RFC7718 || A. Morton || acmorton@att.com +# RFC7719 || P. Hoffman, A. Sullivan, K. Fujiwara || paul.hoffman@icann.org, asullivan@dyn.com, fujiwara@jprs.co.jp +# RFC7720 || M. Blanchet, L-J. Liman || Marc.Blanchet@viagenie.ca, liman@netnod.se +# RFC7721 || A. Cooper, F. Gont, D. Thaler || alcoop@cisco.com, fgont@si6networks.com, dthaler@microsoft.com +# RFC7722 || C. Dearlove, T. Clausen || chris.dearlove@baesystems.com, T.Clausen@computer.org +# RFC7723 || S. Kiesel, R. Penno || ietf-pcp@skiesel.de, repenno@cisco.com +# RFC7724 || K. Kinnear, M. Stapp, B. Volz, N. Russell || kkinnear@cisco.com, mjs@cisco.com, volz@cisco.com, neil.e.russell@gmail.com +# RFC7725 || T. Bray || tbray@textuality.com +# RFC7726 || V. Govindan, K. Rajaraman, G. Mirsky, N. Akiya, S. Aldrin || venggovi@cisco.com, kalyanir@cisco.com, gregory.mirsky@ericsson.com, nobo.akiya.dev@gmail.com, aldrin.ietf@gmail.com +# RFC7727 || M. Zhang, H. Wen, J. Hu || zhangmingui@huawei.com, wenhuafeng@huawei.com, hujie@ctbri.com.cn +# RFC7728 || B. Burman, A. Akram, R. Even, M. Westerlund || bo.burman@ericsson.com, akram.muhammadazam@gmail.com, roni.even@mail01.huawei.com, magnus.westerlund@ericsson.com +# RFC7729 || B. Khasnabish, E. Haleplidis, J. Hadi Salim, Ed. || vumip1@gmail.com, ehalep@ece.upatras.gr, hadi@mojatatu.com +# RFC7730 || G. Huston, S. Weiler, G. Michaelson, S. Kent || gih@apnic.net, weiler@tislabs.com, ggm@apnic.net, kent@bbn.com +# RFC7731 || J. Hui, R. Kelsey || jonhui@nestlabs.com, richard.kelsey@silabs.com +# RFC7732 || P. van der Stok, R. Cragie || consultancy@vanderstok.org, robert.cragie@arm.com +# RFC7733 || A. Brandt, E. Baccelli, R. Cragie, P. van der Stok || anders_brandt@sigmadesigns.com, Emmanuel.Baccelli@inria.fr, robert.cragie@arm.com, consultancy@vanderstok.org +# RFC7734 || D. Allan, Ed., J. Tantsura, D. Fedyk, A. Sajassi || david.i.allan@ericsson.com, jeff.tantsura@ericsson.com, don.fedyk@hpe.com, sajassi@cisco.com +# RFC7735 || R. Sparks, T. Kivinen || rjsparks@nostrum.com, kivinen@iki.fi +# RFC7736 || K. Ma || kevin.j.ma@ericsson.com +# RFC7737 || N. Akiya, G. Swallow, C. Pignataro, L. Andersson, M. Chen || nobo.akiya.dev@gmail.com, swallow@cisco.com, cpignata@cisco.com, loa@mail01.huawei.com, mach.chen@huawei.com +# RFC7738 || M. Blanchet, A. Schiltknecht, P. Shames || Marc.Blanchet@viagenie.ca, audric.schiltknecht@viagenie.ca, peter.m.shames@jpl.nasa.gov +# RFC7739 || F. Gont || fgont@si6networks.com +# RFC7740 || Z. Zhang, Y. Rekhter, A. Dolganow || zzhang@juniper.net, none, andrew.dolganow@alcatel-lucent.com +# RFC7741 || P. Westin, H. Lundin, M. Glover, J. Uberti, F. Galligan || patrik.westin@gmail.com, hlundin@google.com, michaelglover262@gmail.com, justin@uberti.name, fgalligan@google.com +# RFC7742 || A.B. Roach || adam@nostrum.com +# RFC7743 || J. Luo, Ed., L. Jin, Ed., T. Nadeau, Ed., G. Swallow, Ed. || luo.jian@zte.com.cn, lizho.jin@gmail.com, tnadeau@lucidvision.com, swallow@cisco.com +# RFC7744 || L. Seitz, Ed., S. Gerdes, Ed., G. Selander, M. Mani, S. Kumar || ludwig@sics.se, gerdes@tzi.org, goran.selander@ericsson.com, mehdi.mani@itron.com, sandeep.kumar@philips.com +# RFC7745 || T. Manderson || terry.manderson@icann.org +# RFC7746 || R. Bonica, I. Minei, M. Conn, D. Pacella, L. Tomotaki || rbonica@juniper.net, inaminei@google.com, meconn26@gmail.com, dante.j.pacella@verizon.com, luis.tomotaki@verizon.com +# RFC7747 || R. Papneja, B. Parise, S. Hares, D. Lee, I. Varlashkin || rajiv.papneja@huawei.com, bparise@skyportsystems.com, shares@ndzh.com, dlee@ixiacom.com, ilya@nobulus.com +# RFC7748 || A. Langley, M. Hamburg, S. Turner || agl@google.com, mike@shiftleft.org, sean@sn3rd.com +# RFC7749 || J. Reschke || julian.reschke@greenbytes.de +# RFC7750 || J. Hedin, G. Mirsky, S. Baillargeon || jonas.hedin@ericsson.com, gregory.mirsky@ericsson.com, steve.baillargeon@ericsson.com +# RFC7751 || S. Sorce, T. Yu || ssorce@redhat.com, tlyu@mit.edu +# RFC7752 || H. Gredler, Ed., J. Medved, S. Previdi, A. Farrel, S. Ray || hannes@gredler.at, jmedved@cisco.com, sprevidi@cisco.com, adrian@olddog.co.uk, raysaikat@gmail.com +# RFC7753 || Q. Sun, M. Boucadair, S. Sivakumar, C. Zhou, T. Tsou, S. Perreault || sunqiong@ctbri.com.cn, mohamed.boucadair@orange.com, ssenthil@cisco.com, cathy.zhou@huawei.com, tina.tsou@philips.com, sperreault@jive.com +# RFC7754 || R. Barnes, A. Cooper, O. Kolkman, D. Thaler, E. Nordmark || rlb@ipv.sx, alcoop@cisco.com, kolkman@isoc.org, dthaler@microsoft.com, nordmark@arista.com +# RFC7755 || T. Anderson || tore@redpill-linpro.com +# RFC7756 || T. Anderson, S. Steffann || tore@redpill-linpro.com, sander@steffann.nl +# RFC7757 || T. Anderson, A. Leiva Popper || tore@redpill-linpro.com, ydahhrk@gmail.com +# RFC7758 || T. Mizrahi, Y. Moses || dew@tx.technion.ac.il, moses@ee.technion.ac.il +# RFC7759 || E. Bellagamba, G. Mirsky, L. Andersson, P. Skoldstrom, D. Ward, J. Drake || elisa.bellagamba@gmail.com, gregory.mirsky@ericsson.com, loa@mail01.huawei.com, pontus.skoldstrom@acreo.se, dward@cisco.com, jdrake@juniper.net +# RFC7760 || R. Housley || housley@vigilsec.com +# RFC7761 || B. Fenner, M. Handley, H. Holbrook, I. Kouvelas, R. Parekh, Z. Zhang, L. Zheng || fenner@arista.com, m.handley@cs.ucl.ac.uk, holbrook@arista.com, kouvelas@arista.com, riparekh@cisco.com, zzhang@juniper.net, vero.zheng@huawei.com +# RFC7762 || M. West || mkwst@google.com +# RFC7763 || S. Leonard || dev+ietf@seantek.com +# RFC7764 || S. Leonard || dev+ietf@seantek.com +# RFC7765 || P. Hurtig, A. Brunstrom, A. Petlund, M. Welzl || per.hurtig@kau.se, anna.brunstrom@kau.se, apetlund@simula.no, michawe@ifi.uio.no +# RFC7766 || J. Dickinson, S. Dickinson, R. Bellis, A. Mankin, D. Wessels || jad@sinodun.com, sara@sinodun.com, ray@isc.org, allison.mankin@gmail.com, dwessels@verisign.com +# RFC7767 || S. Vinapamula, S. Sivakumar, M. Boucadair, T. Reddy || sureshk@juniper.net, ssenthil@cisco.com, mohamed.boucadair@orange.com, tireddy@cisco.com +# RFC7768 || T. Tsou, W. Li, T. Taylor, J. Huang || tina.tsou@philips.com, mweiboli@gmail.com, tom.taylor.stds@gmail.com, james.huang@huawei.com +# RFC7769 || S. Sivabalan, S. Boutros, H. Shah, S. Aldrin, M. Venkatesan || msiva@cisco.com, sboutros@cisco.com, hshah@ciena.com, aldrin.ietf@gmail.com, mannan_venkatesan@cable.comcast.com +# RFC7770 || A. Lindem, Ed., N. Shen, JP. Vasseur, R. Aggarwal, S. Shaffer || acee@cisco.com, naiming@cisco.com, jpv@cisco.com, raggarwa_1@yahoo.com, sshaffer@akamai.com +# RFC7771 || A. Malis, Ed., L. Andersson, H. van Helvoort, J. Shin, L. Wang, A. D'Alessandro || agmalis@gmail.com, loa@mail01.huawei.com, huubatwork@gmail.com, jongyoon.shin@sk.com, wangleiyj@chinamobile.com, alessandro.dalessandro@telecomitalia.it +# RFC7772 || A. Yourtchenko, L. Colitti || ayourtch@cisco.com, lorenzo@google.com +# RFC7773 || S. Santesson || sts@aaa-sec.com +# RFC7774 || Y. Doi, M. Gillmore || yusuke.doi@toshiba.co.jp, matthew.gillmore@itron.com +# RFC7775 || L. Ginsberg, S. Litkowski, S. Previdi || ginsberg@cisco.com, stephane.litkowski@orange.com, sprevidi@cisco.com +# RFC7776 || P. Resnick, A. Farrel || presnick@qti.qualcomm.com, adrian@olddog.co.uk +# RFC7777 || S. Hegde, R. Shakir, A. Smirnov, Z. Li, B. Decraene || shraddha@juniper.net, rjs@rob.sh, as@cisco.com, lizhenbin@huawei.com, bruno.decraene@orange.com +# RFC7778 || D. Kutscher, F. Mir, R. Winter, S. Krishnan, Y. Zhang, CJ. Bernardos || kutscher@neclab.eu, faisal.mir@gmail.com, rolf.winter@neclab.eu, suresh.krishnan@ericsson.com, ying.zhang13@hp.com, cjbc@it.uc3m.es +# RFC7779 || H. Rogge, E. Baccelli || henning.rogge@fkie.fraunhofer.de, Emmanuel.Baccelli@inria.fr +# RFC7780 || D. Eastlake 3rd, M. Zhang, R. Perlman, A. Banerjee, A. Ghanwani, S. Gupta || d3e3e3@gmail.com, zhangmingui@huawei.com, radia@alum.mit.edu, ayabaner@cisco.com, anoop@alumni.duke.edu, sujay.gupta@ipinfusion.com +# RFC7781 || H. Zhai, T. Senevirathne, R. Perlman, M. Zhang, Y. Li || honjun.zhai@tom.com, tsenevir@gmail.com, radia@alum.mit.edu, zhangmingui@huawei.com, liyizhou@huawei.com +# RFC7782 || M. Zhang, R. Perlman, H. Zhai, M. Durrani, S. Gupta || zhangmingui@huawei.com, radia@alum.mit.edu, honjun.zhai@tom.com, mdurrani@cisco.com, sujay.gupta@ipinfusion.com +# RFC7783 || T. Senevirathne, J. Pathangi, J. Hudson || tsenevir@gmail.com, pathangi_janardhanan@dell.com, jon.hudson@gmail.com +# RFC7784 || D. Kumar, S. Salam, T. Senevirathne || dekumar@cisco.com, ssalam@cisco.com, tsenevir@gmail.com +# RFC7785 || S. Vinapamula, M. Boucadair || sureshk@juniper.net, mohamed.boucadair@orange.com +# RFC7786 || M. Kuehlewind, Ed., R. Scheffenegger || mirja.kuehlewind@tik.ee.ethz.ch, rs.ietf@gmx.at +# RFC7787 || M. Stenberg, S. Barth || markus.stenberg@iki.fi, cyrus@openwrt.org +# RFC7788 || M. Stenberg, S. Barth, P. Pfister || markus.stenberg@iki.fi, cyrus@openwrt.org, pierre.pfister@darou.fr +# RFC7789 || C. Cardona, P. Francois, P. Lucente || juancamilo.cardona@imdea.org, pifranco@cisco.com, plucente@cisco.com +# RFC7790 || Y. Yoneya, T. Nemoto || yoshiro.yoneya@jprs.co.jp, t.nemo10@kmd.keio.ac.jp +# RFC7791 || D. Migault, Ed., V. Smyslov || daniel.migault@ericsson.com, svan@elvis.ru +# RFC7792 || F. Zhang, X. Zhang, A. Farrel, O. Gonzalez de Dios, D. Ceccarelli || zhangfatai@huawei.com, zhang.xian@huawei.com, adrian@olddog.co.uk, oscar.gonzalezdedios@telefonica.com, daniele.ceccarelli@ericsson.com +# RFC7793 || M. Andrews || marka@isc.org +# RFC7794 || L. Ginsberg, Ed., B. Decraene, S. Previdi, X. Xu, U. Chunduri || ginsberg@cisco.com, bruno.decraene@orange.com, sprevidi@cisco.com, xuxiaohu@huawei.com, uma.chunduri@ericsson.com +# RFC7795 || J. Dong, H. Wang || jie.dong@huawei.com, rainsword.wang@huawei.com +# RFC7796 || Y. Jiang, Ed., L. Yong, M. Paul || jiangyuanlong@huawei.com, lucyyong@huawei.com, Manuel.Paul@telekom.de +# RFC7797 || M. Jones || mbj@microsoft.com +# RFC7798 || Y.-K. Wang, Y. Sanchez, T. Schierl, S. Wenger, M. M. Hannuksela || yekui.wang@gmail.com, yago.sanchez@hhi.fraunhofer.de, thomas.schierl@hhi.fraunhofer.de, stewe@stewe.org, miska.hannuksela@nokia.com +# RFC7799 || A. Morton || acmorton@att.com +# RFC7800 || M. Jones, J. Bradley, H. Tschofenig || mbj@microsoft.com, ve7jtb@ve7jtb.com, Hannes.Tschofenig@gmx.net +# RFC7801 || V. Dolmatov, Ed. || dol@srcc.msu.ru +# RFC7802 || S. Emery, N. Williams || shawn.emery@oracle.com, nico@cryptonector.com +# RFC7803 || B. Leiba || barryleiba@computer.org +# RFC7804 || A. Melnikov || alexey.melnikov@isode.com +# RFC7805 || A. Zimmermann, W. Eddy, L. Eggert || alexander@zimmermann.eu.com, wes@mti-systems.com, lars@netapp.com +# RFC7806 || F. Baker, R. Pan || fred@cisco.com, ropan@cisco.com +# RFC7807 || M. Nottingham, E. Wilde || mnot@mnot.net, erik.wilde@dret.net +# RFC7808 || M. Douglass, C. Daboo || mdouglass@sphericalcowgroup.com, cyrus@daboo.name +# RFC7809 || C. Daboo || cyrus@daboo.name +# RFC7810 || S. Previdi, Ed., S. Giacalone, D. Ward, J. Drake, Q. Wu || sprevidi@cisco.com, spencer.giacalone@gmail.com, wardd@cisco.com, jdrake@juniper.net, sunseawq@huawei.com +# RFC7811 || G. Enyedi, A. Csaszar, A. Atlas, C. Bowers, A. Gopalan || Gabor.Sandor.Enyedi@ericsson.com, Andras.Csaszar@ericsson.com, akatlas@juniper.net, cbowers@juniper.net, abishek@ece.arizona.edu +# RFC7812 || A. Atlas, C. Bowers, G. Enyedi || akatlas@juniper.net, cbowers@juniper.net, Gabor.Sandor.Enyedi@ericsson.com +# RFC7813 || J. Farkas, Ed., N. Bragg, P. Unbehagen, G. Parsons, P. Ashwood-Smith, C. Bowers || janos.farkas@ericsson.com, nbragg@ciena.com, unbehagen@avaya.com, glenn.parsons@ericsson.com, Peter.AshwoodSmith@huawei.com, cbowers@juniper.net +# RFC7814 || X. Xu, C. Jacquenet, R. Raszuk, T. Boyes, B. Fee || xuxiaohu@huawei.com, christian.jacquenet@orange.com, robert@raszuk.net, tboyes@bloomberg.net, bfee@extremenetworks.com +# RFC7815 || T. Kivinen || kivinen@iki.fi +# RFC7816 || S. Bortzmeyer || bortzmeyer+ietf@nic.fr +# RFC7817 || A. Melnikov || alexey.melnikov@isode.com +# RFC7818 || M. Jethanandani || mjethanandani@gmail.com +# RFC7819 || S. Jiang, S. Krishnan, T. Mrugalski || jiangsheng@huawei.com, suresh.krishnan@ericsson.com, tomasz.mrugalski@gmail.com +# RFC7820 || T. Mizrahi || talmi@marvell.com +# RFC7821 || T. Mizrahi || talmi@marvell.com +# RFC7822 || T. Mizrahi, D. Mayer || talmi@marvell.com, mayer@ntp.org +# RFC7823 || A. Atlas, J. Drake, S. Giacalone, S. Previdi || akatlas@juniper.net, jdrake@juniper.net, spencer.giacalone@gmail.com, sprevidi@cisco.com +# RFC7824 || S. Krishnan, T. Mrugalski, S. Jiang || suresh.krishnan@ericsson.com, tomasz.mrugalski@gmail.com, jiangsheng@huawei.com +# RFC7825 || J. Goldberg, M. Westerlund, T. Zeng || jgoldber@cisco.com, magnus.westerlund@ericsson.com, thomas.zeng@gmail.com +# RFC7826 || H. Schulzrinne, A. Rao, R. Lanphier, M. Westerlund, M. Stiemerling, Ed. || schulzrinne@cs.columbia.edu, anrao@cisco.com, robla@robla.net, magnus.westerlund@ericsson.com, mls.ietf@gmail.com +# RFC7827 || L. Eggert || lars@netapp.com +# RFC7828 || P. Wouters, J. Abley, S. Dickinson, R. Bellis || pwouters@redhat.com, jabley@dyn.com, sara@sinodun.com, ray@isc.org +# RFC7829 || Y. Nishida, P. Natarajan, A. Caro, P. Amer, K. Nielsen || nishida@wide.ad.jp, prenatar@cisco.com, acaro@bbn.com, amer@udel.edu, karen.nielsen@tieto.com +# RFC7830 || A. Mayrhofer || alex.mayrhofer.ietf@gmail.com +# RFC7831 || J. Howlett, S. Hartman, H. Tschofenig, J. Schaad || josh.howlett@ja.net, hartmans-ietf@mit.edu, Hannes.Tschofenig@gmx.net, ietf@augustcellars.com +# RFC7832 || R. Smith, Ed. || rhys.smith@jisc.ac.uk +# RFC7833 || J. Howlett, S. Hartman, A. Perez-Mendez, Ed. || josh.howlett@ja.net, hartmans-ietf@mit.edu, alex@um.es +# RFC7834 || D. Saucez, L. Iannone, A. Cabellos, F. Coras || damien.saucez@inria.fr, ggx@gigix.net, acabello@ac.upc.edu, fcoras@ac.upc.edu +# RFC7835 || D. Saucez, L. Iannone, O. Bonaventure || damien.saucez@inria.fr, ggx@gigix.net, Olivier.Bonaventure@uclouvain.be +# RFC7836 || S. Smyshlyaev, Ed., E. Alekseev, I. Oshkin, V. Popov, S. Leontiev, V. Podobaev, D. Belyavsky || svs@cryptopro.ru, alekseev@cryptopro.ru, oshkin@cryptopro.ru, vpopov@cryptopro.ru, lse@CryptoPro.ru, v_podobaev@factor-ts.ru, beldmit@gmail.com +# RFC7837 || S. Krishnan, M. Kuehlewind, B. Briscoe, C. Ralli || suresh.krishnan@ericsson.com, mirja.kuehlewind@tik.ee.ethz.ch, ietf@bobbriscoe.net, ralli@tid.es +# RFC7838 || M. Nottingham, P. McManus, J. Reschke || mnot@mnot.net, mcmanus@ducksong.com, julian.reschke@greenbytes.de +# RFC7839 || S. Bhandari, S. Gundavelli, M. Grayson, B. Volz, J. Korhonen || shwethab@cisco.com, sgundave@cisco.com, mgrayson@cisco.com, volz@cisco.com, jouni.nospam@gmail.com +# RFC7840 || J. Winterbottom, H. Tschofenig, L. Liess || a.james.winterbottom@gmail.com, Hannes.Tschofenig@gmx.net, L.Liess@telekom.de +# RFC7841 || J. Halpern, Ed., L. Daigle, Ed., O. Kolkman, Ed. || jmh@joelhalpern.com, ldaigle@thinkingcat.com, kolkman@isoc.org +# RFC7842 || R. Sparks || rjsparks@nostrum.com +# RFC7843 || A. Ripke, R. Winter, T. Dietz, J. Quittek, R. da Silva || ripke@neclab.eu, winter@neclab.eu, dietz@neclab.eu, quittek@neclab.eu, rafaelalejandro.lopezdasilva@telefonica.com +# RFC7844 || C. Huitema, T. Mrugalski, S. Krishnan || huitema@microsoft.com, tomasz.mrugalski@gmail.com, suresh.krishnan@ericsson.com +# RFC7845 || T. Terriberry, R. Lee, R. Giles || tterribe@xiph.org, ron@debian.org, giles@xiph.org +# RFC7846 || R. Cruz, M. Nunes, J. Xia, R. Huang, Ed., J. Taveira, D. Lingli || rui.cruz@ieee.org, mario.nunes@inov.pt, xiajinwei@huawei.com, rachel.huang@huawei.com, joao.silva@inov.pt, denglingli@chinamobile.com +# RFC7847 || T. Melia, Ed., S. Gundavelli, Ed. || telemaco.melia@gmail.com, sgundave@cisco.com +# RFC7848 || G. Lozano || gustavo.lozano@icann.org +# RFC7849 || D. Binet, M. Boucadair, A. Vizdal, G. Chen, N. Heatley, R. Chandler, D. Michaud, D. Lopez, W. Haeffner || david.binet@orange.com, mohamed.boucadair@orange.com, Ales.Vizdal@T-Mobile.cz, phdgang@gmail.com, nick.heatley@ee.co.uk, ross@eircom.net, dave.michaud@rci.rogers.com, diego.r.lopez@telefonica.com, walter.haeffner@vodafone.com +# RFC7850 || S. Nandakumar || snandaku@cisco.com +# RFC7851 || H. Song, X. Jiang, R. Even, D. Bryan, Y. Sun || haibin.song@huawei.com, jiangxingfeng@huawei.com, ron.even.tlv@gmail.com, dbryan@ethernot.org, sunyi@ict.ac.cn +# RFC7852 || R. Gellens, B. Rosen, H. Tschofenig, R. Marshall, J. Winterbottom || rg+ietf@randy.pensive.org, br@brianrosen.net, Hannes.Tschofenig@gmx.net, rmarshall@telecomsys.com, a.james.winterbottom@gmail.com +# RFC7853 || S. Martin, S. Tuecke, B. McCollam, M. Lidman || sjmartin@uchicago.edu, tuecke@globus.org, bmccollam@uchicago.edu, mattias@uchicago.edu< +# RFC7854 || J. Scudder, Ed., R. Fernando, S. Stuart || jgs@juniper.net, rex@cisco.com, sstuart@google.com +# RFC7855 || S. Previdi, Ed., C. Filsfils, Ed., B. Decraene, S. Litkowski, M. Horneffer, R. Shakir || sprevidi@cisco.com, cfilsfil@cisco.com, bruno.decraene@orange.com, stephane.litkowski@orange.com, Martin.Horneffer@telekom.de, rjs@rob.sh +# RFC7856 || Y. Cui, J. Dong, P. Wu, M. Xu, A. Yla-Jaaski || yong@csnet1.cs.tsinghua.edu.cn, knight.dongjiang@gmail.com, weapon9@gmail.com, xmw@cernet.edu.cn, antti.yla-jaaski@aalto.fi +# RFC7857 || R. Penno, S. Perreault, M. Boucadair, Ed., S. Sivakumar, K. Naito || repenno@cisco.com, sperreault@jive.com, mohamed.boucadair@orange.com, ssenthil@cisco.com, k.naito@nttv6.jp +# RFC7858 || Z. Hu, L. Zhu, J. Heidemann, A. Mankin, D. Wessels, P. Hoffman || zihu@outlook.com, liangzhu@usc.edu, johnh@isi.edu, allison.mankin@gmail.com, dwessels@verisign.com, paul.hoffman@icann.org +# RFC7859 || C. Dearlove || chris.dearlove@baesystems.com +# RFC7860 || J. Merkle, Ed., M. Lochter || johannes.merkle@secunet.com, manfred.lochter@bsi.bund.de +# RFC7861 || A. Adamson, N. Williams || andros@netapp.com, nico@cryptonector.com +# RFC7862 || T. Haynes || thomas.haynes@primarydata.com +# RFC7863 || T. Haynes || thomas.haynes@primarydata.com +# RFC7864 || CJ. Bernardos, Ed. || cjbc@it.uc3m.es +# RFC7865 || R. Ravindranath, P. Ravindran, P. Kyzivat || rmohanr@cisco.com, partha@parthasarathi.co.in, pkyzivat@alum.mit.edu +# RFC7866 || L. Portman, H. Lum, Ed., C. Eckel, A. Johnston, A. Hutton || leon.portman@gmail.com, henry.lum@genesyslab.com, eckelcu@cisco.com, alan.b.johnston@gmail.com, andrew.hutton@unify.com +# RFC7867 || R. Huang || rachel.huang@huawei.com +# RFC7868 || D. Savage, J. Ng, S. Moore, D. Slice, P. Paluch, R. White || dsavage@cisco.com, jamng@cisco.com, smoore@cisco.com, dslice@cumulusnetworks.com, peter.paluch@fri.uniza.sk, russ@riw.us +# RFC7869 || D. Warden, I. Iordanov || david_warden@dell.com, iiordanov@gmail.com +# RFC7870 || Y. Fu, S. Jiang, J. Dong, Y. Chen || fuyu@cnnic.cn, jiangsheng@huawei.com, knight.dongjiang@gmail.com, flashfoxmx@gmail.com +# RFC7871 || C. Contavalli, W. van der Gaast, D. Lawrence, W. Kumari || ccontavalli@google.com, wilmer@google.com, tale@akamai.com, warren@kumari.net +# RFC7872 || F. Gont, J. Linkova, T. Chown, W. Liu || fgont@si6networks.com, furry@google.com, tim.chown@jisc.ac.uk, liushucheng@huawei.com +# RFC7873 || D. Eastlake 3rd, M. Andrews || d3e3e3@gmail.com, marka@isc.org +# RFC7874 || JM. Valin, C. Bran || jmvalin@jmvalin.ca, cary.bran@plantronics.com +# RFC7875 || S. Proust, Ed. || stephane.proust@orange.com +# RFC7876 || S. Bryant, S. Sivabalan, S. Soni || stewart.bryant@gmail.com, msiva@cisco.com, sagsoni@cisco.com +# RFC7877 || K. Cartwright, V. Bhatia, S. Ali, D. Schwartz || kcartwright@tnsi.com, vbhatia@tnsi.com, syed.ali@neustar.biz, dschwartz@xconnect.net +# RFC7878 || K. Cartwright, V. Bhatia, J-F. Mule, A. Mayrhofer || kcartwright@tnsi.com, vbhatia@tnsi.com, jfmule@apple.com, alexander.mayrhofer@nic.at +# RFC7879 || R. Ravindranath, T. Reddy, G. Salgueiro, V. Pascual, P. Ravindran || rmohanr@cisco.com, tireddy@cisco.com, gsalguei@cisco.com, victor.pascual.avila@oracle.com, partha@parthasarathi.co.in +# RFC7880 || C. Pignataro, D. Ward, N. Akiya, M. Bhatia, S. Pallagatti || cpignata@cisco.com, wardd@cisco.com, nobo.akiya.dev@gmail.com, manav@ionosnetworks.com, santosh.pallagatti@gmail.com +# RFC7881 || C. Pignataro, D. Ward, N. Akiya || cpignata@cisco.com, wardd@cisco.com, nobo.akiya.dev@gmail.com +# RFC7882 || S. Aldrin, C. Pignataro, G. Mirsky, N. Kumar || aldrin.ietf@gmail.com, cpignata@cisco.com, gregory.mirsky@ericsson.com, naikumar@cisco.com +# RFC7883 || L. Ginsberg, N. Akiya, M. Chen || ginsberg@cisco.com, nobo.akiya.dev@gmail.com, mach.chen@huawei.com +# RFC7884 || C. Pignataro, M. Bhatia, S. Aldrin, T. Ranganath || cpignata@cisco.com, manav@ionosnetworks.com, aldrin.ietf@gmail.com, trilok.ranganatha@nokia.com +# RFC7885 || V. Govindan, C. Pignataro || venggovi@cisco.com, cpignata@cisco.com +# RFC7886 || V. Govindan, C. Pignataro || venggovi@cisco.com, cpignata@cisco.com +# RFC7887 || S. Venaas, J. Arango, I. Kouvelas || stig@cisco.com, jearango@cisco.com, kouvelas@arista.com +# RFC7888 || A. Melnikov, Ed. || alexey.melnikov@isode.com +# RFC7889 || J. SrimushnamBoovaraghamoorthy, N. Bisht || jayantheesh.sb@gmail.com, narendrasingh.bisht@gmail.com +# RFC7890 || D. Bryan, P. Matthews, E. Shim, D. Willis, S. Dawkins || dbryan@ethernot.org, philip_matthews@magma.ca, eunsooshim@gmail.com, dean.willis@softarmor.com, spencerdawkins.ietf@gmail.com +# RFC7891 || J. Asghar, IJ. Wijnands, Ed., S. Krishnaswamy, A. Karan, V. Arya || jasghar@cisco.com, ice@cisco.com, sowkrish@cisco.com, apoorva@cisco.com, varya@directv.com +# RFC7892 || Z. Ali, A. Bonfanti, M. Hartley, F. Zhang || zali@cisco.com, abonfant@cisco.com, mhartley@cisco.com, zhangfatai@huawei.com +# RFC7893 || Y(J) Stein, D. Black, B. Briscoe || yaakov_s@rad.com, david.black@emc.com, ietf@bobbriscoe.net +# RFC7894 || M. Pritikin, C. Wallace || pritikin@cisco.com, carl@redhoundsoftware.com +# RFC7895 || A. Bierman, M. Bjorklund, K. Watsen || andy@yumaworks.com, mbj@tail-f.com, kwatsen@juniper.net +# RFC7896 || D. Dhody || dhruv.ietf@gmail.com +# RFC7897 || D. Dhody, U. Palle, R. Casellas || dhruv.ietf@gmail.com, udayasree.palle@huawei.com, ramon.casellas@cttc.es +# RFC7898 || D. Dhody, U. Palle, V. Kondreddy, R. Casellas || dhruv.ietf@gmail.com, udayasree.palle@huawei.com, venugopalreddyk@huawei.com, ramon.casellas@cttc.es +# RFC7899 || T. Morin, Ed., S. Litkowski, K. Patel, Z. Zhang, R. Kebler, J. Haas || thomas.morin@orange.com, stephane.litkowski@orange.com, keyupate@cisco.com, zzhang@juniper.net, rkebler@juniper.net, jhaas@juniper.net +# RFC7900 || Y. Rekhter, Ed., E. Rosen, Ed., R. Aggarwal, Y. Cai, T. Morin || none, erosen@juniper.net, raggarwa_1@yahoo.com, yiqun.cai@alibaba-inc.com, thomas.morin@orange.com +# RFC7901 || P. Wouters || pwouters@redhat.com +# RFC7902 || E. Rosen, T. Morin || erosen@juniper.net, thomas.morin@orange.com +# RFC7903 || S. Leonard || dev+ietf@seantek.com +# RFC7904 || C. Jennings, B. Lowekamp, E. Rescorla, S. Baset, H. Schulzrinne, T. Schmidt, Ed. || fluffy@cisco.com, bbl@lowekamp.net, ekr@rtfm.com, sabaset@us.ibm.com, hgs@cs.columbia.edu, t.schmidt@haw-hamburg.de +# RFC7905 || A. Langley, W. Chang, N. Mavrogiannopoulos, J. Strombergson, S. Josefsson || agl@google.com, wtc@google.com, nmav@redhat.com, joachim@secworks.se, simon@josefsson.org +# RFC7906 || P. Timmel, R. Housley, S. Turner || pstimme@nsa.gov, housley@vigilsec.com, turners@ieca.com +# RFC7908 || K. Sriram, D. Montgomery, D. McPherson, E. Osterweil, B. Dickson || ksriram@nist.gov, dougm@nist.gov, dmcpherson@verisign.com, eosterweil@verisign.com, brian.peter.dickson@gmail.com +# RFC7909 || R. Kisteleki, B. Haberman || robert@ripe.net, brian@innovationslab.net +# RFC7910 || W. Zhou || zhouweiisu@gmail.com +# RFC7911 || D. Walton, A. Retana, E. Chen, J. Scudder || dwalton@cumulusnetworks.com, aretana@cisco.com, enkechen@cisco.com, jgs@juniper.net +# RFC7912 || A. Melnikov || alexey.melnikov@isode.com +# RFC7913 || C. Holmberg || christer.holmberg@ericsson.com +# RFC7914 || C. Percival, S. Josefsson || cperciva@tarsnap.com, simon@josefsson.org +# RFC7915 || C. Bao, X. Li, F. Baker, T. Anderson, F. Gont || congxiao@cernet.edu.cn, xing@cernet.edu.cn, fred@cisco.com, tore@redpill-linpro.com, fgont@si6networks.com +# RFC7916 || S. Litkowski, Ed., B. Decraene, C. Filsfils, K. Raza, M. Horneffer, P. Sarkar || stephane.litkowski@orange.com, bruno.decraene@orange.com, cfilsfil@cisco.com, skraza@cisco.com, Martin.Horneffer@telekom.de, pushpasis.ietf@gmail.com +# RFC7917 || P. Sarkar, Ed., H. Gredler, S. Hegde, S. Litkowski, B. Decraene || pushpasis.ietf@gmail.com, hannes@rtbrick.com, shraddha@juniper.net, stephane.litkowski@orange.com, bruno.decraene@orange.com +# RFC7918 || A. Langley, N. Modadugu, B. Moeller || agl@google.com, nagendra@cs.stanford.edu, bmoeller@acm.org +# RFC7919 || D. Gillmor || dkg@fifthhorseman.net +# RFC7920 || A. Atlas, Ed., T. Nadeau, Ed., D. Ward || akatlas@juniper.net, tnadeau@lucidvision.com, wardd@cisco.com +# RFC7921 || A. Atlas, J. Halpern, S. Hares, D. Ward, T. Nadeau || akatlas@juniper.net, joel.halpern@ericsson.com, shares@ndzh.com, wardd@cisco.com, tnadeau@lucidvision.com +# RFC7922 || J. Clarke, G. Salgueiro, C. Pignataro || jclarke@cisco.com, gsalguei@cisco.com, cpignata@cisco.com +# RFC7923 || E. Voit, A. Clemm, A. Gonzalez Prieto || evoit@cisco.com, alex@cisco.com, albertgo@cisco.com +# RFC7924 || S. Santesson, H. Tschofenig || sts@aaa-sec.com, Hannes.Tschofenig@gmx.net +# RFC7925 || H. Tschofenig, Ed., T. Fossati || Hannes.Tschofenig@gmx.net, thomas.fossati@nokia.com +# RFC7926 || A. Farrel, Ed., J. Drake, N. Bitar, G. Swallow, D. Ceccarelli, X. Zhang || adrian@olddog.co.uk, jdrake@juniper.net, nbitar40@gmail.com, swallow@cisco.com, daniele.ceccarelli@ericsson.com, zhang.xian@huawei.com +# RFC7927 || D. Kutscher, Ed., S. Eum, K. Pentikousis, I. Psaras, D. Corujo, D. Saucez, T. Schmidt, M. Waehlisch || kutscher@neclab.eu, suyong@ist.osaka-u.ac.jp, k.pentikousis@travelping.com, i.psaras@ucl.ac.uk, dcorujo@av.it.pt, damien.saucez@inria.fr, t.schmidt@haw-hamburg.de, waehlisch@ieee.org +# RFC7928 || N. Kuhn, Ed., P. Natarajan, Ed., N. Khademi, Ed., D. Ros || nicolas.kuhn@cnes.fr, prenatar@cisco.com, naeemk@ifi.uio.no, dros@simula.no +# RFC7929 || P. Wouters || pwouters@redhat.com +# RFC7930 || S. Hartman || hartmans-ietf@mit.edu +# RFC7931 || D. Noveck, Ed., P. Shivam, C. Lever, B. Baker || davenoveck@gmail.com, piyush.shivam@oracle.com, chuck.lever@oracle.com, bill.baker@oracle.com +# RFC7932 || J. Alakuijala, Z. Szabadka || jyrki@google.com, szabadka@google.com +# RFC7933 || C. Westphal, Ed., S. Lederer, D. Posch, C. Timmerer, A. Azgin, W. Liu, C. Mueller, A. Detti, D. Corujo, J. Wang, M. Montpetit, N. Murray || Cedric.Westphal@huawei.com, stefan.lederer@itec.aau.at, daniel.posch@itec.aau.at, christian.timmerer@itec.aau.at, aytac.azgin@huawei.com, liushucheng@huawei.com, christopher.mueller@bitmovin.net, andrea.detti@uniroma2.it, dcorujo@av.it.pt, jianwang@cityu.edu.hk, marie@mjmontpetit.com, nmurray@research.ait.ie +# RFC7934 || L. Colitti, V. Cerf, S. Cheshire, D. Schinazi || lorenzo@google.com, vint@google.com, cheshire@apple.com, dschinazi@apple.com +# RFC7935 || G. Huston, G. Michaelson, Ed. || gih@apnic.net, ggm@apnic.net +# RFC7936 || T. Hardie || ted.ietf@gmail.com +# RFC7937 || F. Le Faucheur, Ed., G. Bertrand, Ed., I. Oprescu, Ed., R. Peterkofsky || flefauch@gmail.com, gilbertrand@gmail.com, iuniana.oprescu@gmail.com, peterkofsky@google.com +# RFC7938 || P. Lapukhov, A. Premji, J. Mitchell, Ed. || petr@fb.com, ariff@arista.com, jrmitche@puck.nether.net +# RFC7939 || U. Herberg, R. Cole, I. Chakeres, T. Clausen || ulrich@herberg.name, rgcole01@comcast.net, ian.chakeres@gmail.com, T.Clausen@computer.org +# RFC7940 || K. Davies, A. Freytag || kim.davies@icann.org, asmus@unicode.org +# RFC7941 || M. Westerlund, B. Burman, R. Even, M. Zanaty || magnus.westerlund@ericsson.com, bo.burman@ericsson.com, roni.even@mail01.huawei.com, mzanaty@cisco.com +# RFC7942 || Y. Sheffer, A. Farrel || yaronf.ietf@gmail.com, adrian@olddog.co.uk +# RFC7943 || F. Gont, W. Liu || fgont@si6networks.com, liushucheng@huawei.com +# RFC7944 || S. Donovan || srdonovan@usdonovans.com +# RFC7945 || K. Pentikousis, Ed., B. Ohlman, E. Davies, S. Spirou, G. Boggia || k.pentikousis@travelping.com, Borje.Ohlman@ericsson.com, davieseb@scss.tcd.ie, spis@intracom-telecom.com, g.boggia@poliba.it +# RFC7946 || H. Butler, M. Daly, A. Doyle, S. Gillies, S. Hagen, T. Schaub || howard@hobu.co, martin.daly@cadcorp.com, adoyle@intl-interfaces.com, sean.gillies@gmail.com, stefan@hagen.link, tim.schaub@gmail.com +# RFC7947 || E. Jasinska, N. Hilliard, R. Raszuk, N. Bakker || elisa@bigwaveit.org, nick@inex.ie, robert@raszuk.net, nbakker@akamai.com +# RFC7948 || N. Hilliard, E. Jasinska, R. Raszuk, N. Bakker || nick@inex.ie, elisa@bigwaveit.org, robert@raszuk.net, nbakker@akamai.com +# RFC7949 || I. Chen, A. Lindem, R. Atkinson || ichen@kuatrotech.com, acee@cisco.com, rja.lists@gmail.com +# RFC7950 || M. Bjorklund, Ed. || mbj@tail-f.com +# RFC7951 || L. Lhotka || lhotka@nic.cz +# RFC7952 || L. Lhotka || lhotka@nic.cz +# RFC7953 || C. Daboo, M. Douglass || cyrus@daboo.name, mdouglass@sphericalcowgroup.com +# RFC7954 || L. Iannone, D. Lewis, D. Meyer, V. Fuller || ggx@gigix.net, darlewis@cisco.com, dmm@1-4-5.net, vaf@vaf.net +# RFC7955 || L. Iannone, R. Jorgensen, D. Conrad, G. Huston || ggx@gigix.net, rogerj@gmail.com, drc@virtualized.org, gih@apnic.net +# RFC7956 || W. Hao, Y. Li, A. Qu, M. Durrani, P. Sivamurugan || haoweiguo@huawei.com, liyizhou@huawei.com, laodulaodu@gmail.com, mdurrani@equinix.com, ponkarthick.sivamurugan@ipinfusion.com +# RFC7957 || B. Campbell, Ed., A. Cooper, B. Leiba || ben@nostrum.com, alcoop@cisco.com, barryleiba@computer.org +# RFC7958 || J. Abley, J. Schlyter, G. Bailey, P. Hoffman || jabley@dyn.com, jakob@kirei.se, guillaumebailey@outlook.com, paul.hoffman@icann.org +# RFC7959 || C. Bormann, Z. Shelby, Ed. || cabo@tzi.org, zach.shelby@arm.com +# RFC7960 || F. Martin, Ed., E. Lear, Ed., T. Draegen. Ed., E. Zwicky, Ed., K. Andersen, Ed. || fmartin@linkedin.com, lear@cisco.com, tim@dmarcian.com, zwicky@yahoo-inc.com, kandersen@linkedin.com +# RFC7961 || D. Eastlake 3rd, L. Yizhou || d3e3e3@gmail.com, liyizhou@huawei.com +# RFC7962 || J. Saldana, Ed., A. Arcia-Moret, B. Braem, E. Pietrosemoli, A. Sathiaseelan, M. Zennaro || jsaldana@unizar.es, andres.arcia@cl.cam.ac.uk, bart.braem@iminds.be, ermanno@ictp.it, arjuna.sathiaseelan@cl.cam.ac.uk, mzennaro@ictp.it +# RFC7963 || Z. Ali, A. Bonfanti, M. Hartley, F. Zhang || zali@cisco.com, abonfant@cisco.com, mhartley@cisco.com, zhangfatai@huawei.com +# RFC7964 || D. Walton, A. Retana, E. Chen, J. Scudder || dwalton@cumulusnetworks.com, aretana@cisco.com, enkechen@cisco.com, jgs@juniper.net +# RFC7965 || M. Chen, W. Cao, A. Takacs, P. Pan || mach.chen@huawei.com, wayne.caowei@huawei.com, attila.takacs@ericsson.com, none +# RFC7966 || H. Tschofenig, J. Korhonen, Ed., G. Zorn, K. Pillay || Hannes.tschofenig@gmx.net, jouni.nospam@gmail.com, glenzorn@gmail.com, kervin.pillay@gmail.com +# RFC7967 || A. Bhattacharyya, S. Bandyopadhyay, A. Pal, T. Bose || abhijan.bhattacharyya@tcs.com, soma.bandyopadhyay@tcs.com, arpan.pal@tcs.com, tulika.bose@tcs.com +# RFC7968 || Y. Li, D. Eastlake 3rd, W. Hao, H. Chen, S. Chatterjee || liyizhou@huawei.com, d3e3e3@gmail.com, haoweiguo@huawei.com, philips.chenhao@huawei.com, somnath.chatterjee01@gmail.com +# RFC7969 || T. Lemon, T. Mrugalski || ted.lemon@nominum.com, tomasz.mrugalski@gmail.com +# RFC7970 || R. Danyliw || rdd@cert.org +# RFC7971 || M. Stiemerling, S. Kiesel, M. Scharf, H. Seidel, S. Previdi || mls.ietf@gmail.com, ietf-alto@skiesel.de, michael.scharf@nokia.com, hseidel@benocs.com, sprevidi@cisco.com +# RFC7972 || P. Lemieux || pal@sandflow.com +# RFC7973 || R. Droms, P. Duffy || rdroms.ietf@gmail.com, paduffy@cisco.com +# RFC7974 || B. Williams, M. Boucadair, D. Wing || brandon.williams@akamai.com, mohamed.boucadair@orange.com, dwing-ietf@fuggles.com +# RFC7975 || B. Niven-Jenkins, Ed., R. van Brandenburg, Ed. || ben.niven-jenkins@nokia.com, ray.vanbrandenburg@tno.nl +# RFC7976 || C. Holmberg, N. Biondic, G. Salgueiro || christer.holmberg@ericsson.com, nevenka.biondic@ericsson.com, gsalguei@cisco.com +# RFC7977 || P. Dunkley, G. Llewellyn, V. Pascual, G. Salgueiro, R. Ravindranath || peter.dunkley@xura.com, gavin.llewellyn@xura.com, victor.pascual.avila@oracle.com, gsalguei@cisco.com, rmohanr@cisco.com +# RFC7978 || D. Eastlake 3rd, M. Umair, Y. Li || d3e3e3@gmail.com, mohammed.umair2@gmail.com, liyizhou@huawei.com +# RFC7979 || E. Lear, Ed., R. Housley, Ed. || lear@cisco.com, housley@vigilsec.com +# RFC7980 || M. Behringer, A. Retana, R. White, G. Huston || mbehring@cisco.com, aretana@cisco.com, russw@riw.us, gih@apnic.net +# RFC7981 || L. Ginsberg, S. Previdi, M. Chen || ginsberg@cisco.com, sprevidi@cisco.com, mach.chen@huawei.com +# RFC7982 || P. Martinsen, T. Reddy, D. Wing, V. Singh || palmarti@cisco.com, tireddy@cisco.com, dwing-ietf@fuggles.com, varun@callstats.io +# RFC7983 || M. Petit-Huguenin, G. Salgueiro || marc@petit-huguenin.org, gsalguei@cisco.com +# RFC7984 || O. Johansson, G. Salgueiro, V. Gurbani, D. Worley, Ed. || oej@edvina.net, gsalguei@cisco.com, vkg@bell-labs.com, worley@ariadne.com +# RFC7985 || J. Yi, T. Clausen, U. Herberg || jiazi@jiaziyi.com, T.Clausen@computer.org, ulrich@herberg.name +# RFC7986 || C. Daboo || cyrus@daboo.name +# RFC7987 || L. Ginsberg, P. Wells, B. Decraene, T. Przygienda, H. Gredler || ginsberg@cisco.com, pauwells@cisco.com, bruno.decraene@orange.com, prz@juniper.net, hannes@rtbrick.com +# RFC7988 || E. Rosen, Ed., K. Subramanian, Z. Zhang || erosen@juniper.net, karthik@sproute.com, zzhang@juniper.net +# RFC7989 || P. Jones, G. Salgueiro, C. Pearce, P. Giralt || paulej@packetizer.com, gsalguei@cisco.com, chrep@cisco.com, pgiralt@cisco.com +# RFC7990 || H. Flanagan || rse@rfc-editor.org +# RFC7991 || P. Hoffman || paul.hoffman@icann.org +# RFC7992 || J. Hildebrand, Ed., P. Hoffman || joe-ietf@cursive.net, paul.hoffman@icann.org +# RFC7993 || H. Flanagan || rse@rfc-editor.org +# RFC7994 || H. Flanagan || rse@rfc-editor.org +# RFC7995 || T. Hansen, Ed., L. Masinter, M. Hardy || tony@att.com, masinter@adobe.com, mahardy@adobe.com +# RFC7996 || N. Brownlee || n.brownlee@auckland.ac.nz +# RFC7997 || H. Flanagan, Ed. || rse@rfc-editor.org +# RFC7998 || P. Hoffman, J. Hildebrand || paul.hoffman@icann.org, joe-ietf@cursive.net +# RFC7999 || T. King, C. Dietzel, J. Snijders, G. Doering, G. Hankins || thomas.king@de-cix.net, christoph.dietzel@de-cix.net, job@ntt.net, gert@space.net, greg.hankins@nokia.com +# RFC8000 || A. Adamson, N. Williams || andros@netapp.com, nico@cryptonector.com +# RFC8001 || F. Zhang, Ed., O. Gonzalez de Dios, Ed., C. Margaria, M. Hartley, Z. Ali || zhangfatai@huawei.com, oscar.gonzalezdedios@telefonica.com, cmargaria@juniper.net, mhartley@cisco.com, zali@cisco.com +# RFC8002 || T. Heer, S. Varjonen || heer@hs-albsig.de, samu.varjonen@helsinki.fi +# RFC8003 || J. Laganier, L. Eggert || julien.ietf@gmail.com, lars@netapp.com +# RFC8004 || J. Laganier, L. Eggert || julien.ietf@gmail.com, lars@netapp.com +# RFC8005 || J. Laganier || julien.ietf@gmail.com +# RFC8006 || B. Niven-Jenkins, R. Murray, M. Caulfield, K. Ma || ben.niven-jenkins@nokia.com, rob.murray@nokia.com, mcaulfie@cisco.com, kevin.j.ma@ericsson.com +# RFC8007 || R. Murray, B. Niven-Jenkins || rob.murray@nokia.com, ben.niven-jenkins@nokia.com +# RFC8008 || J. Seedorf, J. Peterson, S. Previdi, R. van Brandenburg, K. Ma || jan.seedorf@hft-stuttgart.de, jon.peterson@neustar.biz, sprevidi@cisco.com, ray.vanbrandenburg@tno.nl, kevin.j.ma@ericsson.com +# RFC8009 || M. Jenkins, M. Peck, K. Burgin || mjjenki@tycho.ncsc.mil, mpeck@mitre.org, kelley.burgin@gmail.com +# RFC8010 || M. Sweet, I. McDonald || msweet@apple.com, blueroofmusic@gmail.com +# RFC8011 || M. Sweet, I. McDonald || msweet@apple.com, blueroofmusic@gmail.com +# RFC8012 || N. Akiya, G. Swallow, C. Pignataro, A. Malis, S. Aldrin || nobo.akiya.dev@gmail.com, swallow@cisco.com, cpignata@cisco.com, agmalis@gmail.com, aldrin.ietf@gmail.com +# RFC8013 || D. Joachimpillai, J. Hadi Salim || damascene.joachimpillai@verizon.com, hadi@mojatatu.com +# RFC8014 || D. Black, J. Hudson, L. Kreeger, M. Lasserre, T. Narten || david.black@dell.com, jon.hudson@gmail.com, lkreeger@gmail.com, mmlasserre@gmail.com, narten@us.ibm.com +# RFC8015 || V. Singh, C. Perkins, A. Clark, R. Huang || varun@callstats.io, csp@csperkins.org, alan.d.clark@telchemy.com, Rachel@huawei.com +# RFC8016 || T. Reddy, D. Wing, P. Patil, P. Martinsen || tireddy@cisco.com, dwing-ietf@fuggles.com, praspati@cisco.com, palmarti@cisco.com +# RFC8017 || K. Moriarty, Ed., B. Kaliski, J. Jonsson, A. Rusch || Kathleen.Moriarty@emc.com, bkaliski@verisign.com, jakob.jonsson@subset.se, andreas.rusch@rsa.com +# RFC8018 || K. Moriarty, Ed., B. Kaliski, A. Rusch || Kathleen.Moriarty@Dell.com, bkaliski@verisign.com, andreas.rusch@rsa.com +# RFC8019 || Y. Nir, V. Smyslov || ynir.ietf@gmail.com, svan@elvis.ru +# RFC8020 || S. Bortzmeyer, S. Huque || bortzmeyer+ietf@nic.fr, shuque@verisign.com +# RFC8021 || F. Gont, W. Liu, T. Anderson || fgont@si6networks.com, liushucheng@huawei.com, tore@redpill-linpro.com +# RFC8022 || L. Lhotka, A. Lindem || lhotka@nic.cz, acee@cisco.com +# RFC8023 || M. Thomas, A. Mankin, L. Zhang || mthomas@verisign.com, allison.mankin@gmail.com, lixia@cs.ucla.edu +# RFC8024 || Y. Jiang, Ed., Y. Luo, E. Mallette, Ed., Y. Shen, W. Cheng || jiangyuanlong@huawei.com, dennis.luoyong@huawei.com, edwin.mallette@gmail.com, yshen@juniper.net, chengweiqiang@chinamobile.com +# RFC8025 || P. Thubert, Ed., R. Cragie || pthubert@cisco.com, robert.cragie@gridmerge.com +# RFC8026 || M. Boucadair, I. Farrer || mohamed.boucadair@orange.com, ian.farrer@telekom.de +# RFC8027 || W. Hardaker, O. Gudmundsson, S. Krishnaswamy || ietf@hardakers.net, olafur+ietf@cloudflare.com, suresh@tislabs.com +# RFC8028 || F. Baker, B. Carpenter || fredbaker.ietf@gmail.com, brian.e.carpenter@gmail.com +# RFC8029 || K. Kompella, G. Swallow, C. Pignataro, Ed., N. Kumar, S. Aldrin, M. Chen || kireeti.kompella@gmail.com, swallow.ietf@gmail.com, cpignata@cisco.com, naikumar@cisco.com, aldrin.ietf@gmail.com, mach.chen@huawei.com +# RFC8030 || M. Thomson, E. Damaggio, B. Raymor, Ed. || martin.thomson@gmail.com, elioda@microsoft.com, brian.raymor@microsoft.com +# RFC8031 || Y. Nir, S. Josefsson || ynir.ietf@gmail.com, simon@josefsson.org +# RFC8032 || S. Josefsson, I. Liusvaara || simon@josefsson.org, ilariliusvaara@welho.com +# RFC8033 || R. Pan, P. Natarajan, F. Baker, G. White || ropan@cisco.com, prenatar@cisco.com, fredbaker.ietf@gmail.com, g.white@cablelabs.com +# RFC8034 || G. White, R. Pan || g.white@cablelabs.com, ropan@cisco.com +# RFC8035 || C. Holmberg || christer.holmberg@ericsson.com +# RFC8036 || N. Cam-Winget, Ed., J. Hui, D. Popa || ncamwing@cisco.com, jonhui@nestlabs.com, daniel.popa@itron.com +# RFC8037 || I. Liusvaara || ilariliusvaara@welho.com +# RFC8039 || A. Shpiner, R. Tse, C. Schelp, T. Mizrahi || alexshp@mellanox.com, Richard.Tse@microsemi.com, craig.schelp@oracle.com, talmi@marvell.com +# RFC8040 || A. Bierman, M. Bjorklund, K. Watsen || andy@yumaworks.com, mbj@tail-f.com, kwatsen@juniper.net +# RFC8041 || O. Bonaventure, C. Paasch, G. Detal || Olivier.Bonaventure@uclouvain.be, cpaasch@apple.com, gregory.detal@tessares.net +# RFC8042 || Z. Zhang, L. Wang, A. Lindem || zzhang@juniper.net, liliw@juniper.net, acee@cisco.com +# RFC8043 || B. Sarikaya, M. Boucadair || sarikaya@ieee.org, mohamed.boucadair@orange.com +# RFC8044 || A. DeKok || aland@freeradius.org +# RFC8045 || D. Cheng, J. Korhonen, M. Boucadair, S. Sivakumar || dean.cheng@huawei.com, jouni.nospam@gmail.com, mohamed.boucadair@orange.com, ssenthil@cisco.com +# RFC8046 || T. Henderson, Ed., C. Vogt, J. Arkko || tomhend@u.washington.edu, mail@christianvogt.net, jari.arkko@piuha.net +# RFC8047 || T. Henderson, Ed., C. Vogt, J. Arkko || tomhend@u.washington.edu, mail@christianvogt.net, jari.arkko@piuha.net +# RFC8048 || P. Saint-Andre || peter@filament.com +# RFC8049 || S. Litkowski, L. Tomotaki, K. Ogaki || stephane.litkowski@orange.com, luis.tomotaki@verizon.com, ke-oogaki@kddi.com +# RFC8051 || X. Zhang, Ed., I. Minei, Ed. || zhang.xian@huawei.com, inaminei@google.com +# RFC8053 || Y. Oiwa, H. Watanabe, H. Takagi, K. Maeda, T. Hayashi, Y. Ioku || y.oiwa@aist.go.jp, h-watanabe@aist.go.jp, takagi.hiromitsu@aist.go.jp, maeda@lepidum.co.jp, hayashi@lepidum.co.jp, mutual-work@ioku.org +# RFC8054 || K. Murchison, J. Elie || murch@andrew.cmu.edu, julien@trigofacile.com +# RFC8055 || C. Holmberg, Y. Jiang || christer.holmberg@ericsson.com, jiangyi@chinamobile.com +# RFC8056 || J. Gould || jgould@verisign.com +# RFC8057 || B. Stark, D. Sinicrope, W. Lupton || barbara.stark@att.com, david.sinicrope@ericsson.com, wlupton@broadband-forum.org +# RFC8058 || J. Levine, T. Herkula || standards@taugh.com, t.herkula@optivo.com +# RFC8059 || J. Arango, S. Venaas, I. Kouvelas, D. Farinacci || jearango@cisco.com, stig@cisco.com, kouvelas@arista.com, farinacci@gmail.com +# RFC8060 || D. Farinacci, D. Meyer, J. Snijders || farinacci@gmail.com, dmm@1-4-5.net, job@ntt.net +# RFC8061 || D. Farinacci, B. Weis || farinacci@gmail.com, bew@cisco.com +# RFC8062 || L. Zhu, P. Leach, S. Hartman, S. Emery, Ed. || larry.zhu@microsoft.com, pauljleach@msn.com, hartmans-ietf@mit.edu, shawn.emery@gmail.com +# RFC8063 || H.W. Ribbers, M.W. Groeneweg, R. Gieben, A.L.J. Verschuren || rik.ribbers@sidn.nl, marc.groeneweg@sidn.nl, miek@miek.nl, ietf@antoin.nl +# RFC8064 || F. Gont, A. Cooper, D. Thaler, W. Liu || fgont@si6networks.com, alcoop@cisco.com, dthaler@microsoft.com, liushucheng@huawei.com +# RFC8065 || D. Thaler || dthaler@microsoft.com +# RFC8066 || S. Chakrabarti, G. Montenegro, R. Droms, J. Woodyatt || samitac.ietf@gmail.com, Gabriel.Montenegro@microsoft.com, rdroms.ietf@gmail.com, jhw@google.com +# RFC8067 || B. Leiba || barryleiba@computer.org +# RFC8068 || R. Ravindranath, P. Ravindran, P. Kyzivat || rmohanr@cisco.com, partha@parthasarathi.co.in, pkyzivat@alum.mit.edu +# RFC8069 || A. Thomas || a.n.thomas@ieee.org +# RFC8070 || M. Short, Ed., S. Moore, P. Miller || michikos@microsoft.com, sethmo@microsoft.com, paumil@microsoft.com +# RFC8071 || K. Watsen || kwatsen@juniper.net +# RFC8072 || A. Bierman, M. Bjorklund, K. Watsen || andy@yumaworks.com, mbj@tail-f.com, kwatsen@juniper.net +# RFC8073 || K. Moriarty, M. Ford || Kathleen.Moriarty@dell.com, ford@isoc.org +# RFC8074 || J. Bi, G. Yao, J. Halpern, E. Levy-Abegnoli, Ed. || junbi@tsinghua.edu.cn, yaoguang.china@gmail.com, joel.halpern@ericsson.com, elevyabe@cisco.com +# RFC8075 || A. Castellani, S. Loreto, A. Rahman, T. Fossati, E. Dijk || angelo@castellani.net, Salvatore.Loreto@ericsson.com, Akbar.Rahman@InterDigital.com, thomas.fossati@nokia.com, esko.dijk@philips.com +# RFC8076 || A. Knauf, T. Schmidt, Ed., G. Hege, M. Waehlisch || alexanderknauf@gmail.com, t.schmidt@haw-hamburg.de, hege@daviko.com, mw@link-lab.net +# RFC8077 || L. Martini, Ed., G. Heron, Ed. || lmartini@monoski.com, giheron@cisco.com +# RFC8078 || O. Gudmundsson, P. Wouters || olafur+ietf@cloudflare.com, pwouters@redhat.com +# RFC8079 || L. Miniero, S. Garcia Murillo, V. Pascual || lorenzo@meetecho.com, sergio.garcia.murillo@gmail.com, victor.pascual.avila@oracle.com +# RFC8080 || O. Sury, R. Edmonds || ondrej.sury@nic.cz, edmonds@mycre.ws +# RFC8081 || C. Lilley || chris@w3.org +# RFC8082 || S. Wenger, J. Lennox, B. Burman, M. Westerlund || stewe@stewe.org, jonathan@vidyo.com, bo.burman@ericsson.com, magnus.westerlund@ericsson.com +# RFC8083 || C. Perkins, V. Singh || csp@csperkins.org, varun@callstats.io +# RFC8084 || G. Fairhurst || gorry@erg.abdn.ac.uk +# RFC8085 || L. Eggert, G. Fairhurst, G. Shepherd || lars@netapp.com, gorry@erg.abdn.ac.uk, gjshep@gmail.com +# RFC8086 || L. Yong, Ed., E. Crabbe, X. Xu, T. Herbert || lucy.yong@huawei.com, edward.crabbe@gmail.com, xuxiaohu@huawei.com, tom@herbertland.com +# RFC8087 || G. Fairhurst, M. Welzl || gorry@erg.abdn.ac.uk, michawe@ifi.uio.no +# RFC8089 || M. Kerwin || matthew.kerwin@qut.edu.au +# RFC8090 || R. Housley || housley@vigilsec.com +# RFC8091 || E. Wilde || erik.wilde@dret.net +# RFC8092 || J. Heitz, Ed., J. Snijders, Ed., K. Patel, I. Bagdonas, N. Hilliard || jheitz@cisco.com, job@ntt.net, keyur@arrcus.com, ibagdona.ietf@gmail.com, nick@inex.ie +# RFC8093 || J. Snijders || job@ntt.net +# RFC8094 || T. Reddy, D. Wing, P. Patil || tireddy@cisco.com, dwing-ietf@fuggles.com, praspati@cisco.com +# RFC8095 || G. Fairhurst, Ed., B. Trammell, Ed., M. Kuehlewind, Ed. || gorry@erg.abdn.ac.uk, ietf@trammell.ch, mirja.kuehlewind@tik.ee.ethz.ch +# RFC8096 || B. Fenner || fenner@fenron.com +# RFC8097 || P. Mohapatra, K. Patel, J. Scudder, D. Ward, R. Bush || mpradosh@yahoo.com, keyur@arrcus.com, jgs@juniper.net, dward@cisco.com, randy@psg.com +# RFC8098 || T. Hansen, Ed., A. Melnikov, Ed. || tony@att.com, alexey.melnikov@isode.com +# RFC8099 || H. Chen, R. Li, A. Retana, Y. Yang, Z. Liu || huaimo.chen@huawei.com, renwei.li@huawei.com, aretana@cisco.com, yyang1998@gmail.com, liu.cmri@gmail.com +# RFC8100 || R. Geib, Ed., D. Black || Ruediger.Geib@telekom.de, david.black@dell.com +# RFC8101 || C. Holmberg, J. Axell || christer.holmberg@ericsson.com, jorgen.axell@ericsson.com +# RFC8102 || P. Sarkar, Ed., S. Hegde, C. Bowers, H. Gredler, S. Litkowski || pushpasis.ietf@gmail.com, shraddha@juniper.net, cbowers@juniper.net, hannes@rtbrick.com, stephane.litkowski@orange.com +# RFC8103 || R. Housley || housley@vigilsec.com +# RFC8104 || Y. Shen, R. Aggarwal, W. Henderickx, Y. Jiang || yshen@juniper.net, raggarwa_1@yahoo.com, wim.henderickx@nokia.com, jiangyuanlong@huawei.com +# RFC8106 || J. Jeong, S. Park, L. Beloeil, S. Madanapalli || pauljeong@skku.edu, soohong.park@samsung.com, luc.beloeil@orange.com, smadanapalli@gmail.com +# RFC8107 || J. Wold || jwold@ad-id.org +# RFC8108 || J. Lennox, M. Westerlund, Q. Wu, C. Perkins || jonathan@vidyo.com, magnus.westerlund@ericsson.com, bill.wu@huawei.com, csp@csperkins.org +# RFC8109 || P. Koch, M. Larson, P. Hoffman || pk@DENIC.DE, matt.larson@icann.org, paul.hoffman@icann.org +# RFC8110 || D. Harkins, Ed., W. Kumari, Ed. || dharkins@arubanetworks.com, warren@kumari.net +# RFC8113 || M. Boucadair, C. Jacquenet || mohamed.boucadair@orange.com, christian.jacquenet@orange.com +# RFC8114 || M. Boucadair, C. Qin, C. Jacquenet, Y. Lee, Q. Wang || mohamed.boucadair@orange.com, jacni@jacni.com, christian.jacquenet@orange.com, yiu_lee@cable.comcast.com, 13301168516@189.cn +# RFC8115 || M. Boucadair, J. Qin, T. Tsou, X. Deng || mohamed.boucadair@orange.com, jacni@jacni.com, tina.tsou@philips.com, dxhbupt@gmail.com +# RFC8117 || C. Huitema, D. Thaler, R. Winter || huitema@huitema.net, dthaler@microsoft.com, rolf.winter@hs-augsburg.de +# RFC8118 || M. Hardy, L. Masinter, D. Markovic, D. Johnson, M. Bailey || mahardy@adobe.com, masinter@adobe.com, dmarkovi@adobe.com, duff.johnson@pdfa.org, martin.bailey@globalgraphics.com +# RFC8119 || M. Mohali, M. Barnes || marianne.mohali@orange.com, mary.ietf.barnes@gmail.com +# RFC8120 || Y. Oiwa, H. Watanabe, H. Takagi, K. Maeda, T. Hayashi, Y. Ioku || y.oiwa@aist.go.jp, h-watanabe@aist.go.jp, takagi.hiromitsu@aist.go.jp, kaorumaeda.ml@gmail.com, hayashi@lepidum.co.jp, mutual-work@ioku.org +# RFC8121 || Y. Oiwa, H. Watanabe, H. Takagi, K. Maeda, T. Hayashi, Y. Ioku || y.oiwa@aist.go.jp, h-watanabe@aist.go.jp, takagi.hiromitsu@aist.go.jp, kaorumaeda.ml@gmail.com, hayashi@lepidum.co.jp, mutual-work@ioku.org +# RFC8122 || J. Lennox, C. Holmberg || jonathan@vidyo.com, christer.holmberg@ericsson.com +# RFC8123 || P. Dawes, C. Arunachalam || peter.dawes@vodafone.com, carunach@cisco.com +# RFC8124 || R. Ravindranath, G. Salgueiro || rmohanr@cisco.com, gsalguei@cisco.com +# RFC8128 || C. Morgan || cmorgan@amsl.com +# RFC8129 || A. Jain, N. Kinder, N. McCallum || ajain323@gatech.edu, nkinder@redhat.com, npmccallum@redhat.com +# RFC8130 || V. Demjanenko, D. Satterlee || victor.demjanenko@vocal.com, david.satterlee@vocal.com +# RFC8131 || X. Zhang, H. Zheng, Ed., R. Gandhi, Ed., Z. Ali, P. Brzozowski || zhang.xian@huawei.com, zhenghaomian@huawei.com, rgandhi@cisco.com, zali@cisco.com, pbrzozowski@advaoptical.com +# RFC8132 || P. van der Stok, C. Bormann, A. Sehgal || consultancy@vanderstok.org, cabo@tzi.org, anuj.sehgal@navomi.com +# RFC8133 || S. Smyshlyaev. Ed., E. Alekseev, I. Oshkin, V. Popov || svs@cryptopro.ru, alekseev@cryptopro.ru, oshkin@cryptopro.ru, vpopov@cryptopro.ru +# RFC8135 || M. Danielson, M. Nilsson || magda@netinsight.net, mansaxel@besserwisser.org +# RFC8136 || B. Carpenter, R. Hinden || brian.e.carpenter@gmail.com, bob.hinden@gmail.com +# RFC8138 || P. Thubert, Ed., C. Bormann, L. Toutain, R. Cragie || pthubert@cisco.com, cabo@tzi.org, Laurent.Toutain@IMT-Atlantique.fr, robert.cragie@arm.com +# RFC8140 || A. Farrel || adrian@olddog.co.uk +# RFC8144 || K. Murchison || murch@andrew.cmu.edu +# RFC8145 || D. Wessels, W. Kumari, P. Hoffman || dwessels@verisign.com, warren@kumari.net, paul.hoffman@icann.org""".split('\n') + + +# # Many of these are addresses that the draft parser found incorrectly +# ignore_addresses =[ +# '0004454742@mcimail.com', +# '0006423401@mcimail.com', +# 'cabo@tzi.orgemail', +# 'california@san', +# 'cdl@rincon.com', +# 'hss@lando.hns.com', +# 'ietf-info@cnri.reston.va.us', +# 'illinois@urbana-champaign', +# 'jasdips@rwhois.net', +# 'labs@network', +# 'member@the', +# 'park@mit', +# 'research@icsi', +# 'research@isci', +# 'technopark@chaichee', +# 'texas@arlington', +# 'ura-bunyip@bunyip.com', +# ] + +# def get_rfc_data(): +# author_names = dict() +# author_emails = dict() +# for line in rfced_data: +# (rfc,names,emails) = line.split('||') +# rfc = int(rfc.lower().strip()[3:]) +# author_names[rfc] = [ x for x in map(str.lower,map(str.strip,names.split(','))) if x not in ['Ed.', 'ed.', '' ] ] +# author_emails[rfc] = [ x for x in map(unicode,map(str.lower,map(str.strip,emails.split(',')))) if x not in [ '', ] ] +# return author_names, author_emails + +# def get_all_the_email(): +# all_the_email = Email.objects.all() +# for e in all_the_email: +# e.l_address = e.address.lower() +# return all_the_email + +# def get_matching_emails(all_the_email,addrlist): +# """ Find Email objects with addresses case-insensitively matching things in the supplied list (for lack of __iin) """ +# l_addrlist = map(unicode.lower,addrlist) +# return [ e for e in all_the_email if e.l_address in l_addrlist ] + +# def show_verbose(rfc_num,*args): +# print "rfc%-4d :"%rfc_num,' '.join(map(str,args)) + +# ParsedAuthor = namedtuple('ParsedAuthor',['name','address']) + +# def get_parsed_authors(rfc_num): +# h,n = mkstemp() +# os.close(h) +# f = open(n,"w") +# f.write('%s/rfc%d.txt\n'%(settings.RFC_PATH,rfc_num)) +# f.close() +# lines = subprocess.check_output(['ietf/utils/draft.py','-a',n]) +# os.unlink(n) +# if not 'docauthors ' in lines: +# return [] +# authorline = [l for l in lines.split('\n') if l.startswith('docauthors ')][0] +# authstrings = authorline.split(':')[1].split(',') +# retval = [] +# for a in authstrings: +# if '<' in a: +# retval.append(ParsedAuthor(a[:a.find('<')].strip(),a[a.find('<'):a.find('>')][1:])) +# else: +# retval.append(ParsedAuthor(a.strip(),None)) + +# return retval + +# def calculate_changes(tracker_persons,tracker_emails,names,emails): +# adds = set() +# deletes = set() +# for email in emails: +# if email and email!='none' and email not in ignore_addresses: +# p = Person.objects.filter(email__address=email).first() +# if p: +# if not set(map(unicode.lower,p.email_set.values_list('address',flat=True))).intersection(tracker_emails): +# adds.add(email) +# else: +# #person_name = names[emails.index(email)] +# adds.add(email) +# for person in tracker_persons: +# if not set(map(unicode.lower,person.email_set.values_list('address',flat=True))).intersection(emails): +# match = False +# for index in [i for i,j in enumerate(emails) if j=='none' or not j]: +# if names[index].split()[-1].lower()==person.last_name().lower(): +# match = True +# if not match: +# deletes.add(person) +# return adds, deletes + +# def _main(): + +# parser = argparse.ArgumentParser(description="Recalculate RFC documentauthor_set"+'\n\n'+__doc__, +# formatter_class=argparse.RawDescriptionHelpFormatter,) +# parser.add_argument('-v','--verbose',help="Show the action taken for each RFC",action='store_true') +# parser.add_argument('--rfc',type=int, nargs='*',help="Only recalculate the given rfc numbers",dest='rfcnumberlist') +# args = parser.parse_args() + +# probable_email_match = set() +# probable_duplicates = [] + +# all_the_email = get_all_the_email() +# author_names, author_emails = get_rfc_data() + +# stats = { 'rfc not in tracker' :0, +# 'same addresses' :0, +# 'different addresses belonging to same people' :0, +# 'same names, rfced emails do not match' :0, +# 'rfced data is unusable' :0, +# "data doesn't match but no changes found" :0, +# 'changed authors' :0, } + +# for rfc_num in args.rfcnumberlist or sorted(author_names.keys()): + +# rfc = Document.objects.filter(docalias__name='rfc%s'%rfc_num).first() + +# if not rfc: +# if args.verbose: +# show_verbose(rfc_num,'rfc not in tracker') +# stats['rfc not in tracker'] += 1 +# continue + +# rfced_emails = set(author_emails[rfc_num]) +# tracker_emails = set(map(unicode.lower,rfc.authors.values_list('address',flat=True))) +# tracker_persons = set([x.person for x in rfc.authors.all()]) +# matching_emails = get_matching_emails(all_the_email,rfced_emails) +# rfced_persons = set([x.person for x in matching_emails]) +# known_emails = set([e.l_address for e in matching_emails]) +# unknown_emails = rfced_emails - known_emails +# unknown_persons = tracker_persons-rfced_persons + +# rfced_lastnames = sorted([n.split()[-1].lower() for n in author_names[rfc_num]]) +# tracker_lastnames = sorted([p.last_name().lower() for p in tracker_persons]) + +# if rfced_emails == tracker_emails: +# if args.verbose: +# show_verbose(rfc_num,'tracker and rfc editor have the same addresses') +# stats['same addresses'] += 1 +# continue + +# if len(rfced_emails)==len(tracker_emails) and not 'none' in author_emails[rfc_num]: +# if tracker_persons == rfced_persons: +# if args.verbose: +# show_verbose(rfc_num,'tracker and rfc editor have the different addresses belonging to same people') +# stats['different addresses belonging to same people'] += 1 +# continue +# else: +# if len(unknown_emails)==1 and len(tracker_persons-rfced_persons)==1: +# p = list(tracker_persons-rfced_persons)[0] +# probable_email_match.add(u"%s is probably %s (%s) : %s "%(list(unknown_emails)[0], p, p.pk, rfc_num)) +# elif len(unknown_emails)==len(unknown_persons): +# probable_email_match.add(u"%s are probably %s : %s"%(unknown_emails,[(p.ascii,p.pk) for p in unknown_persons],rfc_num)) +# else: +# probable_duplicates.append((tracker_persons^rfced_persons,rfc_num)) + +# if tracker_lastnames == rfced_lastnames: +# if args.verbose: +# show_verbose(rfc_num,"emails don't match up, but person names appear to be the same") +# stats[ 'same names, rfced emails do not match'] += 1 +# continue + +# use_rfc_data = bool(len(author_emails[rfc_num])==len(author_names[rfc_num])) +# if not use_rfc_data: +# if args.verbose: +# print 'Ignoring rfc database for rfc%d'%rfc_num +# stats[ 'rfced data is unusable'] += 1 + +# if use_rfc_data: +# adds, deletes = calculate_changes(tracker_persons,tracker_emails,author_names[rfc_num],author_emails[rfc_num]) +# parsed_authors=get_parsed_authors(rfc_num) +# parsed_adds, parsed_deletes = calculate_changes(tracker_persons,tracker_emails,[x.name for x in parsed_authors],[x.address for x in parsed_authors]) + +# for e in adds.union(parsed_adds) if use_rfc_data else parsed_adds: +# if not e or e in ignore_addresses: +# continue +# if not Person.objects.filter(email__address=e).exists(): +# if e not in parsed_adds: +# #print rfc_num,"Would add",e,"as",author_names[rfc_num][author_emails[rfc_num].index(e)],"(rfced database)" +# print "(address='%s',name='%s'),"%(e,author_names[rfc_num][author_emails[rfc_num].index(e)]),"# (rfced %d)"%rfc_num +# for p in Person.objects.filter(name__iendswith=author_names[rfc_num][author_emails[rfc_num].index(e)].split(' ')[-1]): +# print "\t", p.pk, p.ascii +# else: +# name = [x.name for x in parsed_authors if x.address==e][0] +# p = Person.objects.filter(name=name).first() +# if p: +# #print e,"is probably",p.pk,p +# print "'%s': %d, # %s (%d)"%(e,p.pk,p.ascii,rfc_num) + +# else: +# p = Person.objects.filter(ascii=name).first() +# if p: +# print e,"is probably",p.pk,p +# print "'%s': %d, # %s (%d)"%(e,p.pk,p.ascii,rfc_num) +# else: +# p = Person.objects.filter(ascii_short=name).first() +# if p: +# print e,"is probably",p.pk,p +# print "'%s': %d, # %s (%d)"%(e,p.pk,p.ascii,rfc_num) +# #print rfc_num,"Would add",e,"as",name,"(parsed)" +# print "(address='%s',name='%s'),"%(e,name),"# (parsed %d)"%rfc_num +# for p in Person.objects.filter(name__iendswith=name.split(' ')[-1]): +# print "\t", p.pk, p.ascii + +# if False: # This was a little useful, but the noise in the rfc_ed file keeps it from being completely useful +# for p in deletes: +# for n in author_names[rfc_num]: +# if p.last_name().lower()==n.split()[-1].lower(): +# email_candidate = author_emails[rfc_num][author_names[rfc_num].index(n)] +# email_found = Email.objects.filter(address=email_candidate).first() +# if email_found: +# probable_duplicates.append((set([p,email_found.person]),rfc_num)) +# else: +# probable_email_match.add(u"%s is probably %s (%s) : %s"%(email_candidate, p, p.pk, rfc_num)) + +# if args.verbose: +# if use_rfc_data: +# working_adds = parsed_adds +# seen_people = set(Email.objects.get(address=e).person for e in parsed_adds) +# for addr in adds: +# person = Email.objects.get(address=addr).person +# if person not in seen_people: +# working_adds.add(addr) +# seen_people.add(person) +# working_deletes = deletes.union(parsed_deletes) +# else: +# working_adds = parsed_adds +# working_deletes = parsed_deletes +# # unique_adds = set() # TODO don't add different addresses for the same person from the two sources +# if working_adds or working_deletes: +# show_verbose(rfc_num,"Changing original list",tracker_persons,"by adding",working_adds," and deleting",working_deletes) +# print "(",rfc_num,",",[e for e in working_adds],",",[p.pk for p in working_deletes],"), #",[p.ascii for p in working_deletes] +# else: +# stats["data doesn't match but no changes found"] += 1 +# show_verbose(rfc_num,"Couldn't figure out what to change") + +# if False: +# #if tracker_persons: +# #if any(['iab@' in e for e in adds]) or any(['iesg@' in e for e in adds]) or any(['IESG'==p.name for p in deletes]) or any(['IAB'==p.name for p in deletes]): +# print rfc_num +# print "tracker_persons",tracker_persons +# print "author_names",author_names[rfc_num] +# print "author_emails",author_emails[rfc_num] +# print "Adds:", adds +# print "Deletes:", deletes + +# stats['changed authors'] += 1 + +# if False: +# debug.show('rfc_num') +# debug.show('rfced_emails') +# debug.show('tracker_emails') +# debug.show('known_emails') +# debug.show('unknown_emails') +# debug.show('tracker_persons') +# debug.show('rfced_persons') +# debug.show('tracker_persons==rfced_persons') +# debug.show('[p.id for p in tracker_persons]') +# debug.show('[p.id for p in rfced_persons]') +# exit() + +# if True: +# for p in sorted(list(probable_email_match)): +# print p +# if True: +# print "Probable duplicate persons" +# for d,r in sorted(probable_duplicates): +# print [(p,p.pk) for p in d], r +# else: +# print len(probable_duplicates)," probable duplicate persons" + +# print stats + +# if __name__ == "__main__": +# _main() + diff --git a/dev/mq/Dockerfile b/dev/mq/Dockerfile index e8871c30a9b..1738c4b3d20 100644 --- a/dev/mq/Dockerfile +++ b/dev/mq/Dockerfile @@ -1,6 +1,8 @@ # Dockerfile for RabbitMQ worker # -FROM rabbitmq:3-alpine +ARG RABBITMQ_VERSION=3.11-alpine + +FROM rabbitmq:${RABBITMQ_VERSION} LABEL maintainer="IETF Tools Team " # Copy the startup file diff --git a/dev/tests/debug.sh b/dev/tests/debug.sh index 405daae3774..d87c504bb91 100644 --- a/dev/tests/debug.sh +++ b/dev/tests/debug.sh @@ -3,7 +3,7 @@ # This script recreate the same environment used during tests on GitHub Actions # and drops you into a terminal at the point where the actual tests would be run. # -# Refer to https://github.com/ietf-tools/datatracker/blob/main/.github/workflows/build.yml#L141-L155 +# Refer to https://github.com/ietf-tools/datatracker/blob/main/.github/workflows/tests.yml#L47-L66 # for the commands to run next. # # Simply type "exit" + ENTER to exit and shutdown this test environment. @@ -12,7 +12,7 @@ echo "Fetching latest images..." docker pull ghcr.io/ietf-tools/datatracker-app-base:latest docker pull ghcr.io/ietf-tools/datatracker-db:latest echo "Starting containers..." -docker compose -f docker-compose.debug.yml -p dtdebug up -d +docker compose -f docker-compose.debug.yml -p dtdebug --compatibility up -d echo "Copying working directory into container..." docker compose -p dtdebug cp ../../. app:/__w/datatracker/datatracker/ echo "Run prepare script..." diff --git a/dev/tests/docker-compose.debug.yml b/dev/tests/docker-compose.debug.yml index 74491a5b2e8..8117b923751 100644 --- a/dev/tests/docker-compose.debug.yml +++ b/dev/tests/docker-compose.debug.yml @@ -1,26 +1,35 @@ -# This docker-compose replicates the test workflow happening on GitHub during a PR / build check. -# To be used from the debug.sh script. - -version: '3.8' - -services: - app: - image: ghcr.io/ietf-tools/datatracker-app-base:latest - command: -f /dev/null - working_dir: /__w/datatracker/datatracker - entrypoint: tail - hostname: app - volumes: - - /var/run/docker.sock:/var/run/docker.sock - environment: - CI: 'true' - GITHUB_ACTIONS: 'true' - HOME: /github/home - db: - image: ghcr.io/ietf-tools/datatracker-db:latest - restart: unless-stopped - volumes: - - postgresdb-data:/var/lib/postgresql/data - -volumes: - postgresdb-data: +# This docker-compose replicates the test workflow happening on GitHub during a PR / build check. +# To be used from the debug.sh script. + +version: '3.8' + +services: + app: + image: ghcr.io/ietf-tools/datatracker-app-base:latest + command: -f /dev/null + working_dir: /__w/datatracker/datatracker + entrypoint: tail + hostname: app + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + CI: 'true' + GITHUB_ACTIONS: 'true' + HOME: /github/home + deploy: + resources: + limits: + cpus: '2' + memory: '7GB' + + db: + image: ghcr.io/ietf-tools/datatracker-db:latest + restart: unless-stopped + volumes: + - postgresdb-data:/var/lib/postgresql/data + + blobstore: + image: ghcr.io/ietf-tools/datatracker-devblobstore:latest + +volumes: + postgresdb-data: diff --git a/dev/tests/settings_local.py b/dev/tests/settings_local.py index fdc60a84970..e1ffd60edb8 100644 --- a/dev/tests/settings_local.py +++ b/dev/tests/settings_local.py @@ -1,7 +1,7 @@ # Copyright The IETF Trust 2007-2019, All Rights Reserved # -*- coding: utf-8 -*- -from ietf.settings import * # pyflakes:ignore +from ietf.settings import * # pyflakes:ignore ALLOWED_HOSTS = ['*'] @@ -10,15 +10,15 @@ 'HOST': 'db', 'PORT': 5432, 'NAME': 'datatracker', - 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'ENGINE': 'django.db.backends.postgresql', 'USER': 'django', 'PASSWORD': 'RkTkDPFnKpko', }, } IDSUBMIT_IDNITS_BINARY = "/usr/local/bin/idnits" -IDSUBMIT_REPOSITORY_PATH = "test/id/" -IDSUBMIT_STAGING_PATH = "test/staging/" +IDSUBMIT_REPOSITORY_PATH = "/assets/ietfdata/doc/draft/repository" +IDSUBMIT_STAGING_PATH = "/assets/www6s/staging/" AGENDA_PATH = '/assets/www6s/proceedings/' MEETINGHOST_LOGO_PATH = AGENDA_PATH @@ -36,7 +36,6 @@ SUBMIT_YANG_CATALOG_MODEL_DIR = '/assets/ietf-ftp/yang/catalogmod/' SUBMIT_YANG_DRAFT_MODEL_DIR = '/assets/ietf-ftp/yang/draftmod/' -SUBMIT_YANG_INVAL_MODEL_DIR = '/assets/ietf-ftp/yang/invalmod/' SUBMIT_YANG_IANA_MODEL_DIR = '/assets/ietf-ftp/yang/ianamod/' SUBMIT_YANG_RFC_MODEL_DIR = '/assets/ietf-ftp/yang/rfcmod/' @@ -56,9 +55,11 @@ BOFREQ_PATH = '/assets/ietf-ftp/bofreq/' CONFLICT_REVIEW_PATH = '/assets/ietf-ftp/conflict-reviews/' STATUS_CHANGE_PATH = '/assets/ietf-ftp/status-changes/' -INTERNET_DRAFT_ARCHIVE_DIR = '/assets/ietf-ftp/internet-drafts/' +INTERNET_DRAFT_ARCHIVE_DIR = '/assets/collection/draft-archive' INTERNET_ALL_DRAFTS_ARCHIVE_DIR = '/assets/ietf-ftp/internet-drafts/' BIBXML_BASE_PATH = '/assets/ietfdata/derived/bibxml' +FTP_DIR = '/assets/ftp' +NFS_METRICS_TMP_DIR = '/assets/tmp' NOMCOM_PUBLIC_KEYS_DIR = 'data/nomcom_keys/public_keys/' SLIDE_STAGING_PATH = 'test/staging/' diff --git a/docker-compose.yml b/docker-compose.yml index e9108526692..2440faf1214 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: app: build: @@ -17,6 +15,7 @@ services: depends_on: - db - mq + - blobstore ipc: host @@ -26,7 +25,7 @@ services: # UID: 1001 # GID: 1001 # DATADIR: data - # DJANGO_SETTINGS_MODULE: settings_postgrestest + # DJANGO_SETTINGS_MODULE: settings_test # Uncomment the next line to use a non-root user for all processes. # user: dev @@ -37,7 +36,7 @@ services: db: image: ghcr.io/ietf-tools/datatracker-db:latest # build: - # context: .. + # context: . # dockerfile: docker/db.Dockerfile restart: unless-stopped volumes: @@ -53,23 +52,30 @@ services: - PGADMIN_DEFAULT_EMAIL=dev@ietf.org - PGADMIN_DEFAULT_PASSWORD=dev - PGADMIN_CONFIG_LOGIN_BANNER="Login with dev@ietf.org / dev" - - PGADMIN_LISTEN_PORT=5433 - PGADMIN_DISABLE_POSTFIX=True - PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED=False + - SCRIPT_NAME=/pgadmin volumes: - ./docker/configs/pgadmin-servers.json:/pgadmin4/servers.json + static: + image: ghcr.io/ietf-tools/static:latest + restart: unless-stopped + mq: image: rabbitmq:3-alpine restart: unless-stopped celery: - image: ghcr.io/ietf-tools/datatracker-celery:latest + build: + context: . + dockerfile: docker/celery.Dockerfile init: true environment: CELERY_APP: ietf CELERY_ROLE: worker UPDATE_REQUIREMENTS_FROM: requirements.txt + DEV_MODE: "yes" command: - '--loglevel=INFO' depends_on: @@ -80,6 +86,45 @@ services: - .:/workspace - app-assets:/assets + replicator: + build: + context: . + dockerfile: docker/celery.Dockerfile + init: true + environment: + CELERY_APP: ietf + CELERY_ROLE: worker + UPDATE_REQUIREMENTS_FROM: requirements.txt + DEV_MODE: "yes" + command: + - '--loglevel=INFO' + - '--queues=blobdb' + - '--concurrency=1' + + depends_on: + - db + restart: unless-stopped + stop_grace_period: 1m + volumes: + - .:/workspace + - app-assets:/assets + + blobstore: + image: ghcr.io/ietf-tools/datatracker-devblobstore:latest + restart: unless-stopped + volumes: + - "minio-data:/data" + + blobdb: + image: postgres:17 + restart: unless-stopped + environment: + POSTGRES_DB: blob + POSTGRES_USER: dt + POSTGRES_PASSWORD: abcd1234 + volumes: + - blobdb-data:/var/lib/postgresql/data + # Celery Beat is a periodic task runner. It is not normally needed for development, # but can be enabled by uncommenting the following. # @@ -98,7 +143,10 @@ services: # stop_grace_period: 1m # volumes: # - .:/workspace +# - app-assets:/assets volumes: postgresdb-data: app-assets: + minio-data: + blobdb-data: diff --git a/docker/README.md b/docker/README.md index b16687618f3..0ca79a6e899 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,14 +1,28 @@ # Datatracker Development in Docker +- [Getting started](#getting-started) +- [Using Visual Studio Code](#using-visual-studio-code) + - [Initial Setup](#initial-setup) + - [Subsequent Launch](#subsequent-launch) + - [Usage](#usage) +- [Using Other Editors / Generic](#using-other-editors--generic) + - [Exit Environment](#exit-environment) + - [Accessing PostgreSQL Port](#accessing-postgresql-port) +- [Clean and Rebuild DB from latest image](#clean-and-rebuild-db-from-latest-image) +- [Clean all](#clean-all) +- [Updating an older environment](#updating-an-older-environment) +- [Notes / Troubleshooting](#notes--troubleshooting) + ## Getting started 1. [Set up Docker](https://docs.docker.com/get-started/) on your preferred platform. On Windows, it is highly recommended to use the [WSL 2 *(Windows Subsystem for Linux)*](https://docs.docker.com/desktop/windows/wsl/) backend. +> [!IMPORTANT] > See the [IETF Tools Windows Dev guide](https://github.com/ietf-tools/.github/blob/main/docs/windows-dev.md) on how to get started when using Windows. -2. On Linux, you must also install [Docker Compose](https://docs.docker.com/compose/install/). Docker Desktop for Mac and Windows already include Docker Compose. +2. On Linux, you must [install Docker Compose manually](https://docs.docker.com/compose/install/linux/#install-the-plugin-manually) and not install Docker Desktop. On Mac and Windows install Docker Desktop which already includes Docker Compose. -2. If you have a copy of the datatracker code checked out already, simply `cd` to the top-level directory. +3. If you have a copy of the datatracker code checked out already, simply `cd` to the top-level directory. If not, check out a datatracker branch as usual. We'll check out `main` below, but you can use any branch: @@ -18,7 +32,7 @@ git checkout main ``` -3. Follow the instructions for your preferred editor: +4. Follow the instructions for your preferred editor: - [Visual Studio Code](#using-visual-studio-code) - [Other Editors / Generic](#using-other-editors--generic) @@ -29,9 +43,9 @@ This project includes a devcontainer configuration which automates the setup of ### Initial Setup 1. Launch [VS Code](https://code.visualstudio.com/) -2. Under the **Extensions** tab, ensure you have the **Remote - Containers** ([ms-vscode-remote.remote-containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)) extension installed. +2. Under the **Extensions** tab, ensure you have the **Dev Containers** ([ms-vscode-remote.remote-containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)) extension installed. * On Linux, note that the Snap installation of VS Code is [incompatible with this plugin](https://code.visualstudio.com/docs/devcontainers/containers#_system-requirements:~:text=snap%20package%20is%20not%20supported). - * On Windows, you also need the **Remote - WSL** ([ms-vscode-remote.remote-wsl](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)) extension to take advantage of the WSL 2 *(Windows Subsystem for Linux)* native integration. + * On Windows, you also need the **WSL** ([ms-vscode-remote.remote-wsl](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)) extension to take advantage of the WSL 2 *(Windows Subsystem for Linux)* native integration. 2. Open the top-level directory of the datatracker code you fetched above. 3. A prompt inviting you to reopen the project in containers will appear in the bottom-right corner. Click the **Reopen in Container** button. If you missed the prompt, you can press `F1`, start typing `reopen in container` task and launch it. 4. VS Code will relaunch in the dev environment and create the containers automatically. @@ -45,7 +59,7 @@ You can also open the datatracker project folder and click the **Reopen in conta ### Usage -- Under the **Run and Debug** tab, you can run the server with the debugger attached using **Run Server** (F5). Once the server is ready to accept connections, you'll be prompted to open in a browser. You can also open [http://localhost:8000](http://localhost:8000) in a browser. +- Under the **Run and Debug** tab, you can run the server with the debugger attached using **Run Server** (F5). Once the server is ready to accept connections, you'll be prompted to open in a browser. Navigate to [http://localhost:8000](http://localhost:8000) in your preferred browser. > An alternate profile **Run Server with Debug Toolbar** is also available from the dropdown menu, which displays various tools on top of the webpage. However, note that this configuration has a significant performance impact. @@ -64,11 +78,7 @@ You can also open the datatracker project folder and click the **Reopen in conta ![](assets/vscode-terminal-new.png) -- Under the **SQL Tools** tab, a connection **Local Dev** is preconfigured to connect to the DB container. Using this tool, you can list tables, view records and execute SQL queries directly from VS Code. - - > The port `3306` is also exposed to the host automatically, should you prefer to use your own SQL tool. - - ![](assets/vscode-sqltools.png) +- The pgAdmin web interface, a PostgreSQL DB browser / management UI, is available at [http://localhost:8000/pgadmin/](http://localhost:8000/pgadmin/). - Under the **Task Explorer** tab, a list of available preconfigured tasks is displayed. *(You may need to expand the tree to `src > vscode` to see it.)* These are common scritps you can run *(e.g. run tests, fetch assets, etc.)*. @@ -87,11 +97,10 @@ You can also open the datatracker project folder and click the **Reopen in conta On Linux / macOS: ```sh - cd docker - ./run + ./docker/run # or whatever path you need ``` - > Note that you can pass the `-r` flag to `./run` to force a rebuild of the containers. This is useful if you switched branches and that the existing containers still contain configurations from the old branch. You should also use this if you don't regularly keep up with main and your containers reflect a much older version of the branch. + > Note that you can pass the `-r` flag to `run` to force a rebuild of the containers. This is useful if you switched branches and that the existing containers still contain configurations from the old branch. You should also use this if you don't regularly keep up with main and your containers reflect a much older version of the branch. On Windows *(using Powershell)*: ```sh @@ -104,7 +113,7 @@ You can also open the datatracker project folder and click the **Reopen in conta 2. Wait for the containers to initialize. Upon completion, you will be dropped into a shell from which you can start the datatracker and execute related commands as usual, for example ``` - ietf/manage.py runserver 0.0.0.0:8000 + ietf/manage.py runserver 8001 ``` to start the datatracker. @@ -127,7 +136,14 @@ docker compose down to terminate the containers. -### Clean and Rebuild DB from latest image +### Accessing PostgreSQL Port + +The port is exposed but not automatically mapped to `5432` to avoid potential conflicts with the host. To get the mapped port, run the command *(from the project `/docker` directory)*: +```sh +docker compose port db 5432 +``` + +## Clean and Rebuild DB from latest image To delete the active DB container, its volume and get the latest image / DB dump, simply run the following command: @@ -145,7 +161,7 @@ docker compose pull db docker compose build --no-cache db ``` -### Clean all +## Clean all To delete all containers for this project, its associated images and purge any remaining dangling images, simply run the following command: @@ -162,11 +178,19 @@ docker compose down -v --rmi all docker image prune ``` -### Accessing MariaDB Port +## Updating an older environment + +If you already have a clone, such as from a previous codesprint, and are updating that clone, before starting the datatracker from the updated image: +1. `rm ietf/settings_local.py` *(The startup script will put a new one, appropriate to the current release, in place)* +1. Execute the [Clean all](#clean-all) sequence above. + +If the dev environment fails to start, even after running the [Clean all](#clean-all) sequence above, you can fully purge all docker cache, containers, images and volumes by running the command below. + +> [!CAUTION] +> Note that this will delete everything docker-related, including non-datatracker docker resources you might have. -The port is exposed but not mapped to `3306` to avoid potential conflicts with the host. To get the mapped port, run the command *(from the project `/docker` directory)*: ```sh -docker compose port db 3306 +docker system prune -a --volumes ``` ## Notes / Troubleshooting @@ -188,3 +212,17 @@ The content of the source files will be copied into the target `.ics` files. Mak ### Missing assets in the data folder Because including all assets in the image would significantly increase the file size, they are not included by default. You can however fetch them by running the **Fetch assets via rsync** task in VS Code or run manually the script `docker/scripts/app-rsync-extras.sh` + +### Linux file permissions leaking to the host system + +If on the host filesystem you have permissions that look like this, + +```bash +$ ls -la +total 4624 +drwxrwxr-x 2 100999 100999 4096 May 25 07:56 bin +drwxrwxr-x 5 100999 100999 4096 May 25 07:56 client +(etc...) +``` + +Try uninstalling Docker Desktop and installing Docker Compose manually. The Docker Compose bundled with Docker Desktop is incompatible with our software. See also [Rootless Docker: file ownership changes #3343](https://github.com/lando/lando/issues/3343), [Docker context desktop-linux has container permission issues #75](https://github.com/docker/desktop-linux/issues/75). diff --git a/docker/app.Dockerfile b/docker/app.Dockerfile index af475a4e6be..dd4cf72ffd9 100644 --- a/docker/app.Dockerfile +++ b/docker/app.Dockerfile @@ -10,12 +10,7 @@ ARG USER_GID=$USER_UID COPY docker/scripts/app-setup-debian.sh /tmp/library-scripts/docker-setup-debian.sh RUN sed -i 's/\r$//' /tmp/library-scripts/docker-setup-debian.sh && chmod +x /tmp/library-scripts/docker-setup-debian.sh -# Add Postgresql Apt Repository to get 14 -RUN echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list -RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - - RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get install -y --no-install-recommends postgresql-client-14 pgloader \ # Remove imagemagick due to https://security-tracker.debian.org/tracker/CVE-2019-10131 && apt-get purge -y imagemagick imagemagick-6-common \ # Install common packages, non-root user @@ -30,12 +25,21 @@ COPY docker/scripts/app-setup-python.sh /tmp/library-scripts/docker-setup-python RUN sed -i 's/\r$//' /tmp/library-scripts/docker-setup-python.sh && chmod +x /tmp/library-scripts/docker-setup-python.sh RUN bash /tmp/library-scripts/docker-setup-python.sh "none" "/usr/local" "${PIPX_HOME}" "${USERNAME}" +# Setup nginx +COPY docker/scripts/app-setup-nginx.sh /tmp/library-scripts/docker-setup-nginx.sh +RUN sed -i 's/\r$//' /tmp/library-scripts/docker-setup-nginx.sh && chmod +x /tmp/library-scripts/docker-setup-nginx.sh +RUN bash /tmp/library-scripts/docker-setup-nginx.sh +COPY docker/configs/nginx-proxy.conf /etc/nginx/sites-available/default +COPY docker/configs/nginx-502.html /var/www/html/502.html + # Remove library scripts for final image RUN rm -rf /tmp/library-scripts # Copy the startup file COPY docker/scripts/app-init.sh /docker-init.sh -RUN sed -i 's/\r$//' /docker-init.sh && chmod +x /docker-init.sh +COPY docker/scripts/app-start.sh /docker-start.sh +RUN sed -i 's/\r$//' /docker-init.sh && chmod +rx /docker-init.sh +RUN sed -i 's/\r$//' /docker-start.sh && chmod +rx /docker-start.sh # Fix user UID / GID to match host RUN groupmod --gid $USER_GID $USERNAME \ diff --git a/docker/base.Dockerfile b/docker/base.Dockerfile index 499040e4335..25016360494 100644 --- a/docker/base.Dockerfile +++ b/docker/base.Dockerfile @@ -1,138 +1,159 @@ -FROM python:3.9-bullseye -LABEL maintainer="IETF Tools Team " - -ENV DEBIAN_FRONTEND=noninteractive - -# Update system packages -RUN apt-get update \ - && apt-get -qy upgrade \ - && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 - -# Add Node.js Source -RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - - -# Add Docker Source -RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg -RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ - $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null - -# Add PostgreSQL Source -RUN echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list -RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - - -# Install the packages we need -RUN apt-get update --fix-missing && apt-get install -qy \ - apache2-utils \ - apt-file \ - bash \ - build-essential \ - curl \ - default-jdk \ - docker-ce-cli \ - enscript \ - gawk \ - g++ \ - gcc \ - ghostscript \ - git \ - gnupg \ - jq \ - less \ - libcairo2-dev \ - libgtk2.0-0 \ - libgtk-3-0 \ - libnotify-dev \ - libgconf-2-4 \ - libgbm-dev \ - libnss3 \ - libxss1 \ - libasound2 \ - libxtst6 \ - libmagic-dev \ - libmariadb-dev \ - libmemcached-tools \ - locales \ - make \ - mariadb-client \ - memcached \ - nano \ - netcat \ - nodejs \ - pgloader \ - pigz \ - postgresql-client-14 \ - pv \ - python3-ipython \ - ripgrep \ - rsync \ - rsyslog \ - ruby \ - ruby-rubygems \ - unzip \ - wget \ - xauth \ - xvfb \ - yang-tools \ - zsh - -# Install kramdown-rfc2629 (ruby) -RUN gem install kramdown-rfc2629 - -# Install chromedriver -COPY docker/scripts/app-install-chromedriver.sh /tmp/app-install-chromedriver.sh -RUN sed -i 's/\r$//' /tmp/app-install-chromedriver.sh && \ - chmod +x /tmp/app-install-chromedriver.sh -RUN /tmp/app-install-chromedriver.sh - -# Fix /dev/shm permissions for chromedriver -RUN chmod 1777 /dev/shm - -# Activate Yarn -RUN corepack enable - -# Get rid of installation files we don't need in the image, to reduce size -RUN apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* - -# "fake" dbus address to prevent errors -# https://github.com/SeleniumHQ/docker-selenium/issues/87 -ENV DBUS_SESSION_BUS_ADDRESS=/dev/null - -# avoid million NPM install messages -ENV npm_config_loglevel warn -# allow installing when the main user is root -ENV npm_config_unsafe_perm true -# disable NPM funding messages -ENV npm_config_fund false - -# Set locale to en_US.UTF-8 -RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment && \ - echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ - echo "LANG=en_US.UTF-8" > /etc/locale.conf && \ - dpkg-reconfigure locales && \ - locale-gen en_US.UTF-8 && \ - update-locale LC_ALL en_US.UTF-8 -ENV LC_ALL en_US.UTF-8 - -# Install idnits -ADD https://raw.githubusercontent.com/ietf-tools/idnits-mirror/main/idnits /usr/local/bin/ -RUN chmod +rx /usr/local/bin/idnits - -# Turn off rsyslog kernel logging (doesn't work in Docker) -RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf - -# Colorize the bash shell -RUN sed -i 's/#force_color_prompt=/force_color_prompt=/' /root/.bashrc - -# Turn off rsyslog kernel logging (doesn't work in Docker) -RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf - -# Fetch wait-for utility -ADD https://raw.githubusercontent.com/eficode/wait-for/v2.1.3/wait-for /usr/local/bin/ -RUN chmod +rx /usr/local/bin/wait-for - -# Create assets directory -RUN mkdir -p /assets - -# Create workspace -RUN mkdir -p /workspace -WORKDIR /workspace +FROM python:3.12-bookworm +LABEL maintainer="IETF Tools Team " + +ENV DEBIAN_FRONTEND=noninteractive +ENV NODE_MAJOR=16 + +# Update system packages +RUN apt-get update \ + && apt-get -qy upgrade \ + && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 + +# Add Node.js Source +RUN apt-get install -y --no-install-recommends ca-certificates curl gnupg \ + && mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list +RUN echo "Package: nodejs" >> /etc/apt/preferences.d/preferences \ + && echo "Pin: origin deb.nodesource.com" >> /etc/apt/preferences.d/preferences \ + && echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/preferences + +# Add Docker Source +RUN mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list + +# Add PostgreSQL Source +RUN mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/keyrings/apt.postgresql.org.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/apt.postgresql.org.gpg] https://apt.postgresql.org/pub/repos/apt $(. /etc/os-release && echo "$VERSION_CODENAME")-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list + +# Install the packages we need +RUN apt-get update --fix-missing && apt-get install -qy --no-install-recommends \ + apache2-utils \ + apt-file \ + bash \ + build-essential \ + curl \ + default-jdk \ + docker-ce-cli \ + enscript \ + firefox-esr \ + gawk \ + g++ \ + gcc \ + ghostscript \ + git \ + gnupg \ + jq \ + less \ + libcairo2-dev \ + libgtk2.0-0 \ + libgtk-3-0 \ + libnotify-dev \ + libgconf-2-4 \ + libgbm-dev \ + libnss3 \ + libxss1 \ + libasound2 \ + libxtst6 \ + libmagic-dev \ + libmariadb-dev \ + libmemcached-tools \ + libyang2-tools \ + locales \ + make \ + mariadb-client \ + memcached \ + nano \ + netcat-traditional \ + nodejs \ + pgloader \ + pigz \ + postgresql-client-17 \ + pv \ + python3-ipython \ + ripgrep \ + rsync \ + rsyslog \ + ruby \ + ruby-rubygems \ + unzip \ + wget \ + xauth \ + xvfb \ + zsh + +# Install kramdown-rfc2629 (ruby) +RUN gem install kramdown-rfc2629 + +# GeckoDriver +ARG GECKODRIVER_VERSION=latest +RUN GK_VERSION=$(if [ ${GECKODRIVER_VERSION:-latest} = "latest" ]; then echo "0.34.0"; else echo $GECKODRIVER_VERSION; fi) \ + && echo "Using GeckoDriver version: "$GK_VERSION \ + && wget --no-verbose -O /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/v$GK_VERSION/geckodriver-v$GK_VERSION-linux64.tar.gz \ + && rm -rf /opt/geckodriver \ + && tar -C /opt -zxf /tmp/geckodriver.tar.gz \ + && rm /tmp/geckodriver.tar.gz \ + && mv /opt/geckodriver /opt/geckodriver-$GK_VERSION \ + && chmod 755 /opt/geckodriver-$GK_VERSION \ + && ln -fs /opt/geckodriver-$GK_VERSION /usr/bin/geckodriver + +# Activate Yarn +RUN corepack enable + +# Get rid of installation files we don't need in the image, to reduce size +RUN apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# "fake" dbus address to prevent errors +# https://github.com/SeleniumHQ/docker-selenium/issues/87 +ENV DBUS_SESSION_BUS_ADDRESS=/dev/null + +# avoid million NPM install messages +ENV npm_config_loglevel=warn +# allow installing when the main user is root +ENV npm_config_unsafe_perm=true +# disable NPM funding messages +ENV npm_config_fund=false + +# Set locale to en_US.UTF-8 +RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment && \ + echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ + echo "LANG=en_US.UTF-8" > /etc/locale.conf && \ + dpkg-reconfigure locales && \ + locale-gen en_US.UTF-8 && \ + update-locale LC_ALL en_US.UTF-8 +ENV LC_ALL=en_US.UTF-8 + +# Install idnits +ADD https://raw.githubusercontent.com/ietf-tools/idnits-mirror/main/idnits /usr/local/bin/ +RUN chmod +rx /usr/local/bin/idnits + +# Install required fonts +RUN mkdir -p /tmp/fonts && \ + wget -q -O /tmp/fonts.tar.gz https://github.com/ietf-tools/xml2rfc-fonts/archive/refs/tags/3.22.0.tar.gz && \ + tar zxf /tmp/fonts.tar.gz -C /tmp/fonts && \ + mv /tmp/fonts/*/noto/* /usr/local/share/fonts/ && \ + mv /tmp/fonts/*/roboto_mono/* /usr/local/share/fonts/ && \ + rm -rf /tmp/fonts.tar.gz /tmp/fonts/ && \ + fc-cache -f + +# Turn off rsyslog kernel logging (doesn't work in Docker) +RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf + +# Colorize the bash shell +RUN sed -i 's/#force_color_prompt=/force_color_prompt=/' /root/.bashrc + +# Turn off rsyslog kernel logging (doesn't work in Docker) +RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf + +# Fetch wait-for utility +ADD https://raw.githubusercontent.com/eficode/wait-for/v2.1.3/wait-for /usr/local/bin/ +RUN chmod +rx /usr/local/bin/wait-for + +# Create assets directory +RUN mkdir -p /assets + +# Create workspace +RUN mkdir -p /workspace +WORKDIR /workspace diff --git a/docker/celery.Dockerfile b/docker/celery.Dockerfile new file mode 100644 index 00000000000..e93ca3cf77c --- /dev/null +++ b/docker/celery.Dockerfile @@ -0,0 +1,55 @@ +FROM ghcr.io/ietf-tools/datatracker-app-base:latest +LABEL maintainer="IETF Tools Team " + +ENV DEBIAN_FRONTEND=noninteractive + +# Install needed packages and setup non-root user. +ARG USERNAME=dev +ARG USER_UID=1000 +ARG USER_GID=$USER_UID +COPY docker/scripts/app-setup-debian.sh /tmp/library-scripts/docker-setup-debian.sh +RUN sed -i 's/\r$//' /tmp/library-scripts/docker-setup-debian.sh && chmod +x /tmp/library-scripts/docker-setup-debian.sh + +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + # Remove imagemagick due to https://security-tracker.debian.org/tracker/CVE-2019-10131 + && apt-get purge -y imagemagick imagemagick-6-common \ + # Install common packages, non-root user + # Syntax: ./docker-setup-debian.sh [install zsh flag] [username] [user UID] [user GID] [upgrade packages flag] [install Oh My Zsh! flag] [Add non-free packages] + && bash /tmp/library-scripts/docker-setup-debian.sh "true" "${USERNAME}" "${USER_UID}" "${USER_GID}" "false" "true" "true" + +# Setup default python tools in a venv via pipx to avoid conflicts +ENV PIPX_HOME=/usr/local/py-utils \ + PIPX_BIN_DIR=/usr/local/py-utils/bin +ENV PATH=${PATH}:${PIPX_BIN_DIR} +COPY docker/scripts/app-setup-python.sh /tmp/library-scripts/docker-setup-python.sh +RUN sed -i 's/\r$//' /tmp/library-scripts/docker-setup-python.sh && chmod +x /tmp/library-scripts/docker-setup-python.sh +RUN bash /tmp/library-scripts/docker-setup-python.sh "none" "/usr/local" "${PIPX_HOME}" "${USERNAME}" + +# Remove library scripts for final image +RUN rm -rf /tmp/library-scripts + +# Copy the startup file +COPY docker/scripts/app-init-celery.sh /docker-init.sh +RUN sed -i 's/\r$//' /docker-init.sh && \ + chmod +x /docker-init.sh + +ENTRYPOINT [ "/docker-init.sh" ] + +# Fix user UID / GID to match host +RUN groupmod --gid $USER_GID $USERNAME \ + && usermod --uid $USER_UID --gid $USER_GID $USERNAME \ + && chown -R $USER_UID:$USER_GID /home/$USERNAME \ + || exit 0 + +# Switch to local dev user +USER dev:dev + +# Install current datatracker python dependencies +COPY requirements.txt /tmp/pip-tmp/ +RUN pip3 --disable-pip-version-check --no-cache-dir install --user --no-warn-script-location -r /tmp/pip-tmp/requirements.txt +RUN pip3 --disable-pip-version-check --no-cache-dir install --user --no-warn-script-location watchdog[watchmedo] + +RUN sudo rm -rf /tmp/pip-tmp + +VOLUME [ "/assets" ] + diff --git a/docker/cleanall b/docker/cleanall index 91eac1764bf..c6104aaef99 100755 --- a/docker/cleanall +++ b/docker/cleanall @@ -1,5 +1,11 @@ #!/bin/bash +if test $(basename $PWD ) != "docker" +then + echo "Run this from the docker directory" 1>&2 + exit 1 +fi + read -p "Stop and remove all containers, volumes and images for this project? [y/N] " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]] @@ -7,6 +13,5 @@ then cd .. echo "Shutting down any instance still running and purge images..." docker compose down -v --rmi all - cd docker echo "Done!" fi diff --git a/docker/cleandb b/docker/cleandb index 322e4639a25..c881503eae7 100755 --- a/docker/cleandb +++ b/docker/cleandb @@ -1,5 +1,11 @@ #!/bin/bash +if test $(basename $PWD ) != "docker" +then + echo "Run this from the docker directory" 1>&2 + exit 1 +fi + cd .. echo "Shutting down any instance still running..." docker compose down @@ -9,5 +15,5 @@ docker volume rm -f "${PROJNAME}_postgresdb-data" echo "Rebuilding the DB image..." docker compose pull db docker compose build --no-cache db -cd docker + echo "Done!" diff --git a/docker/configs/nginx-502.html b/docker/configs/nginx-502.html new file mode 100644 index 00000000000..b5577d3e179 --- /dev/null +++ b/docker/configs/nginx-502.html @@ -0,0 +1,61 @@ + + + + + + Datatracker DEV + + + + IETF +

Datatracker

+

Could not connect to dev server.

+
+

Is the datatracker server running?

+

Using VS Code, open the Run and Debug tab on the left and click the symbol (Run Server) to start the server.

+

Otherwise, run the command ietf/manage.py runserver 8001 from the terminal.

+
+
+

You can manage the database at /pgadmin.

+
+

For more information, check out the Datatracker Development in Docker guide.

+ + diff --git a/docker/configs/nginx-proxy.conf b/docker/configs/nginx-proxy.conf new file mode 100644 index 00000000000..3068cc71d73 --- /dev/null +++ b/docker/configs/nginx-proxy.conf @@ -0,0 +1,34 @@ +server { + listen 8000 default_server; + listen [::]:8000 default_server; + + proxy_read_timeout 1d; + proxy_send_timeout 1d; + + root /var/www/html; + index index.html index.htm index.nginx-debian.html; + + server_name _; + + location /_static/ { + proxy_pass http://static/; + } + + location /pgadmin/ { + proxy_set_header X-Script-Name /pgadmin; + proxy_set_header Host $host; + proxy_pass http://pgadmin; + proxy_redirect off; + } + + location / { + error_page 502 /502.html; + proxy_pass http://localhost:8001/; + proxy_set_header Host localhost:8000; + } + + location /502.html { + root /var/www/html; + internal; + } +} diff --git a/docker/configs/pgadmin-servers.json b/docker/configs/pgadmin-servers.json index 8b1c181d13b..b4458af9235 100644 --- a/docker/configs/pgadmin-servers.json +++ b/docker/configs/pgadmin-servers.json @@ -1,22 +1,22 @@ -{ - "Servers": { - "1": { - "Name": "Local Dev", - "Group": "Servers", - "Host": "db", - "Port": 5432, - "MaintenanceDB": "postgres", - "Username": "django", - "UseSSHTunnel": 0, - "TunnelPort": "22", - "TunnelAuthentication": 0, - "KerberosAuthentication": false, - "ConnectionParameters": { - "sslmode": "prefer", - "connect_timeout": 10, - "sslcert": "/.postgresql/postgresql.crt", - "sslkey": "/.postgresql/postgresql.key" - } - } - } -} +{ + "Servers": { + "1": { + "Name": "Local Dev", + "Group": "Servers", + "Host": "db", + "Port": 5432, + "MaintenanceDB": "postgres", + "Username": "django", + "UseSSHTunnel": 0, + "TunnelPort": "22", + "TunnelAuthentication": 0, + "KerberosAuthentication": false, + "ConnectionParameters": { + "sslmode": "prefer", + "connect_timeout": 10, + "sslcert": "/.postgresql/postgresql.crt", + "sslkey": "/.postgresql/postgresql.key" + } + } + } +} diff --git a/docker/configs/settings_local.py b/docker/configs/settings_local.py index a405206c95c..3ee7a4295d2 100644 --- a/docker/configs/settings_local.py +++ b/docker/configs/settings_local.py @@ -1,15 +1,30 @@ -# Copyright The IETF Trust 2007-2019, All Rights Reserved +# Copyright The IETF Trust 2007-2025, All Rights Reserved # -*- coding: utf-8 -*- -from ietf.settings import * # pyflakes:ignore +from ietf.settings import * # pyflakes:ignore +from ietf.settings import ( + ARTIFACT_STORAGE_NAMES, + STORAGES, + BLOBSTORAGE_MAX_ATTEMPTS, + BLOBSTORAGE_READ_TIMEOUT, + BLOBSTORAGE_CONNECT_TIMEOUT, +) ALLOWED_HOSTS = ['*'] -from ietf.settings_postgresqldb import DATABASES # pyflakes:ignore +from ietf.settings_postgresqldb import DATABASES # pyflakes:ignore +DATABASE_ROUTERS = ["ietf.blobdb.routers.BlobdbStorageRouter"] +BLOBDB_DATABASE = "blobdb" +BLOBDB_REPLICATION = { + "ENABLED": True, + "DEST_STORAGE_PATTERN": "r2-{bucket}", + "INCLUDE_BUCKETS": ARTIFACT_STORAGE_NAMES, + "EXCLUDE_BUCKETS": ["staging"], + "VERBOSE_LOGGING": True, +} IDSUBMIT_IDNITS_BINARY = "/usr/local/bin/idnits" -IDSUBMIT_REPOSITORY_PATH = "test/id/" -IDSUBMIT_STAGING_PATH = "test/staging/" +IDSUBMIT_STAGING_PATH = "/assets/www6s/staging/" AGENDA_PATH = '/assets/www6s/proceedings/' MEETINGHOST_LOGO_PATH = AGENDA_PATH @@ -27,7 +42,6 @@ SUBMIT_YANG_CATALOG_MODEL_DIR = '/assets/ietf-ftp/yang/catalogmod/' SUBMIT_YANG_DRAFT_MODEL_DIR = '/assets/ietf-ftp/yang/draftmod/' -SUBMIT_YANG_INVAL_MODEL_DIR = '/assets/ietf-ftp/yang/invalmod/' SUBMIT_YANG_IANA_MODEL_DIR = '/assets/ietf-ftp/yang/ianamod/' SUBMIT_YANG_RFC_MODEL_DIR = '/assets/ietf-ftp/yang/rfcmod/' @@ -40,18 +54,49 @@ # 'ietf.context_processors.sql_debug', # ] -DOCUMENT_PATH_PATTERN = '/assets/ietf-ftp/{doc.type_id}/' +DOCUMENT_PATH_PATTERN = '/assets/ietfdata/doc/{doc.type_id}/' INTERNET_DRAFT_PATH = '/assets/ietf-ftp/internet-drafts/' RFC_PATH = '/assets/ietf-ftp/rfc/' CHARTER_PATH = '/assets/ietf-ftp/charter/' BOFREQ_PATH = '/assets/ietf-ftp/bofreq/' CONFLICT_REVIEW_PATH = '/assets/ietf-ftp/conflict-reviews/' STATUS_CHANGE_PATH = '/assets/ietf-ftp/status-changes/' -INTERNET_DRAFT_ARCHIVE_DIR = '/assets/archive/id' +INTERNET_DRAFT_ARCHIVE_DIR = '/assets/collection/draft-archive' INTERNET_ALL_DRAFTS_ARCHIVE_DIR = '/assets/archive/id' BIBXML_BASE_PATH = '/assets/ietfdata/derived/bibxml' +IDSUBMIT_REPOSITORY_PATH = INTERNET_DRAFT_PATH +FTP_DIR = '/assets/ftp' +NFS_METRICS_TMP_DIR = '/assets/tmp' NOMCOM_PUBLIC_KEYS_DIR = 'data/nomcom_keys/public_keys/' -SLIDE_STAGING_PATH = 'test/staging/' +SLIDE_STAGING_PATH = '/assets/www6s/staging/' DE_GFM_BINARY = '/usr/local/bin/de-gfm' + +STATIC_IETF_ORG = "/_static" +STATIC_IETF_ORG_INTERNAL = "http://static" + + +# Blob replication storage for dev +import botocore.config +for storagename in ARTIFACT_STORAGE_NAMES: + replica_storagename = f"r2-{storagename}" + STORAGES[replica_storagename] = { + "BACKEND": "ietf.doc.storage.MetadataS3Storage", + "OPTIONS": dict( + endpoint_url="http://blobstore:9000", + access_key="minio_root", + secret_key="minio_pass", + security_token=None, + client_config=botocore.config.Config( + request_checksum_calculation="when_required", + response_checksum_validation="when_required", + signature_version="s3v4", + connect_timeout=BLOBSTORAGE_CONNECT_TIMEOUT, + read_timeout=BLOBSTORAGE_READ_TIMEOUT, + retries={"total_max_attempts": BLOBSTORAGE_MAX_ATTEMPTS}, + ), + verify=False, + bucket_name=f"{storagename}", + ), + } diff --git a/docker/configs/settings_local_vite.py b/docker/configs/settings_local_vite.py index 7fb12a003d1..9116905b124 100644 --- a/docker/configs/settings_local_vite.py +++ b/docker/configs/settings_local_vite.py @@ -2,5 +2,9 @@ # -*- coding: utf-8 -*- from ietf.settings_local import * # pyflakes:ignore +from ietf.settings_local import DJANGO_VITE -DJANGO_VITE_DEV_MODE = True +DJANGO_VITE["default"] |= { + "dev_mode": True, + "dev_server_port": 3000, +} diff --git a/docker/configs/settings_postgresqldb.py b/docker/configs/settings_postgresqldb.py index fe0c827ffa8..9b98586658e 100644 --- a/docker/configs/settings_postgresqldb.py +++ b/docker/configs/settings_postgresqldb.py @@ -3,8 +3,16 @@ 'HOST': 'db', 'PORT': 5432, 'NAME': 'datatracker', - 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'ENGINE': 'django.db.backends.postgresql', 'USER': 'django', 'PASSWORD': 'RkTkDPFnKpko', }, + 'blobdb': { + 'HOST': 'blobdb', + 'PORT': 5432, + 'NAME': 'blob', + 'ENGINE': 'django.db.backends.postgresql', + 'USER': 'dt', + 'PASSWORD': 'abcd1234', + }, } diff --git a/docker/db.Dockerfile b/docker/db.Dockerfile index 58d7f2728c8..48ab2987807 100644 --- a/docker/db.Dockerfile +++ b/docker/db.Dockerfile @@ -1,7 +1,7 @@ # ===================== # --- Builder Stage --- # ===================== -FROM postgres:14.6 AS builder +FROM postgres:17 AS builder ENV POSTGRES_PASSWORD=hk2j22sfiv ENV POSTGRES_USER=django @@ -19,7 +19,7 @@ RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"] # =================== # --- Final Image --- # =================== -FROM postgres:14.6 +FROM postgres:17 LABEL maintainer="IETF Tools Team " COPY --from=builder /data $PGDATA @@ -28,3 +28,10 @@ ENV POSTGRES_PASSWORD=hk2j22sfiv ENV POSTGRES_USER=django ENV POSTGRES_DB=datatracker ENV POSTGRES_HOST_AUTH_METHOD=trust + +# build-args for db dump tagging - exposed in the environment and +# in image metadata +ARG datatracker_dumpinfo_date="" +ENV DATATRACKER_DUMPINFO_DATE=$datatracker_dumpinfo_date +ARG datatracker_snapshot="" +ENV DATATRACKER_SNAPSHOT=$datatracker_snapshot diff --git a/docker/devblobstore.Dockerfile b/docker/devblobstore.Dockerfile new file mode 100644 index 00000000000..40bfbd0e961 --- /dev/null +++ b/docker/devblobstore.Dockerfile @@ -0,0 +1,9 @@ +ARG MINIO_VERSION=latest +FROM quay.io/minio/minio:${MINIO_VERSION} +LABEL maintainer="IETF Tools Team " + +ENV MINIO_ROOT_USER=minio_root +ENV MINIO_ROOT_PASSWORD=minio_pass +ENV MINIO_DEFAULT_BUCKETS=defaultbucket + +CMD ["server", "--console-address", ":9001", "/data"] diff --git a/docker/docker-compose.celery.yml b/docker/docker-compose.celery.yml deleted file mode 100644 index dedae2d0049..00000000000 --- a/docker/docker-compose.celery.yml +++ /dev/null @@ -1,51 +0,0 @@ -version: '2.4' -# Use version 2.4 for mem_limit setting. Version 3+ uses deploy.resources.limits.memory -# instead, but that only works for swarm with docker-compose 1.25.1. - -services: - mq: - image: rabbitmq:3-alpine - user: '${RABBITMQ_UID:-499:499}' - hostname: datatracker-mq -# deploy: -# resources: -# limits: -# memory: 1gb # coordinate with settings in rabbitmq.conf -# reservations: -# memory: 512mb - mem_limit: 1gb # coordinate with settings in rabbitmq.conf - ports: - - '${MQ_PORT:-5672}:5672' - volumes: - - ./lib.rabbitmq:/var/lib/rabbitmq - - ./rabbitmq.conf:/etc/rabbitmq/conf.d/90-ietf.conf - - ./definitions.json:/ietf-conf/definitions.json - restart: unless-stopped - logging: - driver: "syslog" - options: - syslog-address: 'unixgram:///dev/log' - tag: 'docker/{{.Name}}' -# syslog-address: "tcp://ietfa.amsl.com:514" - - celery: - image: ghcr.io/ietf-tools/datatracker-celery:latest - environment: - CELERY_APP: ietf - # UPDATE_REQUIREMENTS: 1 # uncomment to update Python requirements on startup - command: - - '--loglevel=INFO' - user: '${CELERY_UID:-499:499}' - volumes: - - '${DATATRACKER_PATH:-..}:/workspace' - - '${MYSQL_SOCKET_PATH:-/run/mysql}:/run/mysql' - depends_on: - - mq - network_mode: 'service:mq' - restart: unless-stopped - logging: - driver: "syslog" - options: - syslog-address: 'unixgram:///dev/log' - tag: 'docker/{{.Name}}' -# syslog-address: "tcp://ietfa.amsl.com:514" diff --git a/docker/docker-compose.extend.yml b/docker/docker-compose.extend.yml index d055c976f49..a69a453110c 100644 --- a/docker/docker-compose.extend.yml +++ b/docker/docker-compose.extend.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: app: ports: @@ -18,6 +16,10 @@ services: pgadmin: ports: - '5433' + blobstore: + ports: + - '9000' + - '9001' celery: volumes: - .:/workspace diff --git a/docker/run b/docker/run index 68246d891e3..71e794aaa91 100755 --- a/docker/run +++ b/docker/run @@ -37,6 +37,15 @@ while getopts "hp:r" opt; do esac done +# Ensure the run script is in our directory. +dirname=$(dirname $0) +if [ "$dirname" = "." -o "$dirname" = "" ] ; then + : +else + echo "Changing to directory $dirname" + cd $dirname || exit 1 +fi + # Remove mounted temp directories rm -rf .parcel-cache __pycache__ diff --git a/docker/scripts/app-configure-blobstore.py b/docker/scripts/app-configure-blobstore.py new file mode 100755 index 00000000000..3140e393064 --- /dev/null +++ b/docker/scripts/app-configure-blobstore.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# Copyright The IETF Trust 2024, All Rights Reserved + +import boto3 +import botocore.config +import botocore.exceptions +import os +import sys + +from ietf.settings import ARTIFACT_STORAGE_NAMES + + +def init_blobstore(): + blobstore = boto3.resource( + "s3", + endpoint_url=os.environ.get("BLOB_STORE_ENDPOINT_URL", "http://blobstore:9000"), + aws_access_key_id=os.environ.get("BLOB_STORE_ACCESS_KEY", "minio_root"), + aws_secret_access_key=os.environ.get("BLOB_STORE_SECRET_KEY", "minio_pass"), + aws_session_token=None, + config=botocore.config.Config( + request_checksum_calculation="when_required", + response_checksum_validation="when_required", + signature_version="s3v4", + ), + ) + for bucketname in ARTIFACT_STORAGE_NAMES: + try: + blobstore.create_bucket( + Bucket=f"{os.environ.get('BLOB_STORE_BUCKET_PREFIX', '')}{bucketname}".strip() + ) + except botocore.exceptions.ClientError as err: + if err.response["Error"]["Code"] == "BucketAlreadyExists": + print(f"Bucket {bucketname} already exists") + else: + print(f"Error creating {bucketname}: {err.response['Error']['Code']}") + else: + print(f"Bucket {bucketname} created") + +if __name__ == "__main__": + sys.exit(init_blobstore()) diff --git a/docker/scripts/app-create-dirs.sh b/docker/scripts/app-create-dirs.sh index d9296ecffe4..3eb328a2807 100755 --- a/docker/scripts/app-create-dirs.sh +++ b/docker/scripts/app-create-dirs.sh @@ -1,14 +1,9 @@ #!/bin/bash for sub in \ - test/id \ - test/staging \ - test/archive \ - test/rfc \ - test/media \ - test/wiki/ietf \ - data/nomcom_keys/public_keys \ /assets/archive/id \ + /assets/collection \ + /assets/collection/draft-archive \ /assets/ietf-ftp \ /assets/ietf-ftp/bofreq \ /assets/ietf-ftp/charter \ @@ -25,6 +20,7 @@ for sub in \ /assets/ietfdata/derived \ /assets/ietfdata/derived/bibxml \ /assets/ietfdata/derived/bibxml/bibxml-ids \ + /assets/ietfdata/doc/draft/repository \ /assets/www6s \ /assets/www6s/staging \ /assets/www6s/wg-descriptions \ @@ -33,6 +29,11 @@ for sub in \ /assets/www6/iesg \ /assets/www6/iesg/evaluation \ /assets/media/photo \ + /assets/tmp \ + /assets/ftp \ + /assets/ftp/charter \ + /assets/ftp/internet-drafts \ + /assets/ftp/review \ ; do if [ ! -d "$sub" ]; then echo "Creating dir $sub" diff --git a/docker/scripts/app-init-celery.sh b/docker/scripts/app-init-celery.sh new file mode 100755 index 00000000000..17925633d2e --- /dev/null +++ b/docker/scripts/app-init-celery.sh @@ -0,0 +1,119 @@ +#!/bin/bash -e +# +# Environment parameters: +# +# CELERY_APP - name of application to pass to celery (defaults to ietf) +# +# CELERY_ROLE - 'worker' or 'beat' (defaults to 'worker') +# +# CELERY_UID - numeric uid for the celery worker process +# +# CELERY_GID - numeric gid for the celery worker process +# +# UPDATES_REQUIREMENTS_FROM - path, relative to /workspace mount, to a pip requirements +# file that should be installed at container startup. Default is no package install/update. +# +# DEBUG_TERM_TIMING - if non-empty, writes debug messages during shutdown after a TERM signal +# +# DEV_MODE - if non-empty, restart celery worker on Python file change +# +WORKSPACEDIR="/workspace" +CELERY_ROLE="${CELERY_ROLE:-worker}" + +cd "$WORKSPACEDIR" || exit 255 + +if [[ -n "${UPDATE_REQUIREMENTS_FROM}" ]]; then + # Need to run as root in the container for this + reqs_file="${WORKSPACEDIR}/${UPDATE_REQUIREMENTS_FROM}" + echo "Updating requirements from ${reqs_file}..." + pip install --upgrade -r "${reqs_file}" +fi + +CELERY_OPTS=( "${CELERY_ROLE}" ) +if [[ -n "${CELERY_UID}" ]]; then + # ensure that a user with the necessary UID exists in container + if ! id "${CELERY_UID}" ; then + adduser --system --uid "${CELERY_UID}" --no-create-home --disabled-login "celery-user-${CELERY_UID}" + fi + CELERY_OPTS+=("--uid=${CELERY_UID}") + CELERY_USERNAME="$(id -nu ${CELERY_UID})" +fi + +if [[ -n "${CELERY_GID}" ]]; then + # ensure that some group with the necessary GID exists in container + if ! getent group "${CELERY_GID}" ; then + addgroup --gid "${CELERY_GID}" "celery-group-${CELERY_GID}" + fi + CELERY_OPTS+=("--gid=${CELERY_GID}") + CELERY_GROUP="$(getent group ${CELERY_GID} | awk -F: '{print $1}')" +fi + +run_as_celery_uid () { + IAM=$(whoami) + if [ "${IAM}" = "${CELERY_USERNAME:-root}" ]; then + SU_OPTS=() + if [[ -n "${CELERY_GROUP}" ]]; then + SU_OPTS+=("-g" "${CELERY_GROUP}") + fi + su "${SU_OPTS[@]}" "${CELERY_USERNAME:-root}" -s /bin/sh -c "$*" + else + /bin/sh -c "$*" + fi +} + +log_term_timing_msgs () { + # output periodic debug message + while true; do + echo "Waiting for celery worker shutdown ($(date --utc --iso-8601=ns))" + sleep 0.5s + done +} + +cleanup () { + # Cleanly terminate the celery app by sending it a TERM, then waiting for it to exit. + if [[ -n "${celery_pid}" ]]; then + echo "Gracefully terminating celery worker. This may take a few minutes if tasks are in progress..." + kill -TERM "${celery_pid}" + if [[ -n "${DEBUG_TERM_TIMING}" ]]; then + log_term_timing_msgs & + fi + wait "${celery_pid}" + fi +} + +echo "Running checks as root to apply patches..." +/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py check + +if [[ "${CELERY_ROLE}" == "worker" ]]; then + echo "Running initial checks..." + # Run checks as celery worker if one was specified + run_as_celery_uid /usr/local/bin/python $WORKSPACEDIR/ietf/manage.py check +fi + +USER_BIN_PATH="/home/dev/.local/bin" +WATCHMEDO="$USER_BIN_PATH/watchmedo" +# Find a celery that works +if [[ -x "$USER_BIN_PATH/celery" ]]; then + # This branch is used for dev + CELERY="$USER_BIN_PATH/celery" +else + # This branch is used for sandbox instances + CELERY="/usr/local/bin/celery" +fi +trap 'trap "" TERM; cleanup' TERM +# start celery in the background so we can trap the TERM signal +if [[ -n "${DEV_MODE}" && -x "${WATCHMEDO}" ]]; then + $WATCHMEDO auto-restart \ + --patterns '*.py' \ + --directory 'ietf' \ + --recursive \ + --debounce-interval 5 \ + -- \ + $CELERY --app="${CELERY_APP:-ietf}" "${CELERY_OPTS[@]}" $@ & + celery_pid=$! +else + $CELERY --app="${CELERY_APP:-ietf}" "${CELERY_OPTS[@]}" "$@" & + celery_pid=$! +fi + +wait "${celery_pid}" diff --git a/docker/scripts/app-init.sh b/docker/scripts/app-init.sh index 61d7ef851d9..1d895cdf53e 100755 --- a/docker/scripts/app-init.sh +++ b/docker/scripts/app-init.sh @@ -2,6 +2,12 @@ WORKSPACEDIR="/workspace" +# Handle Linux host mounting the workspace dir as root +if [ ! -O "${WORKSPACEDIR}/ietf" ]; then + sudo chown -R dev:dev $WORKSPACEDIR +fi + +# Start rsyslog service sudo service rsyslog start &>/dev/null # Add /workspace as a safe git directory @@ -18,13 +24,17 @@ sudo chown -R dev:dev "$WORKSPACEDIR/.vite" sudo chown -R dev:dev "$WORKSPACEDIR/.yarn/unplugged" sudo chown dev:dev "/assets" -echo "Fix chromedriver /dev/shm permissions..." -sudo chmod 1777 /dev/shm +# Run nginx +echo "Starting nginx..." +sudo nginx # Build node packages that requrie native compilation echo "Compiling native node packages..." yarn rebuild +# Silence Browserlist warnings +export BROWSERSLIST_IGNORE_OLD_DATA=1 + # Generate static assets echo "Building static assets... (this could take a minute or two)" yarn build @@ -35,37 +45,27 @@ cp $WORKSPACEDIR/docker/configs/settings_postgresqldb.py $WORKSPACEDIR/ietf/sett if [ ! -f "$WORKSPACEDIR/ietf/settings_local.py" ]; then echo "Setting up a default settings_local.py ..." - cp $WORKSPACEDIR/docker/configs/settings_local.py $WORKSPACEDIR/ietf/settings_local.py - else - echo "Using existing ietf/settings_local.py file" - if ! cmp -s $WORKSPACEDIR/docker/configs/settings_local.py $WORKSPACEDIR/ietf/settings_local.py; then - echo "NOTE: Differences detected compared to docker/configs/settings_local.py!" - echo "We'll assume you made these deliberately." - fi + echo "Renaming existing ietf/settings_local.py to ietf/settings_local.py.bak" + mv -f $WORKSPACEDIR/ietf/settings_local.py $WORKSPACEDIR/ietf/settings_local.py.bak fi +cp $WORKSPACEDIR/docker/configs/settings_local.py $WORKSPACEDIR/ietf/settings_local.py if [ ! -f "$WORKSPACEDIR/ietf/settings_local_debug.py" ]; then echo "Setting up a default settings_local_debug.py ..." - cp $WORKSPACEDIR/docker/configs/settings_local_debug.py $WORKSPACEDIR/ietf/settings_local_debug.py else - echo "Using existing ietf/settings_local_debug.py file" - if ! cmp -s $WORKSPACEDIR/docker/configs/settings_local_debug.py $WORKSPACEDIR/ietf/settings_local_debug.py; then - echo "NOTE: Differences detected compared to docker/configs/settings_local_debug.py!" - echo "We'll assume you made these deliberately." - fi + echo "Renaming existing ietf/settings_local_debug.py to ietf/settings_local_debug.py.bak" + mv -f $WORKSPACEDIR/ietf/settings_local_debug.py $WORKSPACEDIR/ietf/settings_local_debug.py.bak fi +cp $WORKSPACEDIR/docker/configs/settings_local_debug.py $WORKSPACEDIR/ietf/settings_local_debug.py if [ ! -f "$WORKSPACEDIR/ietf/settings_local_vite.py" ]; then echo "Setting up a default settings_local_vite.py ..." - cp $WORKSPACEDIR/docker/configs/settings_local_vite.py $WORKSPACEDIR/ietf/settings_local_vite.py else - echo "Using existing ietf/settings_local_vite.py file" - if ! cmp -s $WORKSPACEDIR/docker/configs/settings_local_vite.py $WORKSPACEDIR/ietf/settings_local_vite.py; then - echo "NOTE: Differences detected compared to docker/configs/settings_local_vite.py!" - echo "We'll assume you made these deliberately." - fi + echo "Renaming existing ietf/settings_local_vite.py to ietf/settings_local_vite.py.bak" + mv -f $WORKSPACEDIR/ietf/settings_local_vite.py $WORKSPACEDIR/ietf/settings_local_vite.py.bak fi +cp $WORKSPACEDIR/docker/configs/settings_local_vite.py $WORKSPACEDIR/ietf/settings_local_vite.py # Create data directories @@ -73,6 +73,11 @@ echo "Creating data directories..." chmod +x ./docker/scripts/app-create-dirs.sh ./docker/scripts/app-create-dirs.sh +# Configure the development blobstore + +echo "Configuring blobstore..." +PYTHONPATH=/workspace python ./docker/scripts/app-configure-blobstore.py + # Download latest coverage results file echo "Downloading latest coverage results file..." @@ -96,25 +101,26 @@ echo "Running initial checks..." /usr/local/bin/python $WORKSPACEDIR/ietf/manage.py check --settings=settings_local # Migrate, adjusting to what the current state of the underlying database might be: - /usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --fake-initial --settings=settings_local -echo "-----------------------------------------------------------------" -echo "Done!" -echo "-----------------------------------------------------------------" +# Apply migrations to the blobdb database as well (most are skipped) +/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local --database=blobdb if [ -z "$EDITOR_VSCODE" ]; then CODE=0 - python -m smtpd -n -c DebuggingServer localhost:2025 & + python -m aiosmtpd -n -c ietf.utils.aiosmtpd.DevDebuggingHandler -l localhost:2025 & if [ -z "$*" ]; then + echo "-----------------------------------------------------------------" + echo "Ready!" + echo "-----------------------------------------------------------------" echo echo "You can execute arbitrary commands now, e.g.," echo - echo " ietf/manage.py runserver 0.0.0.0:8000" + echo " ietf/manage.py runserver 8001" echo echo "to start a development instance of the Datatracker." echo - echo " ietf/manage.py test --settings=settings_postgrestest" + echo " ietf/manage.py test --settings=settings_test" echo echo "to run all the python tests." echo diff --git a/docker/scripts/app-install-chromedriver.sh b/docker/scripts/app-install-chromedriver.sh deleted file mode 100755 index 43532a1cf68..00000000000 --- a/docker/scripts/app-install-chromedriver.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -HOSTARCH=$(arch) -if [ $HOSTARCH == "x86_64" ]; then - echo "Installing chrome driver..." - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - - echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list - apt-get update -y - apt-get install -y google-chrome-stable - CHROMEVER=$(google-chrome --product-version | grep -o "[^\.]*\.[^\.]*\.[^\.]*") - DRIVERVER=$(curl -s "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$CHROMEVER") - wget -q --continue -P /chromedriver "http://chromedriver.storage.googleapis.com/$DRIVERVER/chromedriver_linux64.zip" - unzip /chromedriver/chromedriver* -d /chromedriver - ln -s /chromedriver/chromedriver /usr/local/bin/chromedriver - ln -s /chromedriver/chromedriver /usr/bin/chromedriver -else - echo "This architecture doesn't support chromedriver. Skipping installation..." -fi \ No newline at end of file diff --git a/docker/scripts/app-setup-debian.sh b/docker/scripts/app-setup-debian.sh index ddfc351995d..ea9cc3fb879 100644 --- a/docker/scripts/app-setup-debian.sh +++ b/docker/scripts/app-setup-debian.sh @@ -10,7 +10,6 @@ # Syntax: ./common-debian.sh [install zsh flag] [username] [user UID] [user GID] [upgrade packages flag] [install Oh My Zsh! flag] [Add non-free packages] set -e - INSTALL_ZSH=${1:-"true"} USERNAME=${2:-"automatic"} USER_UID=${3:-"automatic"} @@ -116,18 +115,9 @@ if [ "${PACKAGES_ALREADY_INSTALLED}" != "true" ]; then # Needed for adding manpages-posix and manpages-posix-dev which are non-free packages in Debian if [ "${ADD_NON_FREE_PACKAGES}" = "true" ]; then # Bring in variables from /etc/os-release like VERSION_CODENAME - . /etc/os-release - sed -i -E "s/deb http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME} main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME} main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb-src http:\/\/(deb|httredir)\.debian\.org\/debian ${VERSION_CODENAME} main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME} main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME}-updates main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME}-updates main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb-src http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME}-updates main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME}-updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main contrib non-free/" /etc/apt/sources.list - # Handle bullseye location for security https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html - sed -i "s/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main contrib non-free/" /etc/apt/sources.list + . /etc/os-release + sed -i -E "s/Components: main/Components: main contrib non-free/" /etc/apt/sources.list.d/debian.sources + echo "Running apt-get update..." apt-get update package_list="${package_list} manpages-posix manpages-posix-dev" diff --git a/docker/scripts/app-setup-nginx.sh b/docker/scripts/app-setup-nginx.sh new file mode 100644 index 00000000000..cdeb2ea4cb3 --- /dev/null +++ b/docker/scripts/app-setup-nginx.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +apt-get update -y +apt-get install -y nginx diff --git a/docker/scripts/app-start.sh b/docker/scripts/app-start.sh new file mode 100644 index 00000000000..c3369bab93c --- /dev/null +++ b/docker/scripts/app-start.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +sudo service rsyslog start &>/dev/null + +# Run nginx + +echo "Starting nginx..." +pidof nginx >/dev/null && echo "nginx is already running [ OK ]" || sudo nginx + +# Run memcached + +echo "Starting memcached..." +pidof memcached >/dev/null && echo "memcached is already running [ OK ]" || /usr/bin/memcached -u dev -d + +echo "-----------------------------------------------------------------" +echo "Ready!" +echo "-----------------------------------------------------------------" diff --git a/docker/scripts/db-load-default-extensions.sh b/docker/scripts/db-load-default-extensions.sh index 23329267c78..efb64b75d00 100644 --- a/docker/scripts/db-load-default-extensions.sh +++ b/docker/scripts/db-load-default-extensions.sh @@ -2,7 +2,7 @@ set -e # Adding the extension to the default template is needed to allow the test-suite -# to be run on postgres (see ietf.settings_postgrestest). The test runner always +# to be run on postgres (see ietf.settings_test). The test runner always # makes a fresh test database instance, and since we are bypassing the migration # framework and using a fixture to set the database structure, there's no reaonable # way to install the extension as part of the test run. diff --git a/ietf/.gitignore b/ietf/.gitignore index 2483dbda775..af738db98cb 100644 --- a/ietf/.gitignore +++ b/ietf/.gitignore @@ -1,8 +1,8 @@ /*.pyc /settings_local.py -/settings_local.py.bak /settings_local_debug.py /settings_local_vite.py /settings_mysqldb.py /settings_postgresqldb.py +/settings_*.py.bak /ietfdb.sql.gz diff --git a/ietf/__init__.py b/ietf/__init__.py index b0dad6c657c..26124c3c67a 100644 --- a/ietf/__init__.py +++ b/ietf/__init__.py @@ -6,7 +6,7 @@ # Version must stay in single quotes for automatic CI replace # Don't add patch number here: -__version__ = '10.0.0-dev' +__version__ = '1.0.0-dev' # Release hash must stay in single quotes for automatic CI replace __release_hash__ = '' @@ -17,6 +17,24 @@ # set this to ".p1", ".p2", etc. after patching __patch__ = "" +if __version__ == '1.0.0-dev' and __release_hash__ == '' and __release_branch__ == '': + import subprocess + branch = subprocess.run( + ["/usr/bin/git", "branch", "--show-current"], + capture_output=True, + ).stdout.decode().strip() + git_hash = subprocess.run( + ["/usr/bin/git", "rev-parse", "head"], + capture_output=True, + ).stdout.decode().strip() + rev = subprocess.run( + ["/usr/bin/git", "describe", "--tags", git_hash], + capture_output=True, + ).stdout.decode().strip().split('-', 1)[0] + __version__ = f"{rev}-dev" + __release_branch__ = branch + __release_hash__ = git_hash + # This will make sure the app is always imported when # Django starts so that shared_task will use this app. diff --git a/ietf/ietfauth/management/__init__.py b/ietf/admin/__init__.py similarity index 100% rename from ietf/ietfauth/management/__init__.py rename to ietf/admin/__init__.py diff --git a/ietf/admin/apps.py b/ietf/admin/apps.py new file mode 100644 index 00000000000..20b762cfec9 --- /dev/null +++ b/ietf/admin/apps.py @@ -0,0 +1,6 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +from django.contrib.admin import apps as admin_apps + + +class AdminConfig(admin_apps.AdminConfig): + default_site = "ietf.admin.sites.AdminSite" diff --git a/ietf/admin/sites.py b/ietf/admin/sites.py new file mode 100644 index 00000000000..69cb62ae200 --- /dev/null +++ b/ietf/admin/sites.py @@ -0,0 +1,15 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +from django.contrib.admin import AdminSite as _AdminSite +from django.conf import settings +from django.utils.safestring import mark_safe + + +class AdminSite(_AdminSite): + site_title = "Datatracker admin" + + @staticmethod + def site_header(): + if settings.SERVER_MODE == "production": + return "Datatracker administration" + else: + return mark_safe('Datatracker administration δ') diff --git a/ietf/api/__init__.py b/ietf/api/__init__.py index b4c6203d985..d4562f97ddf 100644 --- a/ietf/api/__init__.py +++ b/ietf/api/__init__.py @@ -4,56 +4,50 @@ import datetime import re +import sys from urllib.parse import urlencode -from django.conf import settings +from django.apps import apps as django_apps from django.core.exceptions import ObjectDoesNotExist +from django.utils.module_loading import autodiscover_modules + import debug # pyflakes:ignore -import tastypie import tastypie.resources +import tastypie.serializers from tastypie.api import Api from tastypie.bundle import Bundle from tastypie.exceptions import ApiFieldError -from tastypie.serializers import Serializer # pyflakes:ignore (we're re-exporting this) from tastypie.fields import ApiField _api_list = [] -for _app in settings.INSTALLED_APPS: +OMITTED_APPS_APIS = ["ietf.status"] + +# Pre-py3.11, fromisoformat() does not handle Z or +HH tz offsets +HAVE_BROKEN_FROMISOFORMAT = sys.version_info < (3, 11, 0, "", 0) + +def populate_api_list(): _module_dict = globals() - if '.' in _app: - _root, _name = _app.split('.', 1) - if _root == 'ietf': - if not '.' in _name: - _api = Api(api_name=_name) - _module_dict[_name] = _api - _api_list.append((_name, _api)) + for app_config in django_apps.get_app_configs(): + if '.' in app_config.name and app_config.name not in OMITTED_APPS_APIS: + _root, _name = app_config.name.split('.', 1) + if _root == 'ietf': + if not '.' in _name: + _api = Api(api_name=_name) + _module_dict[_name] = _api + _api_list.append((_name, _api)) def autodiscover(): """ Auto-discover INSTALLED_APPS resources.py modules and fail silently when - not present. This forces an import on them to register any admin bits they + not present. This forces an import on them to register any resources they may want. """ + autodiscover_modules("resources") - from importlib import import_module - from django.conf import settings - from django.utils.module_loading import module_has_submodule - - for app in settings.INSTALLED_APPS: - mod = import_module(app) - # Attempt to import the app's admin module. - try: - import_module('%s.resources' % (app, )) - except: - # Decide whether to bubble up this error. If the app just - # doesn't have an admin module, we can ignore the error - # attempting to import it, otherwise we want it to bubble up. - if module_has_submodule(mod, "resources"): - raise class ModelResource(tastypie.resources.ModelResource): def generate_cache_key(self, *args, **kwargs): @@ -68,6 +62,35 @@ def generate_cache_key(self, *args, **kwargs): # Use a list plus a ``.join()`` because it's faster than concatenation. return "%s:%s:%s:%s" % (self._meta.api_name, self._meta.resource_name, ':'.join(args), smooshed) + def _z_aware_fromisoformat(self, value: str) -> datetime.datetime: + """datetime.datetime.fromisoformat replacement that works with python < 3.11""" + if HAVE_BROKEN_FROMISOFORMAT: + if value.upper().endswith("Z"): + value = value[:-1] + "+00:00" # Z -> UTC + elif re.match(r"[+-][0-9][0-9]$", value[-3:]): + value = value + ":00" # -04 -> -04:00 + return datetime.datetime.fromisoformat(value) + + def filter_value_to_python( + self, value, field_name, filters, filter_expr, filter_type + ): + py_value = super().filter_value_to_python( + value, field_name, filters, filter_expr, filter_type + ) + if isinstance( + self.fields[field_name], tastypie.fields.DateTimeField + ) and isinstance(py_value, str): + # Ensure datetime values are TZ-aware, using UTC by default + try: + dt = self._z_aware_fromisoformat(py_value) + except ValueError: + pass # let tastypie deal with the original value + else: + if dt.tzinfo is None: + dt = dt.replace(tzinfo=datetime.timezone.utc) + py_value = dt.isoformat() + return py_value + TIMEDELTA_REGEX = re.compile(r'^(?P\d+d)?\s?(?P\d+h)?\s?(?P\d+m)?\s?(?P\d+s?)$') @@ -152,3 +175,29 @@ def dehydrate(self, bundle, for_list=True): dehydrated = self.dehydrate_related(fk_bundle, fk_resource, for_list=for_list) fk_resource._meta.cache.set(cache_key, dehydrated) return dehydrated + + +class Serializer(tastypie.serializers.Serializer): + OPTION_ESCAPE_NULLS = "datatracker-escape-nulls" + + def format_datetime(self, data): + return data.astimezone(datetime.UTC).replace(tzinfo=None).isoformat(timespec="seconds") + "Z" + + def to_simple(self, data, options): + options = options or {} + simple_data = super().to_simple(data, options) + if ( + options.get(self.OPTION_ESCAPE_NULLS, False) + and isinstance(simple_data, str) + ): + # replace nulls with unicode "symbol for null character", \u2400 + simple_data = simple_data.replace("\x00", "\u2400") + return simple_data + + def to_etree(self, data, options=None, name=None, depth=0): + # lxml does not escape nulls on its own, so ask to_simple() to do it. + # This is mostly (only?) an issue when generating errors responses for + # fuzzers. + options = options or {} + options[self.OPTION_ESCAPE_NULLS] = True + return super().to_etree(data, options, name, depth) diff --git a/ietf/api/__init__.pyi b/ietf/api/__init__.pyi index 63d9bc513ba..ededea90a7d 100644 --- a/ietf/api/__init__.pyi +++ b/ietf/api/__init__.pyi @@ -30,4 +30,5 @@ class Serializer(): ... class ToOneField(tastypie.fields.ToOneField): ... class TimedeltaField(tastypie.fields.ApiField): ... +def populate_api_list() -> None: ... def autodiscover() -> None: ... diff --git a/ietf/api/apps.py b/ietf/api/apps.py new file mode 100644 index 00000000000..4549e0d7f20 --- /dev/null +++ b/ietf/api/apps.py @@ -0,0 +1,19 @@ +from django.apps import AppConfig +from . import populate_api_list + + +class ApiConfig(AppConfig): + name = "ietf.api" + + def ready(self): + """Hook to do init after the app registry is fully populated + + Importing models or accessing the app registry is ok here, but do not + interact with the database. See + https://docs.djangoproject.com/en/4.2/ref/applications/#django.apps.AppConfig.ready + """ + # Populate our API list now that the app registry is set up + populate_api_list() + + # Import drf-spectacular extensions + import ietf.api.schema # pyflakes: ignore diff --git a/ietf/api/authentication.py b/ietf/api/authentication.py new file mode 100644 index 00000000000..dfab0d72b8b --- /dev/null +++ b/ietf/api/authentication.py @@ -0,0 +1,19 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +# +from rest_framework import authentication +from django.contrib.auth.models import AnonymousUser + + +class ApiKeyAuthentication(authentication.BaseAuthentication): + """API-Key header authentication""" + + def authenticate(self, request): + """Extract the authentication token, if present + + This does not validate the token, it just arranges for it to be available in request.auth. + It's up to a Permissions class to validate it for the appropriate endpoint. + """ + token = request.META.get("HTTP_X_API_KEY", None) + if token is None: + return None + return AnonymousUser(), token # available as request.user and request.auth diff --git a/ietf/api/ietf_utils.py b/ietf/api/ietf_utils.py index 06b9d76aff8..50767a5afd5 100644 --- a/ietf/api/ietf_utils.py +++ b/ietf/api/ietf_utils.py @@ -2,14 +2,75 @@ # This is not utils.py because Tastypie implicitly consumes ietf.api.utils. # See ietf.api.__init__.py for details. +from functools import wraps +from typing import Callable, Optional, Union from django.conf import settings +from django.http import HttpResponseForbidden + def is_valid_token(endpoint, token): # This is where we would consider integration with vault # Settings implementation for now. if hasattr(settings, "APP_API_TOKENS"): token_store = settings.APP_API_TOKENS - if endpoint in token_store and token in token_store[endpoint]: - return True + if endpoint in token_store: + endpoint_tokens = token_store[endpoint] + # Be sure endpoints is a list or tuple so we don't accidentally use substring matching! + if not isinstance(endpoint_tokens, (list, tuple)): + endpoint_tokens = [endpoint_tokens] + if token in endpoint_tokens: + return True return False + + +def requires_api_token(func_or_endpoint: Optional[Union[Callable, str]] = None): + """Validate API token before executing the wrapped method + + Usage: + * Basic: endpoint defaults to the qualified name of the wrapped method. E.g., in ietf.api.views, + + @requires_api_token + def my_view(request): + ... + + will require a token for "ietf.api.views.my_view" + + * Custom endpoint: specify the endpoint explicitly + + @requires_api_token("ietf.api.views.some_other_thing") + def my_view(request): + ... + + will require a token for "ietf.api.views.some_other_thing" + """ + + def decorate(f): + if _endpoint is None: + fname = getattr(f, "__qualname__", None) + if fname is None: + raise TypeError( + "Cannot automatically decorate function that does not support __qualname__. " + "Explicitly set the endpoint." + ) + endpoint = "{}.{}".format(f.__module__, fname) + else: + endpoint = _endpoint + + @wraps(f) + def wrapped(request, *args, **kwargs): + authtoken = request.META.get("HTTP_X_API_KEY", None) + if authtoken is None or not is_valid_token(endpoint, authtoken): + return HttpResponseForbidden() + return f(request, *args, **kwargs) + + return wrapped + + # Magic to allow decorator to be used with or without parentheses + if callable(func_or_endpoint): + func = func_or_endpoint + _endpoint = None + return decorate(func) + else: + _endpoint = func_or_endpoint + return decorate diff --git a/ietf/api/permissions.py b/ietf/api/permissions.py new file mode 100644 index 00000000000..8f7fdd026fd --- /dev/null +++ b/ietf/api/permissions.py @@ -0,0 +1,39 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +# +from rest_framework import permissions +from ietf.api.ietf_utils import is_valid_token + + +class HasApiKey(permissions.BasePermission): + """Permissions class that validates a token using is_valid_token + + The view class must indicate the relevant endpoint by setting `api_key_endpoint`. + Must be used with an Authentication class that puts a token in request.auth. + """ + def has_permission(self, request, view): + endpoint = getattr(view, "api_key_endpoint", None) + auth_token = getattr(request, "auth", None) + if endpoint is not None and auth_token is not None: + return is_valid_token(endpoint, auth_token) + return False + + +class IsOwnPerson(permissions.BasePermission): + """Permission to access own Person object""" + def has_object_permission(self, request, view, obj): + if not (request.user.is_authenticated and hasattr(request.user, "person")): + return False + return obj == request.user.person + + +class BelongsToOwnPerson(permissions.BasePermission): + """Permission to access objects associated with own Person + + Requires that the object have a "person" field that indicates ownership. + """ + def has_object_permission(self, request, view, obj): + if not (request.user.is_authenticated and hasattr(request.user, "person")): + return False + return ( + hasattr(obj, "person") and obj.person == request.user.person + ) diff --git a/ietf/api/routers.py b/ietf/api/routers.py new file mode 100644 index 00000000000..745ddaa811a --- /dev/null +++ b/ietf/api/routers.py @@ -0,0 +1,16 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +"""Custom django-rest-framework routers""" +from django.core.exceptions import ImproperlyConfigured +from rest_framework import routers + +class PrefixedSimpleRouter(routers.SimpleRouter): + """SimpleRouter that adds a dot-separated prefix to its basename""" + def __init__(self, name_prefix="", *args, **kwargs): + self.name_prefix = name_prefix + if len(self.name_prefix) == 0 or self.name_prefix[-1] == ".": + raise ImproperlyConfigured("Cannot use a name_prefix that is empty or ends with '.'") + super().__init__(*args, **kwargs) + + def get_default_basename(self, viewset): + basename = super().get_default_basename(viewset) + return f"{self.name_prefix}.{basename}" diff --git a/ietf/api/schema.py b/ietf/api/schema.py new file mode 100644 index 00000000000..7340149685b --- /dev/null +++ b/ietf/api/schema.py @@ -0,0 +1,20 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +# +from drf_spectacular.extensions import OpenApiAuthenticationExtension + + +class ApiKeyAuthenticationScheme(OpenApiAuthenticationExtension): + """Authentication scheme extension for the ApiKeyAuthentication + + Used by drf-spectacular when rendering the OpenAPI schema + """ + target_class = "ietf.api.authentication.ApiKeyAuthentication" + name = "apiKeyAuth" + + def get_security_definition(self, auto_schema): + return { + "type": "apiKey", + "description": "Shared secret in the X-Api-Key header", + "name": "X-Api-Key", + "in": "header", + } diff --git a/ietf/api/serializer.py b/ietf/api/serializer.py index 9d6cf1ebb86..d5bca430e00 100644 --- a/ietf/api/serializer.py +++ b/ietf/api/serializer.py @@ -1,6 +1,9 @@ -# Copyright The IETF Trust 2018-2020, All Rights Reserved +# Copyright The IETF Trust 2018-2024, All Rights Reserved # -*- coding: utf-8 -*- +"""Serialization utilities +This is _not_ for django-rest-framework! +""" import hashlib import json @@ -9,11 +12,12 @@ from django.core.exceptions import ObjectDoesNotExist, FieldError from django.core.serializers.json import Serializer from django.http import HttpResponse -from django.utils.encoding import smart_text +from django.utils.encoding import smart_str from django.db.models import Field -from django.db.models.query import QuerySet from django.db.models.signals import post_save, post_delete, m2m_changed +from django_stubs_ext import QuerySetAny + import debug # pyflakes:ignore @@ -121,7 +125,7 @@ def end_object(self, obj): for name in expansions: try: field = getattr(obj, name) - #self._current["_"+name] = smart_text(field) + #self._current["_"+name] = smart_str(field) if not isinstance(field, Field): options = self.options.copy() options["expand"] = [ v[len(name)+2:] for v in options["expand"] if v.startswith(name+"__") ] @@ -145,7 +149,7 @@ def end_object(self, obj): field_value = None else: field_value = field - if isinstance(field_value, QuerySet) or isinstance(field_value, list): + if isinstance(field_value, QuerySetAny) or isinstance(field_value, list): self._current[name] = dict([ (rel.pk, self.expand_related(rel, name)) for rel in field_value ]) else: if hasattr(field_value, "_meta"): @@ -188,10 +192,10 @@ def handle_fk_field(self, obj, field): related = related.natural_key() elif field.remote_field.field_name == related._meta.pk.name: # Related to remote object via primary key - related = smart_text(related._get_pk_val(), strings_only=True) + related = smart_str(related._get_pk_val(), strings_only=True) else: # Related to remote object via other field - related = smart_text(getattr(related, field.remote_field.field_name), strings_only=True) + related = smart_str(getattr(related, field.remote_field.field_name), strings_only=True) self._current[field.name] = related def handle_m2m_field(self, obj, field): @@ -201,7 +205,7 @@ def handle_m2m_field(self, obj, field): elif self.use_natural_keys and hasattr(field.remote_field.to, 'natural_key'): m2m_value = lambda value: value.natural_key() else: - m2m_value = lambda value: smart_text(value._get_pk_val(), strings_only=True) + m2m_value = lambda value: smart_str(value._get_pk_val(), strings_only=True) self._current[field.name] = [m2m_value(related) for related in getattr(obj, field.name).iterator()] @@ -221,7 +225,7 @@ class JsonExportMixin(object): # obj = None # # if obj is None: -# raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(self.model._meta.verbose_name), 'key': escape(object_id)}) +# raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_str(self.model._meta.verbose_name), 'key': escape(object_id)}) # # content_type = 'application/json' # return HttpResponse(serialize([ obj ], sort_keys=True, indent=3)[2:-2], content_type=content_type) @@ -264,6 +268,6 @@ def json_view(self, request, filter=None, expand=None): qd = dict( ( k, json.loads(v)[0] ) for k,v in items ) except (FieldError, ValueError) as e: return HttpResponse(json.dumps({"error": str(e)}, sort_keys=True, indent=3), content_type=content_type) - text = json.dumps({smart_text(self.model._meta): qd}, sort_keys=True, indent=3) + text = json.dumps({smart_str(self.model._meta): qd}, sort_keys=True, indent=3) return HttpResponse(text, content_type=content_type) diff --git a/ietf/api/tests.py b/ietf/api/tests.py index c910b6f9048..2a44791a5cf 100644 --- a/ietf/api/tests.py +++ b/ietf/api/tests.py @@ -1,18 +1,22 @@ -# Copyright The IETF Trust 2015-2020, All Rights Reserved +# Copyright The IETF Trust 2015-2024, All Rights Reserved # -*- coding: utf-8 -*- - +import base64 +import copy import datetime import json import html +from unittest import mock import os import sys from importlib import import_module from pathlib import Path +from random import randrange from django.apps import apps from django.conf import settings -from django.test import Client +from django.http import HttpResponseForbidden +from django.test import Client, RequestFactory from django.test.utils import override_settings from django.urls import reverse as urlreverse from django.utils import timezone @@ -22,24 +26,31 @@ import debug # pyflakes:ignore import ietf +from ietf.doc.storage_utils import retrieve_str from ietf.doc.utils import get_unicode_document_content from ietf.doc.models import RelatedDocument, State -from ietf.doc.factories import IndividualDraftFactory, WgDraftFactory +from ietf.doc.factories import IndividualDraftFactory, WgDraftFactory, WgRfcFactory from ietf.group.factories import RoleFactory from ietf.meeting.factories import MeetingFactory, SessionFactory -from ietf.meeting.models import Session -from ietf.person.factories import PersonFactory, random_faker -from ietf.person.models import User -from ietf.person.models import PersonalApiKey -from ietf.stats.models import MeetingRegistration -from ietf.utils.mail import outbox, get_payload_text +from ietf.meeting.models import Session, Registration +from ietf.nomcom.models import Volunteer +from ietf.nomcom.factories import NomComFactory, nomcom_kwargs_for_year +from ietf.person.factories import PersonFactory, random_faker, EmailFactory, PersonalApiKeyFactory +from ietf.person.models import Email, User +from ietf.utils.mail import empty_outbox, outbox, get_payload_text from ietf.utils.models import DumpInfo from ietf.utils.test_utils import TestCase, login_testing_unauthorized, reload_db_objects +from . import Serializer +from .ietf_utils import is_valid_token, requires_api_token +from .views import EmailIngestionError + OMITTED_APPS = ( 'ietf.secr.meetings', 'ietf.secr.proceedings', 'ietf.ipr', + 'ietf.status', + 'ietf.blobdb', ) class CustomApiTests(TestCase): @@ -62,7 +73,7 @@ def test_deprecated_api_set_session_video_url(self): meeting = MeetingFactory(type_id='ietf') session = SessionFactory(group__type_id='wg', meeting=meeting) group = session.group - apikey = PersonalApiKey.objects.create(endpoint=url, person=recman) + apikey = PersonalApiKeyFactory(endpoint=url, person=recman) video = 'https://foo.example.com/bar/beer/' # error cases @@ -70,7 +81,7 @@ def test_deprecated_api_set_session_video_url(self): self.assertContains(r, "Missing apikey parameter", status_code=400) badrole = RoleFactory(group__type_id='ietf', name_id='ad') - badapikey = PersonalApiKey.objects.create(endpoint=url, person=badrole.person) + badapikey = PersonalApiKeyFactory(endpoint=url, person=badrole.person) badrole.person.user.last_login = timezone.now() badrole.person.user.save() r = self.client.post(url, {'apikey': badapikey.hash()} ) @@ -142,7 +153,7 @@ def test_api_set_session_video_url(self): recman = recmanrole.person meeting = MeetingFactory(type_id="ietf") session = SessionFactory(group__type_id="wg", meeting=meeting) - apikey = PersonalApiKey.objects.create(endpoint=url, person=recman) + apikey = PersonalApiKeyFactory(endpoint=url, person=recman) video = "https://foo.example.com/bar/beer/" # error cases @@ -150,7 +161,7 @@ def test_api_set_session_video_url(self): self.assertContains(r, "Missing apikey parameter", status_code=400) badrole = RoleFactory(group__type_id="ietf", name_id="ad") - badapikey = PersonalApiKey.objects.create(endpoint=url, person=badrole.person) + badapikey = PersonalApiKeyFactory(endpoint=url, person=badrole.person) badrole.person.user.last_login = timezone.now() badrole.person.user.save() r = self.client.post(url, {"apikey": badapikey.hash()}) @@ -213,17 +224,83 @@ def test_api_set_session_video_url(self): event = doc.latest_event() self.assertEqual(event.by, recman) - def test_api_add_session_attendees(self): + def test_api_set_meetecho_recording_name(self): + url = urlreverse("ietf.meeting.views.api_set_meetecho_recording_name") + recmanrole = RoleFactory(group__type_id="ietf", name_id="recman") + recman = recmanrole.person + meeting = MeetingFactory(type_id="ietf") + session = SessionFactory(group__type_id="wg", meeting=meeting) + apikey = PersonalApiKeyFactory(endpoint=url, person=recman) + name = "testname" + + # error cases + r = self.client.post(url, {}) + self.assertContains(r, "Missing apikey parameter", status_code=400) + + badrole = RoleFactory(group__type_id="ietf", name_id="ad") + badapikey = PersonalApiKeyFactory(endpoint=url, person=badrole.person) + badrole.person.user.last_login = timezone.now() + badrole.person.user.save() + r = self.client.post(url, {"apikey": badapikey.hash()}) + self.assertContains(r, "Restricted to role: Recording Manager", status_code=403) + + r = self.client.post(url, {"apikey": apikey.hash()}) + self.assertContains(r, "Too long since last regular login", status_code=400) + recman.user.last_login = timezone.now() + recman.user.save() + + r = self.client.get(url, {"apikey": apikey.hash()}) + self.assertContains(r, "Method not allowed", status_code=405) + + r = self.client.post(url, {"apikey": apikey.hash()}) + self.assertContains(r, "Missing session_id parameter", status_code=400) + + r = self.client.post(url, {"apikey": apikey.hash(), "session_id": session.pk}) + self.assertContains(r, "Missing name parameter", status_code=400) + + bad_pk = int(Session.objects.order_by("-pk").first().pk) + 1 + r = self.client.post( + url, + { + "apikey": apikey.hash(), + "session_id": bad_pk, + "name": name, + }, + ) + self.assertContains(r, "Session not found", status_code=400) + + r = self.client.post( + url, + { + "apikey": apikey.hash(), + "session_id": "foo", + "name": name, + }, + ) + self.assertContains(r, "Invalid session_id", status_code=400) + + r = self.client.post( + url, {"apikey": apikey.hash(), "session_id": session.pk, "name": name} + ) + self.assertContains(r, "Done", status_code=200) + + session.refresh_from_db() + self.assertEqual(session.meetecho_recording_name, name) + + + def test_api_add_session_attendees_deprecated(self): + # Deprecated test - should be removed when we stop accepting a simple list of user PKs in + # the add_session_attendees() view url = urlreverse('ietf.meeting.views.api_add_session_attendees') otherperson = PersonFactory() recmanrole = RoleFactory(group__type_id='ietf', name_id='recman') recman = recmanrole.person meeting = MeetingFactory(type_id='ietf') session = SessionFactory(group__type_id='wg', meeting=meeting) - apikey = PersonalApiKey.objects.create(endpoint=url, person=recman) + apikey = PersonalApiKeyFactory(endpoint=url, person=recman) badrole = RoleFactory(group__type_id='ietf', name_id='ad') - badapikey = PersonalApiKey.objects.create(endpoint=url, person=badrole.person) + badapikey = PersonalApiKeyFactory(endpoint=url, person=badrole.person) badrole.person.user.last_login = timezone.now() badrole.person.user.save() @@ -279,6 +356,120 @@ def test_api_add_session_attendees(self): self.assertTrue(session.attended_set.filter(person=recman).exists()) self.assertTrue(session.attended_set.filter(person=otherperson).exists()) + def test_api_add_session_attendees(self): + url = urlreverse("ietf.meeting.views.api_add_session_attendees") + otherperson = PersonFactory() + recmanrole = RoleFactory(group__type_id="ietf", name_id="recman") + recman = recmanrole.person + meeting = MeetingFactory(type_id="ietf") + session = SessionFactory(group__type_id="wg", meeting=meeting) + apikey = PersonalApiKeyFactory(endpoint=url, person=recman) + + badrole = RoleFactory(group__type_id="ietf", name_id="ad") + badapikey = PersonalApiKeyFactory(endpoint=url, person=badrole.person) + badrole.person.user.last_login = timezone.now() + badrole.person.user.save() + + # Improper credentials, or method + r = self.client.post(url, {}) + self.assertContains(r, "Missing apikey parameter", status_code=400) + + r = self.client.post(url, {"apikey": badapikey.hash()}) + self.assertContains(r, "Restricted to role: Recording Manager", status_code=403) + + r = self.client.post(url, {"apikey": apikey.hash()}) + self.assertContains(r, "Too long since last regular login", status_code=400) + + recman.user.last_login = timezone.now() - datetime.timedelta(days=365) + recman.user.save() + r = self.client.post(url, {"apikey": apikey.hash()}) + self.assertContains(r, "Too long since last regular login", status_code=400) + + recman.user.last_login = timezone.now() + recman.user.save() + r = self.client.get(url, {"apikey": apikey.hash()}) + self.assertContains(r, "Method not allowed", status_code=405) + + recman.user.last_login = timezone.now() + recman.user.save() + + # Malformed requests + r = self.client.post(url, {"apikey": apikey.hash()}) + self.assertContains(r, "Missing attended parameter", status_code=400) + + for baddict in ( + "{}", + '{"bogons;drop table":"bogons;drop table"}', + '{"session_id":"Not an integer;drop table"}', + f'{{"session_id":{session.pk},"attendees":"not a list;drop table"}}', + f'{{"session_id":{session.pk},"attendees":"not a list;drop table"}}', + f'{{"session_id":{session.pk},"attendees":[1,2,"not an int;drop table",4]}}', + f'{{"session_id":{session.pk},"attendees":["user_id":{recman.user.pk}]}}', # no join_time + f'{{"session_id":{session.pk},"attendees":["user_id":{recman.user.pk},"join_time;drop table":"2024-01-01T00:00:00Z]}}', + f'{{"session_id":{session.pk},"attendees":["user_id":{recman.user.pk},"join_time":"not a time;drop table"]}}', + # next has no time zone indicator + f'{{"session_id":{session.pk},"attendees":["user_id":{recman.user.pk},"join_time":"2024-01-01T00:00:00"]}}', + f'{{"session_id":{session.pk},"attendees":["user_id":"not an int; drop table","join_time":"2024-01-01T00:00:00Z"]}}', + # Uncomment the next one when the _deprecated version of this test is retired + # f'{{"session_id":{session.pk},"attendees":[{recman.user.pk}, {otherperson.user.pk}]}}', + ): + r = self.client.post(url, {"apikey": apikey.hash(), "attended": baddict}) + self.assertContains(r, "Malformed post", status_code=400) + + bad_session_id = Session.objects.order_by("-pk").first().pk + 1 + r = self.client.post( + url, + { + "apikey": apikey.hash(), + "attended": f'{{"session_id":{bad_session_id},"attendees":[]}}', + }, + ) + self.assertContains(r, "Invalid session", status_code=400) + bad_user_id = User.objects.order_by("-pk").first().pk + 1 + r = self.client.post( + url, + { + "apikey": apikey.hash(), + "attended": f'{{"session_id":{session.pk},"attendees":[{{"user_id":{bad_user_id}, "join_time":"2024-01-01T00:00:00Z"}}]}}', + }, + ) + self.assertContains(r, "Invalid attendee", status_code=400) + + # Reasonable request + r = self.client.post( + url, + { + "apikey": apikey.hash(), + "attended": json.dumps( + { + "session_id": session.pk, + "attendees": [ + { + "user_id": recman.user.pk, + "join_time": "2023-09-03T12:34:56Z", + }, + { + "user_id": otherperson.user.pk, + "join_time": "2023-09-03T03:00:19Z", + }, + ], + } + ), + }, + ) + + self.assertEqual(session.attended_set.count(), 2) + self.assertTrue(session.attended_set.filter(person=recman).exists()) + self.assertEqual( + session.attended_set.get(person=recman).time, + datetime.datetime(2023, 9, 3, 12, 34, 56, tzinfo=datetime.UTC), + ) + self.assertTrue(session.attended_set.filter(person=otherperson).exists()) + self.assertEqual( + session.attended_set.get(person=otherperson).time, + datetime.datetime(2023, 9, 3, 3, 0, 19, tzinfo=datetime.UTC), + ) + def test_api_upload_polls_and_chatlog(self): recmanrole = RoleFactory(group__type_id='ietf', name_id='recman') recmanrole.person.user.last_login = timezone.now() @@ -328,8 +519,8 @@ def test_api_upload_polls_and_chatlog(self): ), ): url = urlreverse(f"ietf.meeting.views.api_upload_{type_id}") - apikey = PersonalApiKey.objects.create(endpoint=url, person=recmanrole.person) - badapikey = PersonalApiKey.objects.create(endpoint=url, person=badrole.person) + apikey = PersonalApiKeyFactory(endpoint=url, person=recmanrole.person) + badapikey = PersonalApiKeyFactory(endpoint=url, person=badrole.person) r = self.client.post(url, {}) self.assertContains(r, "Missing apikey parameter", status_code=400) @@ -362,101 +553,13 @@ def test_api_upload_polls_and_chatlog(self): r = self.client.post(url,{'apikey':apikey.hash(),'apidata': f'{{"session_id":{session.pk}, "{type_id}":{content}}}'}) self.assertEqual(r.status_code, 200) - newdoc = session.sessionpresentation_set.get(document__type_id=type_id).document + newdoc = session.presentations.get(document__type_id=type_id).document newdoccontent = get_unicode_document_content(newdoc.name, Path(session.meeting.get_materials_path()) / type_id / newdoc.uploaded_filename) self.assertEqual(json.loads(content), json.loads(newdoccontent)) - - def test_deprecated_api_upload_bluesheet(self): - url = urlreverse('ietf.meeting.views.api_upload_bluesheet') - recmanrole = RoleFactory(group__type_id='ietf', name_id='recman') - recman = recmanrole.person - meeting = MeetingFactory(type_id='ietf') - session = SessionFactory(group__type_id='wg', meeting=meeting) - group = session.group - apikey = PersonalApiKey.objects.create(endpoint=url, person=recman) - - people = [ - {"name": "Andrea Andreotti", "affiliation": "Azienda"}, - {"name": "Bosse Bernadotte", "affiliation": "Bolag"}, - {"name": "Charles Charlemagne", "affiliation": "Compagnie"}, - ] - for i in range(3): - faker = random_faker() - people.append(dict(name=faker.name(), affiliation=faker.company())) - bluesheet = json.dumps(people) - - # error cases - r = self.client.post(url, {}) - self.assertContains(r, "Missing apikey parameter", status_code=400) - - badrole = RoleFactory(group__type_id='ietf', name_id='ad') - badapikey = PersonalApiKey.objects.create(endpoint=url, person=badrole.person) - badrole.person.user.last_login = timezone.now() - badrole.person.user.save() - r = self.client.post(url, {'apikey': badapikey.hash()}) - self.assertContains(r, "Restricted to roles: Recording Manager, Secretariat", status_code=403) - - r = self.client.post(url, {'apikey': apikey.hash()}) - self.assertContains(r, "Too long since last regular login", status_code=400) - recman.user.last_login = timezone.now() - recman.user.save() - - r = self.client.get(url, {'apikey': apikey.hash()}) - self.assertContains(r, "Method not allowed", status_code=405) - - r = self.client.post(url, {'apikey': apikey.hash(), 'group': group.acronym}) - self.assertContains(r, "Missing meeting parameter", status_code=400) - - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': meeting.number, }) - self.assertContains(r, "Missing group parameter", status_code=400) - - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': meeting.number, 'group': group.acronym}) - self.assertContains(r, "Missing item parameter", status_code=400) - - r = self.client.post(url, - {'apikey': apikey.hash(), 'meeting': meeting.number, 'group': group.acronym, 'item': '1'}) - self.assertContains(r, "Missing bluesheet parameter", status_code=400) - - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': '1', 'group': group.acronym, - 'item': '1', 'bluesheet': bluesheet, }) - self.assertContains(r, "No sessions found for meeting", status_code=400) - - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': meeting.number, 'group': 'bogous', - 'item': '1', 'bluesheet': bluesheet, }) - self.assertContains(r, "No sessions found in meeting '%s' for group 'bogous'" % meeting.number, status_code=400) - - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': meeting.number, 'group': group.acronym, - 'item': '1', 'bluesheet': "foobar", }) - self.assertContains(r, "Invalid json value: 'foobar'", status_code=400) - - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': meeting.number, 'group': group.acronym, - 'item': '5', 'bluesheet': bluesheet, }) - self.assertContains(r, "No item '5' found in list of sessions for group", status_code=400) - - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': meeting.number, 'group': group.acronym, - 'item': 'foo', 'bluesheet': bluesheet, }) - self.assertContains(r, "Expected a numeric value for 'item', found 'foo'", status_code=400) - - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': meeting.number, 'group': group.acronym, - 'item': '1', 'bluesheet': bluesheet, }) - self.assertContains(r, "Done", status_code=200) - - # Submit again, with slightly different content, as an updated version - people[1]['affiliation'] = 'Bolaget AB' - bluesheet = json.dumps(people) - r = self.client.post(url, {'apikey': apikey.hash(), 'meeting': meeting.number, 'group': group.acronym, - 'item': '1', 'bluesheet': bluesheet, }) - self.assertContains(r, "Done", status_code=200) - - bluesheet = session.sessionpresentation_set.filter(document__type__slug='bluesheets').first().document - # We've submitted an update; check that the rev is right - self.assertEqual(bluesheet.rev, '01') - # Check the content - with open(bluesheet.get_file_name()) as file: - text = file.read() - for p in people: - self.assertIn(p['name'], html.unescape(text)) - self.assertIn(p['affiliation'], html.unescape(text)) + self.assertEqual( + json.loads(retrieve_str(type_id, newdoc.uploaded_filename)), + json.loads(content) + ) def test_api_upload_bluesheet(self): url = urlreverse("ietf.meeting.views.api_upload_bluesheet") @@ -464,8 +567,7 @@ def test_api_upload_bluesheet(self): recman = recmanrole.person meeting = MeetingFactory(type_id="ietf") session = SessionFactory(group__type_id="wg", meeting=meeting) - group = session.group - apikey = PersonalApiKey.objects.create(endpoint=url, person=recman) + apikey = PersonalApiKeyFactory(endpoint=url, person=recman) people = [ {"name": "Andrea Andreotti", "affiliation": "Azienda"}, @@ -482,7 +584,7 @@ def test_api_upload_bluesheet(self): self.assertContains(r, "Missing apikey parameter", status_code=400) badrole = RoleFactory(group__type_id="ietf", name_id="ad") - badapikey = PersonalApiKey.objects.create(endpoint=url, person=badrole.person) + badapikey = PersonalApiKeyFactory(endpoint=url, person=badrole.person) badrole.person.user.last_login = timezone.now() badrole.person.user.save() r = self.client.post(url, {"apikey": badapikey.hash()}) @@ -504,18 +606,6 @@ def test_api_upload_bluesheet(self): r = self.client.post(url, {"apikey": apikey.hash(), "session_id": session.pk}) self.assertContains(r, "Missing bluesheet parameter", status_code=400) - r = self.client.post( - url, - { - "apikey": apikey.hash(), - "meeting": meeting.number, - "group": group.acronym, - "item": "1", - "bluesheet": "foobar", - }, - ) - self.assertContains(r, "Invalid json value: 'foobar'", status_code=400) - bad_session_pk = int(Session.objects.order_by("-pk").first().pk) + 1 r = self.client.post( url, @@ -554,16 +644,14 @@ def test_api_upload_bluesheet(self): url, { "apikey": apikey.hash(), - "meeting": meeting.number, - "group": group.acronym, - "item": "1", + "session_id": session.pk, "bluesheet": bluesheet, }, ) self.assertContains(r, "Done", status_code=200) bluesheet = ( - session.sessionpresentation_set.filter(document__type__slug="bluesheets") + session.presentations.filter(document__type__slug="bluesheets") .first() .document ) @@ -581,6 +669,7 @@ def test_person_export(self): url = urlreverse('ietf.api.views.PersonalInformationExportView') login_testing_unauthorized(self, person.user.username, url) r = self.client.get(url) + self.assertEqual(r.status_code, 200) jsondata = r.json() data = jsondata['person.person'][str(person.id)] self.assertEqual(data['name'], person.name) @@ -591,14 +680,14 @@ def test_api_v2_person_export_view(self): url = urlreverse('ietf.api.views.ApiV2PersonExportView') robot = PersonFactory(user__is_staff=True) RoleFactory(name_id='robot', person=robot, email=robot.email(), group__acronym='secretariat') - apikey = PersonalApiKey.objects.create(endpoint=url, person=robot) + apikey = PersonalApiKeyFactory(endpoint=url, person=robot) # error cases r = self.client.post(url, {}) self.assertContains(r, "Missing apikey parameter", status_code=400) badrole = RoleFactory(group__type_id='ietf', name_id='ad') - badapikey = PersonalApiKey.objects.create(endpoint=url, person=badrole.person) + badapikey = PersonalApiKeyFactory(endpoint=url, person=badrole.person) badrole.person.user.last_login = timezone.now() badrole.person.user.save() r = self.client.post(url, {'apikey': badapikey.hash()}) @@ -616,86 +705,179 @@ def test_api_v2_person_export_view(self): self.assertEqual(data['ascii'], robot.ascii) self.assertEqual(data['user']['email'], robot.user.email) - def test_api_new_meeting_registration(self): + @override_settings(APP_API_TOKENS={"ietf.api.views.api_new_meeting_registration_v2": ["valid-token"]}) + def test_api_new_meeting_registration_v2(self): meeting = MeetingFactory(type_id='ietf') - reg = { - 'apikey': 'invalid', + person = PersonFactory() + reg_detail = { + 'email': person.email().address, + 'first_name': person.first_name(), + 'last_name': person.last_name(), + 'meeting': meeting.number, 'affiliation': "Alguma Corporação", 'country_code': 'PT', - 'email': 'foo@example.pt', - 'first_name': 'Foo', - 'last_name': 'Bar', - 'meeting': meeting.number, - 'reg_type': 'hackathon', - 'ticket_type': '', - 'checkedin': 'False', + 'checkedin': False, + 'is_nomcom_volunteer': False, + 'cancelled': False, + 'tickets': [{'attendance_type': 'onsite', 'ticket_type': 'week_pass'}], } - url = urlreverse('ietf.api.views.api_new_meeting_registration') - r = self.client.post(url, reg) - self.assertContains(r, 'Invalid apikey', status_code=403) - oidcp = PersonFactory(user__is_staff=True) - # Make sure 'oidcp' has an acceptable role - RoleFactory(name_id='robot', person=oidcp, email=oidcp.email(), group__acronym='secretariat') - key = PersonalApiKey.objects.create(person=oidcp, endpoint=url) - reg['apikey'] = key.hash() + reg_data = {'objects': {reg_detail['email']: reg_detail}} + url = urlreverse('ietf.api.views.api_new_meeting_registration_v2') # - # Test valid POST - # FIXME: sometimes, there seems to be something in the outbox? - old_len = len(outbox) - r = self.client.post(url, reg) - self.assertContains(r, "Accepted, New registration, Email sent", status_code=202) - # - # Check outgoing mail - self.assertEqual(len(outbox), old_len + 1) - body = get_payload_text(outbox[-1]) - self.assertIn(reg['email'], outbox[-1]['To'] ) - self.assertIn(reg['email'], body) - self.assertIn('account creation request', body) + # Test invalid key + r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "invalid-token"}) + self.assertEqual(r.status_code, 403) # - # Check record - obj = MeetingRegistration.objects.get(email=reg['email'], meeting__number=reg['meeting']) - for key in ['affiliation', 'country_code', 'first_name', 'last_name', 'person', 'reg_type', 'ticket_type', 'checkedin']: - self.assertEqual(getattr(obj, key), False if key=='checkedin' else reg.get(key) , "Bad data for field '%s'" % key) + # Test invalid data + bad_reg_data = copy.deepcopy(reg_data) + del bad_reg_data['objects'][reg_detail['email']]['email'] + r = self.client.post(url, data=json.dumps(bad_reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 400) # - # Test with existing user - person = PersonFactory() - reg['email'] = person.email().address - reg['first_name'] = person.first_name() - reg['last_name'] = person.last_name() - # - r = self.client.post(url, reg) - self.assertContains(r, "Accepted, New registration", status_code=202) + # Test valid POST + r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"}) + self.assertContains(r, "Success", status_code=202) # - # There should be no new outgoing mail - self.assertEqual(len(outbox), old_len + 1) + # Check record + objects = Registration.objects.filter(email=reg_detail['email'], meeting__number=reg_detail['meeting']) + self.assertEqual(objects.count(), 1) + obj = objects[0] + for key in ['affiliation', 'country_code', 'first_name', 'last_name', 'checkedin']: + self.assertEqual(getattr(obj, key), False if key == 'checkedin' else reg_detail.get(key), f"Bad data for field {key}") + self.assertEqual(obj.tickets.count(), 1) + ticket = obj.tickets.first() + self.assertEqual(ticket.ticket_type.slug, reg_detail['tickets'][0]['ticket_type']) + self.assertEqual(ticket.attendance_type.slug, reg_detail['tickets'][0]['attendance_type']) + self.assertEqual(obj.person, person) # - # Test multiple reg types - reg['reg_type'] = 'remote' - reg['ticket_type'] = 'full_week_pass' - r = self.client.post(url, reg) - self.assertContains(r, "Accepted, New registration", status_code=202) - objs = MeetingRegistration.objects.filter(email=reg['email'], meeting__number=reg['meeting']) - self.assertEqual(len(objs), 2) - self.assertEqual(objs.filter(reg_type='hackathon').count(), 1) - self.assertEqual(objs.filter(reg_type='remote', ticket_type='full_week_pass').count(), 1) - self.assertEqual(len(outbox), old_len + 1) + # Test update (switch to remote) + reg_detail = { + 'affiliation': "Alguma Corporação", + 'country_code': 'PT', + 'email': person.email().address, + 'first_name': person.first_name(), + 'last_name': person.last_name(), + 'meeting': meeting.number, + 'checkedin': False, + 'is_nomcom_volunteer': False, + 'cancelled': False, + 'tickets': [{'attendance_type': 'remote', 'ticket_type': 'week_pass'}], + } + reg_data = {'objects': {reg_detail['email']: reg_detail}} + r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"}) + self.assertContains(r, "Success", status_code=202) + objects = Registration.objects.filter(email=reg_detail['email'], meeting__number=reg_detail['meeting']) + self.assertEqual(objects.count(), 1) + obj = objects[0] + self.assertEqual(obj.tickets.count(), 1) + ticket = obj.tickets.first() + self.assertEqual(ticket.ticket_type.slug, reg_detail['tickets'][0]['ticket_type']) + self.assertEqual(ticket.attendance_type.slug, reg_detail['tickets'][0]['attendance_type']) # - # Test incomplete POST - drop_fields = ['affiliation', 'first_name', 'reg_type'] - for field in drop_fields: - del reg[field] - r = self.client.post(url, reg) - self.assertContains(r, 'Missing parameters:', status_code=400) - err, fields = r.content.decode().split(':', 1) - missing_fields = [f.strip() for f in fields.split(',')] - self.assertEqual(set(missing_fields), set(drop_fields)) + # Test multiple + reg_detail = { + 'affiliation': "Alguma Corporação", + 'country_code': 'PT', + 'email': person.email().address, + 'first_name': person.first_name(), + 'last_name': person.last_name(), + 'meeting': meeting.number, + 'checkedin': False, + 'is_nomcom_volunteer': False, + 'cancelled': False, + 'tickets': [ + {'attendance_type': 'onsite', 'ticket_type': 'one_day'}, + {'attendance_type': 'remote', 'ticket_type': 'week_pass'}, + ], + } + reg_data = {'objects': {reg_detail['email']: reg_detail}} + r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"}) + self.assertContains(r, "Success", status_code=202) + objects = Registration.objects.filter(email=reg_detail['email'], meeting__number=reg_detail['meeting']) + self.assertEqual(objects.count(), 1) + obj = objects[0] + self.assertEqual(obj.tickets.count(), 2) + self.assertEqual(obj.tickets.filter(attendance_type__slug='onsite').count(), 1) + self.assertEqual(obj.tickets.filter(attendance_type__slug='remote').count(), 1) + + @override_settings(APP_API_TOKENS={"ietf.api.views.api_new_meeting_registration_v2": ["valid-token"]}) + def test_api_new_meeting_registration_v2_cancelled(self): + meeting = MeetingFactory(type_id='ietf') + person = PersonFactory() + reg_detail = { + 'affiliation': "Acme", + 'country_code': 'US', + 'email': person.email().address, + 'first_name': person.first_name(), + 'last_name': person.last_name(), + 'meeting': meeting.number, + 'checkedin': False, + 'is_nomcom_volunteer': False, + 'cancelled': False, + 'tickets': [{'attendance_type': 'onsite', 'ticket_type': 'week_pass'}], + } + reg_data = {'objects': {reg_detail['email']: reg_detail}} + url = urlreverse('ietf.api.views.api_new_meeting_registration_v2') + self.assertEqual(Registration.objects.count(), 0) + r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"}) + self.assertContains(r, "Success", status_code=202) + self.assertEqual(Registration.objects.count(), 1) + reg_detail['cancelled'] = True + r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"}) + self.assertContains(r, "Success", status_code=202) + self.assertEqual(Registration.objects.count(), 0) + + @override_settings(APP_API_TOKENS={"ietf.api.views.api_new_meeting_registration_v2": ["valid-token"]}) + def test_api_new_meeting_registration_v2_nomcom(self): + meeting = MeetingFactory(type_id='ietf') + person = PersonFactory() + reg_detail = { + 'affiliation': "Acme", + 'country_code': 'US', + 'email': person.email().address, + 'first_name': person.first_name(), + 'last_name': person.last_name(), + 'meeting': meeting.number, + 'checkedin': False, + 'is_nomcom_volunteer': False, + 'cancelled': False, + 'tickets': [{'attendance_type': 'onsite', 'ticket_type': 'week_pass'}], + } + reg_data = {'objects': {reg_detail['email']: reg_detail}} + url = urlreverse('ietf.api.views.api_new_meeting_registration_v2') + now = datetime.datetime.now() + if now.month > 10: + year = now.year + 1 + else: + year = now.year + # create appropriate group and nomcom objects + nomcom = NomComFactory.create(is_accepting_volunteers=True, **nomcom_kwargs_for_year(year)) + + # first test is_nomcom_volunteer False + r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"}) + self.assertContains(r, "Success", status_code=202) + # assert no Volunteers exists + self.assertEqual(Volunteer.objects.count(), 0) + + # test is_nomcom_volunteer True + reg_detail['is_nomcom_volunteer'] = True + r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"}) + self.assertContains(r, "Success", status_code=202) + # assert Volunteer exists + self.assertEqual(Volunteer.objects.count(), 1) + volunteer = Volunteer.objects.last() + self.assertEqual(volunteer.person, person) + self.assertEqual(volunteer.nomcom, nomcom) + self.assertEqual(volunteer.origin, 'registration') def test_api_version(self): - DumpInfo.objects.create(date=timezone.datetime(2022,8,31,7,10,1,tzinfo=timezone.utc), host='testapi.example.com',tz='UTC') + DumpInfo.objects.create(date=timezone.datetime(2022,8,31,7,10,1,tzinfo=datetime.UTC), host='testapi.example.com',tz='UTC') url = urlreverse('ietf.api.views.version') r = self.client.get(url) data = r.json() self.assertEqual(data['version'], ietf.__version__+ietf.__patch__) + for lib in settings.ADVERTISE_VERSIONS: + self.assertIn(lib, data['other']) self.assertEqual(data['dumptime'], "2022-08-31 07:10:01 +0000") DumpInfo.objects.update(tz='PST8PDT') r = self.client.get(url) @@ -704,27 +886,519 @@ def test_api_version(self): def test_api_appauth(self): - url = urlreverse('ietf.api.views.app_auth') - person = PersonFactory() - apikey = PersonalApiKey.objects.create(endpoint=url, person=person) + for app in ["authortools", "bibxml"]: + url = urlreverse('ietf.api.views.app_auth', kwargs={"app": app}) + person = PersonFactory() + apikey = PersonalApiKeyFactory(endpoint=url, person=person) + + self.client.login(username=person.user.username,password=f'{person.user.username}+password') + self.client.logout() + + # error cases + # missing apikey + r = self.client.post(url, {}) + self.assertContains(r, 'Missing apikey parameter', status_code=400) + + # invalid apikey + r = self.client.post(url, {'apikey': 'foobar'}) + self.assertContains(r, 'Invalid apikey', status_code=403) + + # working case + r = self.client.post(url, {'apikey': apikey.hash()}) + self.assertEqual(r.status_code, 200) + jsondata = r.json() + self.assertEqual(jsondata['success'], True) + self.client.logout() - self.client.login(username=person.user.username,password=f'{person.user.username}+password') - self.client.logout() + @override_settings(APP_API_TOKENS={"ietf.api.views.nfs_metrics": ["valid-token"]}) + def test_api_nfs_metrics(self): + url = urlreverse("ietf.api.views.nfs_metrics") + r = self.client.get(url) + self.assertEqual(r.status_code, 403) + r = self.client.get(url, headers={"X-Api-Key": "valid-token"}) + self.assertContains(r, 'nfs_latency_seconds{operation="write"}') - # error cases - # missing apikey - r = self.client.post(url, {}) - self.assertContains(r, 'Missing apikey parameter', status_code=400) + def test_api_get_session_matherials_no_agenda_meeting_url(self): + meeting = MeetingFactory(type_id='ietf') + session = SessionFactory(meeting=meeting) + url = urlreverse('ietf.meeting.views.api_get_session_materials', kwargs={'session_id': session.pk}) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + + @override_settings(APP_API_TOKENS={"ietf.api.views.draft_aliases": ["valid-token"]}) + @mock.patch("ietf.api.views.DraftAliasGenerator") + def test_draft_aliases(self, mock): + mock.return_value = (("alias1", ("a1", "a2")), ("alias2", ("a3", "a4"))) + url = urlreverse("ietf.api.views.draft_aliases") + r = self.client.get(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-type"], "application/json") + self.assertEqual( + json.loads(r.content), + { + "aliases": [ + {"alias": "alias1", "domains": ["ietf"], "addresses": ["a1", "a2"]}, + {"alias": "alias2", "domains": ["ietf"], "addresses": ["a3", "a4"]}, + ]} + ) + # some invalid cases + self.assertEqual( + self.client.get(url, headers={}).status_code, + 403, + ) + self.assertEqual( + self.client.get(url, headers={"X-Api-Key": "something-else"}).status_code, + 403, + ) + self.assertEqual( + self.client.post(url, headers={"X-Api-Key": "something-else"}).status_code, + 403, + ) + self.assertEqual( + self.client.post(url, headers={"X-Api-Key": "valid-token"}).status_code, + 405, + ) - # invalid apikey - r = self.client.post(url, {'apikey': 'foobar'}) - self.assertContains(r, 'Invalid apikey', status_code=403) + @override_settings(APP_API_TOKENS={"ietf.api.views.group_aliases": ["valid-token"]}) + @mock.patch("ietf.api.views.GroupAliasGenerator") + def test_group_aliases(self, mock): + mock.return_value = (("alias1", ("ietf",), ("a1", "a2")), ("alias2", ("ietf", "iab"), ("a3", "a4"))) + url = urlreverse("ietf.api.views.group_aliases") + r = self.client.get(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-type"], "application/json") + self.assertEqual( + json.loads(r.content), + { + "aliases": [ + {"alias": "alias1", "domains": ["ietf"], "addresses": ["a1", "a2"]}, + {"alias": "alias2", "domains": ["ietf", "iab"], "addresses": ["a3", "a4"]}, + ]} + ) + # some invalid cases + self.assertEqual( + self.client.get(url, headers={}).status_code, + 403, + ) + self.assertEqual( + self.client.get(url, headers={"X-Api-Key": "something-else"}).status_code, + 403, + ) + self.assertEqual( + self.client.post(url, headers={"X-Api-Key": "something-else"}).status_code, + 403, + ) + self.assertEqual( + self.client.post(url, headers={"X-Api-Key": "valid-token"}).status_code, + 405, + ) - # working case - r = self.client.post(url, {'apikey': apikey.hash()}) + @override_settings(APP_API_TOKENS={"ietf.api.views.active_email_list": ["valid-token"]}) + def test_active_email_list(self): + EmailFactory(active=True) # make sure there's at least one active email... + EmailFactory(active=False) # ... and at least one non-active emai + url = urlreverse("ietf.api.views.active_email_list") + r = self.client.post(url, headers={}) + self.assertEqual(r.status_code, 403) + r = self.client.get(url, headers={}) + self.assertEqual(r.status_code, 403) + r = self.client.get(url, headers={"X-Api-Key": "not-the-valid-token"}) + self.assertEqual(r.status_code, 403) + r = self.client.post(url, headers={"X-Api-Key": "not-the-valid-token"}) + self.assertEqual(r.status_code, 403) + r = self.client.post(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 405) + r = self.client.get(url, headers={"X-Api-Key": "valid-token"}) self.assertEqual(r.status_code, 200) - jsondata = r.json() - self.assertEqual(jsondata['success'], True) + self.assertEqual(r.headers["Content-Type"], "application/json") + result = json.loads(r.content) + self.assertCountEqual(result.keys(), ["addresses"]) + self.assertCountEqual(result["addresses"], Email.objects.filter(active=True).values_list("address", flat=True)) + + @override_settings(APP_API_TOKENS={"ietf.api.views.related_email_list": ["valid-token"]}) + def test_related_email_list(self): + joe = EmailFactory(address='joe@work.com') + EmailFactory(address='joe@home.com', person=joe.person) + EmailFactory(address='jòe@spain.com', person=joe.person) + url = urlreverse("ietf.api.views.related_email_list", kwargs={'email': 'joe@home.com'}) + # no api key + r = self.client.get(url, headers={}) + self.assertEqual(r.status_code, 403) + # invalid api key + r = self.client.get(url, headers={"X-Api-Key": "not-the-valid-token"}) + self.assertEqual(r.status_code, 403) + # wrong method + r = self.client.post(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 405) + # valid + r = self.client.get(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + result = json.loads(r.content) + self.assertCountEqual(result.keys(), ["addresses"]) + self.assertCountEqual(result["addresses"], joe.person.email_set.values_list("address", flat=True)) + # non-ascii + non_ascii_url = urlreverse("ietf.api.views.related_email_list", kwargs={'email': 'jòe@spain.com'}) + r = self.client.get(non_ascii_url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 200) + result = json.loads(r.content) + self.assertTrue('joe@home.com' in result["addresses"]) + # email not found + not_found_url = urlreverse("ietf.api.views.related_email_list", kwargs={'email': 'nobody@nowhere.com'}) + r = self.client.get(not_found_url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 404) + + @override_settings(APP_API_TOKENS={"ietf.api.views.role_holder_addresses": ["valid-token"]}) + def test_role_holder_addresses(self): + url = urlreverse("ietf.api.views.role_holder_addresses") + r = self.client.get(url, headers={}) + self.assertEqual(r.status_code, 403, "No api token, no access") + r = self.client.get(url, headers={"X-Api-Key": "not-valid-token"}) + self.assertEqual(r.status_code, 403, "Bad api token, no access") + r = self.client.post(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 405, "Bad method, no access") + + emails = EmailFactory.create_batch(5) + email_queryset = Email.objects.filter(pk__in=[e.pk for e in emails]) + with mock.patch("ietf.api.views.role_holder_emails", return_value=email_queryset): + r = self.client.get(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 200, "Good api token and method, access") + content_dict = json.loads(r.content) + self.assertCountEqual(content_dict.keys(), ["addresses"]) + self.assertEqual( + content_dict["addresses"], + sorted(e.address for e in emails), + ) + + @override_settings( + APP_API_TOKENS={"ietf.api.views.ingest_email": "valid-token", "ietf.api.views.ingest_email_test": "test-token"} + ) + @mock.patch("ietf.api.views.iana_ingest_review_email") + @mock.patch("ietf.api.views.ipr_ingest_response_email") + @mock.patch("ietf.api.views.nomcom_ingest_feedback_email") + def test_ingest_email( + self, mock_nomcom_ingest, mock_ipr_ingest, mock_iana_ingest + ): + mocks = {mock_nomcom_ingest, mock_ipr_ingest, mock_iana_ingest} + empty_outbox() + url = urlreverse("ietf.api.views.ingest_email") + test_mode_url = urlreverse("ietf.api.views.ingest_email_test") + + # test various bad calls + r = self.client.get(url) + self.assertEqual(r.status_code, 403) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.get(test_mode_url) + self.assertEqual(r.status_code, 403) + self.assertFalse(any(m.called for m in mocks)) + + r = self.client.post(url) + self.assertEqual(r.status_code, 403) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.post(test_mode_url) + self.assertEqual(r.status_code, 403) + self.assertFalse(any(m.called for m in mocks)) + + r = self.client.get(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 405) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.get(test_mode_url, headers={"X-Api-Key": "test-token"}) + self.assertEqual(r.status_code, 405) + self.assertFalse(any(m.called for m in mocks)) + + r = self.client.post(url, headers={"X-Api-Key": "valid-token"}) + self.assertEqual(r.status_code, 415) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.post(test_mode_url, headers={"X-Api-Key": "test-token"}) + self.assertEqual(r.status_code, 415) + self.assertFalse(any(m.called for m in mocks)) + + r = self.client.post( + url, content_type="application/json", headers={"X-Api-Key": "valid-token"} + ) + self.assertEqual(r.status_code, 400) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.post( + test_mode_url, content_type="application/json", headers={"X-Api-Key": "test-token"} + ) + self.assertEqual(r.status_code, 400) + self.assertFalse(any(m.called for m in mocks)) + + r = self.client.post( + url, + "this is not JSON!", + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 400) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.post( + test_mode_url, + "this is not JSON!", + content_type="application/json", + headers={"X-Api-Key": "test-token"}, + ) + self.assertEqual(r.status_code, 400) + self.assertFalse(any(m.called for m in mocks)) + + r = self.client.post( + url, + {"json": "yes", "valid_schema": False}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 400) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.post( + test_mode_url, + {"json": "yes", "valid_schema": False}, + content_type="application/json", + headers={"X-Api-Key": "test-token"}, + ) + self.assertEqual(r.status_code, 400) + self.assertFalse(any(m.called for m in mocks)) + + # bad destination + message_b64 = base64.b64encode(b"This is a message").decode() + r = self.client.post( + url, + {"dest": "not-a-destination", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "bad_dest"}) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.post( + test_mode_url, + {"dest": "not-a-destination", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "test-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "bad_dest"}) + self.assertFalse(any(m.called for m in mocks)) + + # test that valid requests call handlers appropriately + r = self.client.post( + url, + {"dest": "iana-review", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "ok"}) + self.assertTrue(mock_iana_ingest.called) + self.assertEqual(mock_iana_ingest.call_args, mock.call(b"This is a message")) + self.assertFalse(any(m.called for m in (mocks - {mock_iana_ingest}))) + mock_iana_ingest.reset_mock() + + # the test mode endpoint should _not_ call the handler + r = self.client.post( + test_mode_url, + {"dest": "iana-review", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "test-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "ok"}) + self.assertFalse(any(m.called for m in mocks)) + mock_iana_ingest.reset_mock() + + r = self.client.post( + url, + {"dest": "ipr-response", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "ok"}) + self.assertTrue(mock_ipr_ingest.called) + self.assertEqual(mock_ipr_ingest.call_args, mock.call(b"This is a message")) + self.assertFalse(any(m.called for m in (mocks - {mock_ipr_ingest}))) + mock_ipr_ingest.reset_mock() + + # the test mode endpoint should _not_ call the handler + r = self.client.post( + test_mode_url, + {"dest": "ipr-response", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "test-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "ok"}) + self.assertFalse(any(m.called for m in mocks)) + mock_ipr_ingest.reset_mock() + + # bad nomcom-feedback dest + for bad_nomcom_dest in [ + "nomcom-feedback", # no suffix + "nomcom-feedback-", # no year + "nomcom-feedback-squid", # not a year, + "nomcom-feedback-2024-2025", # also not a year + ]: + r = self.client.post( + url, + {"dest": bad_nomcom_dest, "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "bad_dest"}) + self.assertFalse(any(m.called for m in mocks)) + r = self.client.post( + test_mode_url, + {"dest": bad_nomcom_dest, "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "test-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "bad_dest"}) + self.assertFalse(any(m.called for m in mocks)) + + # good nomcom-feedback dest + random_year = randrange(100000) + r = self.client.post( + url, + {"dest": f"nomcom-feedback-{random_year}", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "ok"}) + self.assertTrue(mock_nomcom_ingest.called) + self.assertEqual(mock_nomcom_ingest.call_args, mock.call(b"This is a message", random_year)) + self.assertFalse(any(m.called for m in (mocks - {mock_nomcom_ingest}))) + mock_nomcom_ingest.reset_mock() + + # the test mode endpoint should _not_ call the handler + r = self.client.post( + test_mode_url, + {"dest": f"nomcom-feedback-{random_year}", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "test-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "ok"}) + self.assertFalse(any(m.called for m in mocks)) + mock_nomcom_ingest.reset_mock() + + # test that exceptions lead to email being sent - assumes that iana-review handling is representative + mock_iana_ingest.side_effect = EmailIngestionError("Error: don't send email") + r = self.client.post( + url, + {"dest": "iana-review", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "bad_msg"}) + self.assertTrue(mock_iana_ingest.called) + self.assertEqual(mock_iana_ingest.call_args, mock.call(b"This is a message")) + self.assertFalse(any(m.called for m in (mocks - {mock_iana_ingest}))) + self.assertEqual(len(outbox), 0) # implicitly tests that _none_ of the earlier tests sent email + mock_iana_ingest.reset_mock() + + # test default recipients and attached original message + mock_iana_ingest.side_effect = EmailIngestionError( + "Error: do send email", + email_body="This is my email\n", + email_original_message=b"This is the original message" + ) + with override_settings(ADMINS=[("Some Admin", "admin@example.com")]): + r = self.client.post( + url, + {"dest": "iana-review", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "bad_msg"}) + self.assertTrue(mock_iana_ingest.called) + self.assertEqual(mock_iana_ingest.call_args, mock.call(b"This is a message")) + self.assertFalse(any(m.called for m in (mocks - {mock_iana_ingest}))) + self.assertEqual(len(outbox), 1) + self.assertIn("admin@example.com", outbox[0]["To"]) + self.assertEqual("Error: do send email", outbox[0]["Subject"]) + self.assertEqual("This is my email\n", get_payload_text(outbox[0].get_body())) + attachments = list(a for a in outbox[0].iter_attachments()) + self.assertEqual(len(attachments), 1) + self.assertEqual(attachments[0].get_filename(), "original-message") + self.assertEqual(attachments[0].get_content_type(), "application/octet-stream") + self.assertEqual(attachments[0].get_content(), b"This is the original message") + mock_iana_ingest.reset_mock() + empty_outbox() + + # test overridden recipients and no attached original message + mock_iana_ingest.side_effect = EmailIngestionError( + "Error: do send email", + email_body="This is my email\n", + email_recipients=("thatguy@example.com") + ) + with override_settings(ADMINS=[("Some Admin", "admin@example.com")]): + r = self.client.post( + url, + {"dest": "iana-review", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "bad_msg"}) + self.assertTrue(mock_iana_ingest.called) + self.assertEqual(mock_iana_ingest.call_args, mock.call(b"This is a message")) + self.assertFalse(any(m.called for m in (mocks - {mock_iana_ingest}))) + self.assertEqual(len(outbox), 1) + self.assertNotIn("admin@example.com", outbox[0]["To"]) + self.assertIn("thatguy@example.com", outbox[0]["To"]) + self.assertEqual("Error: do send email", outbox[0]["Subject"]) + self.assertEqual("This is my email\n", get_payload_text(outbox[0])) + mock_iana_ingest.reset_mock() + empty_outbox() + + # test attached traceback + mock_iana_ingest.side_effect = EmailIngestionError( + "Error: do send email", + email_body="This is my email\n", + email_attach_traceback=True, + ) + with override_settings(ADMINS=[("Some Admin", "admin@example.com")]): + r = self.client.post( + url, + {"dest": "iana-review", "message": message_b64}, + content_type="application/json", + headers={"X-Api-Key": "valid-token"}, + ) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.headers["Content-Type"], "application/json") + self.assertEqual(json.loads(r.content), {"result": "bad_msg"}) + self.assertTrue(mock_iana_ingest.called) + self.assertEqual(mock_iana_ingest.call_args, mock.call(b"This is a message")) + self.assertFalse(any(m.called for m in (mocks - {mock_iana_ingest}))) + self.assertEqual(len(outbox), 1) + self.assertIn("admin@example.com", outbox[0]["To"]) + self.assertEqual("Error: do send email", outbox[0]["Subject"]) + self.assertEqual("This is my email\n", get_payload_text(outbox[0].get_body())) + attachments = list(a for a in outbox[0].iter_attachments()) + self.assertEqual(len(attachments), 1) + self.assertEqual(attachments[0].get_filename(), "traceback.txt") + self.assertEqual(attachments[0].get_content_type(), "text/plain") + self.assertIn("ietf.api.views.EmailIngestionError: Error: do send email", attachments[0].get_content()) + mock_iana_ingest.reset_mock() + empty_outbox() + class DirectAuthApiTests(TestCase): @@ -783,7 +1457,7 @@ def test_bad_post(self): data = self.response_data(r) self.assertEqual(data["result"], "failure") self.assertEqual(data["reason"], "invalid post") - + bad = dict(authtoken=self.valid_token, username=self.valid_person.user.username, password=self.valid_password) r = self.client.post(self.url, bad) self.assertEqual(r.status_code, 200) @@ -791,8 +1465,9 @@ def test_bad_post(self): self.assertEqual(data["result"], "failure") self.assertEqual(data["reason"], "invalid post") + @override_settings() def test_notokenstore(self): - self.assertFalse(hasattr(settings, "APP_API_TOKENS")) + del settings.APP_API_TOKENS # only affects overridden copy of settings! r = self.client.post(self.url,self.valid_body_with_good_password) self.assertEqual(r.status_code, 200) data = self.response_data(r) @@ -822,7 +1497,7 @@ def test_good_password(self): data = self.response_data(r) self.assertEqual(data["result"], "success") -class TastypieApiTestCase(ResourceTestCaseMixin, TestCase): +class TastypieApiTests(ResourceTestCaseMixin, TestCase): def __init__(self, *args, **kwargs): self.apps = {} for app_name in settings.INSTALLED_APPS: @@ -832,7 +1507,7 @@ def __init__(self, *args, **kwargs): models_path = os.path.join(os.path.dirname(app.__file__), "models.py") if os.path.exists(models_path): self.apps[name] = app_name - super(TastypieApiTestCase, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def test_api_top_level(self): client = Client(Accept='application/json') @@ -841,7 +1516,7 @@ def test_api_top_level(self): resource_list = r.json() for name in self.apps: - if not name in self.apps: + if not name in resource_list: sys.stderr.write("Expected a REST API resource for %s, but didn't find one\n" % name) for name in self.apps: @@ -867,6 +1542,21 @@ def test_all_model_resources_exist(self): self.assertIn(model._meta.model_name, list(app_resources.keys()), "There doesn't seem to be any API resource for model %s.models.%s"%(app.__name__,model.__name__,)) + def test_serializer_to_etree_handles_nulls(self): + """Serializer to_etree() should handle a null character""" + serializer = Serializer() + try: + serializer.to_etree("string with no nulls in it") + except ValueError: + self.fail("serializer.to_etree raised ValueError on an ordinary string") + try: + serializer.to_etree("string with a \x00 in it") + except ValueError: + self.fail( + "serializer.to_etree raised ValueError on a string " + "containing a null character" + ) + class RfcdiffSupportTests(TestCase): @@ -934,7 +1624,7 @@ def do_draft_test(self, name): self.assertNotIn('previous', received, 'Rev 00 has no previous name when not replacing a draft') replaced = IndividualDraftFactory() - RelatedDocument.objects.create(relationship_id='replaces',source=draft,target=replaced.docalias.first()) + RelatedDocument.objects.create(relationship_id='replaces',source=draft,target=replaced) received = self.getJson(dict(name=draft.name, rev='00')) self.assertEqual(received['previous'], f'{replaced.name}-{replaced.rev}', 'Rev 00 has a previous name when replacing a draft') @@ -964,19 +1654,19 @@ def test_draft_with_broken_history(self): def do_rfc_test(self, draft_name): draft = WgDraftFactory(name=draft_name, create_revisions=range(0,2)) - draft.docalias.create(name=f'rfc{self.next_rfc_number():04}') + rfc = WgRfcFactory(group=draft.group, rfc_number=self.next_rfc_number()) + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) draft.set_state(State.objects.get(type_id='draft',slug='rfc')) draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub')) - draft = reload_db_objects(draft) - rfc = draft + draft, rfc = reload_db_objects(draft, rfc) - number = rfc.rfc_number() + number = rfc.rfc_number received = self.getJson(dict(name=number)) self.assertEqual( received, dict( content_url=rfc.get_href(), - name=rfc.canonical_name(), + name=rfc.name, previous=f'{draft.name}-{draft.rev}', previous_url= draft.history_set.get(rev=draft.rev).get_href(), ), @@ -984,7 +1674,7 @@ def do_rfc_test(self, draft_name): ) num_received = received - received = self.getJson(dict(name=rfc.canonical_name())) + received = self.getJson(dict(name=rfc.name)) self.assertEqual(num_received, received, 'RFC by canonical name gives same result as by number') received = self.getJson(dict(name=f'RfC {number}')) @@ -1016,30 +1706,30 @@ def test_rfc(self): def test_rfc_with_tombstone(self): draft = WgDraftFactory(create_revisions=range(0,2)) - draft.docalias.create(name='rfc3261') # See views_doc.HAS_TOMBSTONE + rfc = WgRfcFactory(rfc_number=3261,group=draft.group)# See views_doc.HAS_TOMBSTONE + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) draft.set_state(State.objects.get(type_id='draft',slug='rfc')) draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub')) draft = reload_db_objects(draft) - rfc = draft # Some old rfcs had tombstones that shouldn't be used for comparisons - received = self.getJson(dict(name=rfc.canonical_name())) + received = self.getJson(dict(name=rfc.name)) self.assertTrue(received['previous'].endswith('00')) def do_rfc_with_broken_history_test(self, draft_name): draft = WgDraftFactory(rev='10', name=draft_name) - draft.docalias.create(name=f'rfc{self.next_rfc_number():04}') + rfc = WgRfcFactory(group=draft.group, rfc_number=self.next_rfc_number()) + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) draft.set_state(State.objects.get(type_id='draft',slug='rfc')) draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub')) draft = reload_db_objects(draft) - rfc = draft received = self.getJson(dict(name=draft.name)) self.assertEqual( received, dict( content_url=rfc.get_href(), - name=rfc.canonical_name(), + name=rfc.name, previous=f'{draft.name}-10', previous_url= f'{settings.IETF_ID_ARCHIVE_URL}{draft.name}-10.txt', ), @@ -1070,3 +1760,91 @@ def test_rfc_with_broken_history(self): # tricky draft names self.do_rfc_with_broken_history_test(draft_name='draft-gizmo-01') self.do_rfc_with_broken_history_test(draft_name='draft-oh-boy-what-a-draft-02-03') + + def test_no_such_document(self): + for name in ['rfc0000', 'draft-ftei-oof-rab-00']: + url = urlreverse(self.target_view, kwargs={'name': name}) + r = self.client.get(url) + self.assertEqual(r.status_code, 404) + + +class TokenTests(TestCase): + @override_settings(APP_API_TOKENS={"known.endpoint": ["token in a list"], "oops": "token as a str"}) + def test_is_valid_token(self): + # various invalid cases + self.assertFalse(is_valid_token("unknown.endpoint", "token in a list")) + self.assertFalse(is_valid_token("known.endpoint", "token")) + self.assertFalse(is_valid_token("known.endpoint", "token as a str")) + self.assertFalse(is_valid_token("oops", "token")) + self.assertFalse(is_valid_token("oops", "token in a list")) + # the only valid cases + self.assertTrue(is_valid_token("known.endpoint", "token in a list")) + self.assertTrue(is_valid_token("oops", "token as a str")) + + @mock.patch("ietf.api.ietf_utils.is_valid_token") + def test_requires_api_token(self, mock_is_valid_token): + called = False + + @requires_api_token + def fn_to_wrap(request, *args, **kwargs): + nonlocal called + called = True + return request, args, kwargs + + req_factory = RequestFactory() + arg = object() + kwarg = object() + + # No X-Api-Key header + mock_is_valid_token.return_value = False + val = fn_to_wrap( + req_factory.get("/some/url", headers={}), + arg, + kwarg=kwarg, + ) + self.assertTrue(isinstance(val, HttpResponseForbidden)) + self.assertFalse(mock_is_valid_token.called) + self.assertFalse(called) + + # Bad X-Api-Key header (not resetting the mock, it was not used yet) + val = fn_to_wrap( + req_factory.get("/some/url", headers={"X-Api-Key": "some-value"}), + arg, + kwarg=kwarg, + ) + self.assertTrue(isinstance(val, HttpResponseForbidden)) + self.assertTrue(mock_is_valid_token.called) + self.assertEqual( + mock_is_valid_token.call_args[0], + (fn_to_wrap.__module__ + "." + fn_to_wrap.__qualname__, "some-value"), + ) + self.assertFalse(called) + + # Valid header + mock_is_valid_token.reset_mock() + mock_is_valid_token.return_value = True + request = req_factory.get("/some/url", headers={"X-Api-Key": "some-value"}) + # Bad X-Api-Key header (not resetting the mock, it was not used yet) + val = fn_to_wrap( + request, + arg, + kwarg=kwarg, + ) + self.assertEqual(val, (request, (arg,), {"kwarg": kwarg})) + self.assertTrue(mock_is_valid_token.called) + self.assertEqual( + mock_is_valid_token.call_args[0], + (fn_to_wrap.__module__ + "." + fn_to_wrap.__qualname__, "some-value"), + ) + self.assertTrue(called) + + # Test the endpoint setting + @requires_api_token("endpoint") + def another_fn_to_wrap(request): + return "yep" + + val = another_fn_to_wrap(request) + self.assertEqual( + mock_is_valid_token.call_args[0], + ("endpoint", "some-value"), + ) diff --git a/ietf/api/tests_core.py b/ietf/api/tests_core.py new file mode 100644 index 00000000000..7e45deac8a8 --- /dev/null +++ b/ietf/api/tests_core.py @@ -0,0 +1,289 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +"""Core API tests""" +from unittest.mock import patch +# from unittest.mock import patch, call + +from django.urls import reverse as urlreverse, NoReverseMatch +from rest_framework.test import APIClient + +# from ietf.person.factories import PersonFactory, EmailFactory +# from ietf.person.models import Person +from ietf.utils.test_utils import TestCase + + +class CoreApiTestCase(TestCase): + client_class = APIClient + + +class PersonTests(CoreApiTestCase): + # Tests disabled until we activate the DRF URLs in api/urls.py + + def test_person_detail(self): + with self.assertRaises(NoReverseMatch, msg="Re-enable test when this view is enabled"): + urlreverse("ietf.api.core_api.person-detail", kwargs={"pk": 1}) + + # person = PersonFactory() + # other_person = PersonFactory() + # url = urlreverse("ietf.api.core_api.person-detail", kwargs={"pk": person.pk}) + # bad_pk = person.pk + 10000 + # if Person.objects.filter(pk=bad_pk).exists(): + # bad_pk += 10000 # if this doesn't get us clear, something is wrong... + # self.assertFalse( + # Person.objects.filter(pk=bad_pk).exists(), + # "Failed to find a non-existent person pk", + # ) + # bad_url = urlreverse("ietf.api.core_api.person-detail", kwargs={"pk": bad_pk}) + # r = self.client.get(bad_url, format="json") + # self.assertEqual(r.status_code, 403, "Must be logged in preferred to 404") + # r = self.client.get(url, format="json") + # self.assertEqual(r.status_code, 403, "Must be logged in") + # self.client.login( + # username=other_person.user.username, + # password=other_person.user.username + "+password", + # ) + # r = self.client.get(bad_url, format="json") + # self.assertEqual(r.status_code, 404) + # r = self.client.get(url, format="json") + # self.assertEqual(r.status_code, 403, "Can only retrieve self") + # self.client.login( + # username=person.user.username, password=person.user.username + "+password" + # ) + # r = self.client.get(url, format="json") + # self.assertEqual(r.status_code, 200) + # self.assertEqual( + # r.data, + # { + # "id": person.pk, + # "name": person.name, + # "emails": [ + # { + # "person": person.pk, + # "address": email.address, + # "primary": email.primary, + # "active": email.active, + # "origin": email.origin, + # } + # for email in person.email_set.all() + # ], + # }, + # ) + + @patch("ietf.person.api.send_new_email_confirmation_request") + def test_add_email(self, send_confirmation_mock): + with self.assertRaises(NoReverseMatch, msg="Re-enable this test when this view is enabled"): + urlreverse("ietf.api.core_api.person-email", kwargs={"pk": 1}) + + # email = EmailFactory(address="old@example.org") + # person = email.person + # other_person = PersonFactory() + # url = urlreverse("ietf.api.core_api.person-email", kwargs={"pk": person.pk}) + # post_data = {"address": "new@example.org"} + # + # r = self.client.post(url, data=post_data, format="json") + # self.assertEqual(r.status_code, 403, "Must be logged in") + # self.assertFalse(send_confirmation_mock.called) + # + # self.client.login( + # username=other_person.user.username, + # password=other_person.user.username + "+password", + # ) + # r = self.client.post(url, data=post_data, format="json") + # self.assertEqual(r.status_code, 403, "Can only retrieve self") + # self.assertFalse(send_confirmation_mock.called) + # + # self.client.login( + # username=person.user.username, password=person.user.username + "+password" + # ) + # r = self.client.post(url, data=post_data, format="json") + # self.assertEqual(r.status_code, 200) + # self.assertEqual(r.data, {"address": "new@example.org"}) + # self.assertTrue(send_confirmation_mock.called) + # self.assertEqual( + # send_confirmation_mock.call_args, call(person, "new@example.org") + # ) + + +class EmailTests(CoreApiTestCase): + def test_email_update(self): + with self.assertRaises(NoReverseMatch, msg="Re-enable this test when the view is enabled"): + urlreverse( + "ietf.api.core_api.email-detail", kwargs={"pk": "original@example.org"} + ) + + # email = EmailFactory( + # address="original@example.org", primary=False, active=True, origin="factory" + # ) + # person = email.person + # other_person = PersonFactory() + # url = urlreverse( + # "ietf.api.core_api.email-detail", kwargs={"pk": "original@example.org"} + # ) + # bad_url = urlreverse( + # "ietf.api.core_api.email-detail", + # kwargs={"pk": "not-original@example.org"}, + # ) + # + # r = self.client.put( + # bad_url, data={"primary": True, "active": False}, format="json" + # ) + # self.assertEqual(r.status_code, 403, "Must be logged in preferred to 404") + # r = self.client.put(url, data={"primary": True, "active": False}, format="json") + # self.assertEqual(r.status_code, 403, "Must be logged in") + # + # self.client.login( + # username=other_person.user.username, + # password=other_person.user.username + "+password", + # ) + # r = self.client.put( + # bad_url, data={"primary": True, "active": False}, format="json" + # ) + # self.assertEqual(r.status_code, 404, "No such address") + # r = self.client.put(url, data={"primary": True, "active": False}, format="json") + # self.assertEqual(r.status_code, 403, "Can only access own addresses") + # + # self.client.login( + # username=person.user.username, password=person.user.username + "+password" + # ) + # r = self.client.put(url, data={"primary": True, "active": False}, format="json") + # self.assertEqual(r.status_code, 200) + # self.assertEqual( + # r.data, + # { + # "person": person.pk, + # "address": "original@example.org", + # "primary": True, + # "active": False, + # "origin": "factory", + # }, + # ) + # email.refresh_from_db() + # self.assertEqual(email.person, person) + # self.assertEqual(email.address, "original@example.org") + # self.assertTrue(email.primary) + # self.assertFalse(email.active) + # self.assertEqual(email.origin, "factory") + # + # # address / origin should be immutable + # r = self.client.put( + # url, + # data={ + # "address": "modified@example.org", + # "primary": True, + # "active": False, + # "origin": "hacker", + # }, + # format="json", + # ) + # self.assertEqual(r.status_code, 200) + # self.assertEqual( + # r.data, + # { + # "person": person.pk, + # "address": "original@example.org", + # "primary": True, + # "active": False, + # "origin": "factory", + # }, + # ) + # email.refresh_from_db() + # self.assertEqual(email.person, person) + # self.assertEqual(email.address, "original@example.org") + # self.assertTrue(email.primary) + # self.assertFalse(email.active) + # self.assertEqual(email.origin, "factory") + + def test_email_partial_update(self): + with self.assertRaises(NoReverseMatch, msg="Re-enable this test when the view is enabled"): + urlreverse( + "ietf.api.core_api.email-detail", kwargs={"pk": "original@example.org"} + ) + + # email = EmailFactory( + # address="original@example.org", primary=False, active=True, origin="factory" + # ) + # person = email.person + # other_person = PersonFactory() + # url = urlreverse( + # "ietf.api.core_api.email-detail", kwargs={"pk": "original@example.org"} + # ) + # bad_url = urlreverse( + # "ietf.api.core_api.email-detail", + # kwargs={"pk": "not-original@example.org"}, + # ) + # + # r = self.client.patch( + # bad_url, data={"primary": True}, format="json" + # ) + # self.assertEqual(r.status_code, 403, "Must be logged in preferred to 404") + # r = self.client.patch(url, data={"primary": True}, format="json") + # self.assertEqual(r.status_code, 403, "Must be logged in") + # + # self.client.login( + # username=other_person.user.username, + # password=other_person.user.username + "+password", + # ) + # r = self.client.patch( + # bad_url, data={"primary": True}, format="json" + # ) + # self.assertEqual(r.status_code, 404, "No such address") + # r = self.client.patch(url, data={"primary": True}, format="json") + # self.assertEqual(r.status_code, 403, "Can only access own addresses") + # + # self.client.login( + # username=person.user.username, password=person.user.username + "+password" + # ) + # r = self.client.patch(url, data={"primary": True}, format="json") + # self.assertEqual(r.status_code, 200) + # self.assertEqual( + # r.data, + # { + # "person": person.pk, + # "address": "original@example.org", + # "primary": True, + # "active": True, + # "origin": "factory", + # }, + # ) + # email.refresh_from_db() + # self.assertEqual(email.person, person) + # self.assertEqual(email.address, "original@example.org") + # self.assertTrue(email.primary) + # self.assertTrue(email.active) + # self.assertEqual(email.origin, "factory") + # + # r = self.client.patch(url, data={"active": False}, format="json") + # self.assertEqual(r.status_code, 200) + # self.assertEqual( + # r.data, + # { + # "person": person.pk, + # "address": "original@example.org", + # "primary": True, + # "active": False, + # "origin": "factory", + # }, + # ) + # email.refresh_from_db() + # self.assertEqual(email.person, person) + # self.assertEqual(email.address, "original@example.org") + # self.assertTrue(email.primary) + # self.assertFalse(email.active) + # self.assertEqual(email.origin, "factory") + # + # r = self.client.patch(url, data={"address": "modified@example.org"}, format="json") + # self.assertEqual(r.status_code, 200) # extra fields allowed, but ignored + # email.refresh_from_db() + # self.assertEqual(email.person, person) + # self.assertEqual(email.address, "original@example.org") + # self.assertTrue(email.primary) + # self.assertFalse(email.active) + # self.assertEqual(email.origin, "factory") + # + # r = self.client.patch(url, data={"origin": "hacker"}, format="json") + # self.assertEqual(r.status_code, 200) # extra fields allowed, but ignored + # email.refresh_from_db() + # self.assertEqual(email.person, person) + # self.assertEqual(email.address, "original@example.org") + # self.assertTrue(email.primary) + # self.assertFalse(email.active) + # self.assertEqual(email.origin, "factory") diff --git a/ietf/api/tests_ietf_utils.py b/ietf/api/tests_ietf_utils.py new file mode 100644 index 00000000000..b8d7fea7b4b --- /dev/null +++ b/ietf/api/tests_ietf_utils.py @@ -0,0 +1,86 @@ +# Copyright The IETF Trust 2025, All Rights Reserved + +from django.test import RequestFactory +from django.test.utils import override_settings + +from ietf.api.ietf_utils import is_valid_token, requires_api_token +from ietf.utils.test_utils import TestCase + + +class IetfUtilsTests(TestCase): + @override_settings( + APP_API_TOKENS={ + "ietf.api.foobar": ["valid-token"], + "ietf.api.misconfigured": "valid-token", # misconfigured + } + ) + def test_is_valid_token(self): + self.assertFalse(is_valid_token("ietf.fake.endpoint", "valid-token")) + self.assertFalse(is_valid_token("ietf.api.foobar", "invalid-token")) + self.assertFalse(is_valid_token("ietf.api.foobar", None)) + self.assertTrue(is_valid_token("ietf.api.foobar", "valid-token")) + + # misconfiguration + self.assertFalse(is_valid_token("ietf.api.misconfigured", "v")) + self.assertFalse(is_valid_token("ietf.api.misconfigured", None)) + self.assertTrue(is_valid_token("ietf.api.misconfigured", "valid-token")) + + @override_settings( + APP_API_TOKENS={ + "ietf.api.foo": ["valid-token"], + "ietf.api.bar": ["another-token"], + "ietf.api.misconfigured": "valid-token", # misconfigured + } + ) + def test_requires_api_token(self): + @requires_api_token("ietf.api.foo") + def protected_function(request): + return f"Access granted: {request.method}" + + # request with a valid token + request = RequestFactory().get( + "/some/url", headers={"X_API_KEY": "valid-token"} + ) + result = protected_function(request) + self.assertEqual(result, "Access granted: GET") + + # request with an invalid token + request = RequestFactory().get( + "/some/url", headers={"X_API_KEY": "invalid-token"} + ) + result = protected_function(request) + self.assertEqual(result.status_code, 403) + + # request without a token + request = RequestFactory().get("/some/url", headers={"X_API_KEY": ""}) + result = protected_function(request) + self.assertEqual(result.status_code, 403) + + # request without a X_API_KEY token + request = RequestFactory().get("/some/url") + result = protected_function(request) + self.assertEqual(result.status_code, 403) + + # request with a valid token for another API endpoint + request = RequestFactory().get( + "/some/url", headers={"X_API_KEY": "another-token"} + ) + result = protected_function(request) + self.assertEqual(result.status_code, 403) + + # requests for a misconfigured endpoint + @requires_api_token("ietf.api.misconfigured") + def another_protected_function(request): + return f"Access granted: {request.method}" + + # request with valid token + request = RequestFactory().get( + "/some/url", headers={"X_API_KEY": "valid-token"} + ) + result = another_protected_function(request) + self.assertEqual(result, "Access granted: GET") + + # request with invalid token with the correct initial character + request = RequestFactory().get("/some/url", headers={"X_API_KEY": "v"}) + result = another_protected_function(request) + self.assertEqual(result.status_code, 403) diff --git a/ietf/api/urls.py b/ietf/api/urls.py index 5185b9f8885..04575b34cb9 100644 --- a/ietf/api/urls.py +++ b/ietf/api/urls.py @@ -1,16 +1,26 @@ -# Copyright The IETF Trust 2017, All Rights Reserved +# Copyright The IETF Trust 2017-2024, All Rights Reserved from django.conf import settings -from django.conf.urls import include +from django.urls import include from django.views.generic import TemplateView from ietf import api -from ietf.api import views as api_views from ietf.doc import views_ballot from ietf.meeting import views as meeting_views from ietf.submit import views as submit_views from ietf.utils.urls import url +from . import views as api_views + +# DRF API routing - disabled until we plan to use it +# from drf_spectacular.views import SpectacularAPIView +# from django.urls import path +# from ietf.person import api as person_api +# from .routers import PrefixedSimpleRouter +# core_router = PrefixedSimpleRouter(name_prefix="ietf.api.core_api") # core api router +# core_router.register("email", person_api.EmailViewSet) +# core_router.register("person", person_api.PersonViewSet) + api.autodiscover() urlpatterns = [ @@ -20,14 +30,32 @@ url(r'^v1/?$', api_views.top_level), # For mailarchive use, requires secretariat role url(r'^v2/person/person', api_views.ApiV2PersonExportView.as_view()), + # --- DRF API --- + # path("core/", include(core_router.urls)), + # path("schema/", SpectacularAPIView.as_view()), # # --- Custom API endpoints, sorted alphabetically --- - # GPRD: export of personal information for the logged-in person + # Email alias information for drafts + url(r'^doc/draft-aliases/$', api_views.draft_aliases), + # email ingestor + url(r'email/$', api_views.ingest_email), + # email ingestor + url(r'email/test/$', api_views.ingest_email_test), + # GDPR: export of personal information for the logged-in person url(r'^export/personal-information/$', api_views.PersonalInformationExportView.as_view()), + # Email alias information for groups + url(r'^group/group-aliases/$', api_views.group_aliases), + # Email addresses belonging to role holders + url(r'^group/role-holder-addresses/$', api_views.role_holder_addresses), # Let IESG members set positions programmatically url(r'^iesg/position', views_ballot.api_set_position), + # Find the blob to store for a given materials document path + url(r'^meeting/(?:(?P(?:interim-)?[a-z0-9-]+)/)?materials/%(document)s(?P\.[A-Za-z0-9]+)?/resolve-cached/$' % settings.URL_REGEXPS, meeting_views.api_resolve_materials_name_cached), + url(r'^meeting/blob/(?P[a-z0-9-]+)/(?P[a-z][a-z0-9.-]+)$', meeting_views.api_retrieve_materials_blob), # Let Meetecho set session video URLs url(r'^meeting/session/video/url$', meeting_views.api_set_session_video_url), + # Let Meetecho tell us the name of its recordings + url(r'^meeting/session/recording-name$', meeting_views.api_set_meetecho_recording_name), # Meeting agenda + floorplan data url(r'^meeting/(?P[A-Za-z0-9._+-]+)/agenda-data$', meeting_views.api_get_agenda_data), # Meeting session materials @@ -41,12 +69,16 @@ # Let MeetEcho upload session polls url(r'^notify/session/polls/?$', meeting_views.api_upload_polls), # Let the registration system notify us about registrations - url(r'^notify/meeting/registration/?', api_views.api_new_meeting_registration), + url(r'^notify/meeting/registration/v2/?', api_views.api_new_meeting_registration_v2), # OpenID authentication provider url(r'^openid/$', TemplateView.as_view(template_name='api/openid-issuer.html'), name='ietf.api.urls.oidc_issuer'), url(r'^openid/', include('oidc_provider.urls', namespace='oidc_provider')), + # Email alias listing + url(r'^person/email/$', api_views.active_email_list), + # Related Email listing + url(r'^person/email/(?P[^/\x00]+)/related/$', api_views.related_email_list), # Draft submission API - url(r'^submit/?$', submit_views.api_submit), + url(r'^submit/?$', submit_views.api_submit_tombstone), # Draft upload API url(r'^submission/?$', submit_views.api_submission), # Draft submission state API @@ -54,7 +86,9 @@ # Datatracker version url(r'^version/?$', api_views.version), # Application authentication API key - url(r'^appauth/[authortools|bibxml]', api_views.app_auth), + url(r'^appauth/(?Pauthortools|bibxml)$', api_views.app_auth), + # NFS metrics endpoint + url(r'^metrics/nfs/?$', api_views.nfs_metrics), # latest versions url(r'^rfcdiff-latest-json/%(name)s(?:-%(rev)s)?(\.txt|\.html)?/?$' % settings.URL_REGEXPS, api_views.rfcdiff_latest_json), url(r'^rfcdiff-latest-json/(?P[Rr][Ff][Cc] [0-9]+?)(\.txt|\.html)?/?$', api_views.rfcdiff_latest_json), diff --git a/ietf/api/views.py b/ietf/api/views.py index b56544c436a..22523b2f172 100644 --- a/ietf/api/views.py +++ b/ietf/api/views.py @@ -1,46 +1,55 @@ # Copyright The IETF Trust 2017-2020, All Rights Reserved # -*- coding: utf-8 -*- - +import base64 +import binascii +import datetime import json +from pathlib import Path +from tempfile import NamedTemporaryFile +import jsonschema import pytz import re -from jwcrypto.jwk import JWK - +from contextlib import suppress from django.conf import settings from django.contrib.auth import authenticate from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User -from django.core.exceptions import ValidationError -from django.core.validators import validate_email -from django.http import HttpResponse, Http404 +from django.http import HttpResponse, Http404, JsonResponse, HttpResponseBadRequest from django.shortcuts import render, get_object_or_404 from django.urls import reverse from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from django.views.decorators.gzip import gzip_page from django.views.generic.detail import DetailView - +from email.message import EmailMessage +from importlib.metadata import version as metadata_version +from jwcrypto.jwk import JWK from tastypie.exceptions import BadRequest -from tastypie.utils.mime import determine_format, build_content_type -from tastypie.utils import is_valid_jsonp_callback_value from tastypie.serializers import Serializer - -import debug # pyflakes:ignore +from tastypie.utils import is_valid_jsonp_callback_value +from tastypie.utils.mime import determine_format, build_content_type +from textwrap import dedent +from traceback import format_exception, extract_tb +from typing import Iterable, Optional, Literal import ietf -from ietf.person.models import Person, Email from ietf.api import _api_list +from ietf.api.ietf_utils import is_valid_token, requires_api_token from ietf.api.serializer import JsonExportMixin -from ietf.api.ietf_utils import is_valid_token -from ietf.doc.utils import fuzzy_find_documents -from ietf.ietfauth.views import send_account_creation_email +from ietf.doc.utils import DraftAliasGenerator, fuzzy_find_documents +from ietf.group.utils import GroupAliasGenerator, role_holder_emails from ietf.ietfauth.utils import role_required +from ietf.ipr.utils import ingest_response_email as ipr_ingest_response_email from ietf.meeting.models import Meeting -from ietf.stats.models import MeetingRegistration +from ietf.meeting.utils import import_registration_json_validator, process_single_registration +from ietf.nomcom.utils import ingest_feedback_email as nomcom_ingest_feedback_email +from ietf.person.models import Person, Email +from ietf.sync.iana import ingest_review_email as iana_ingest_review_email from ietf.utils import log from ietf.utils.decorators import require_api_key +from ietf.utils.mail import send_smtp from ietf.utils.models import DumpInfo @@ -55,7 +64,10 @@ def top_level(request): } serializer = Serializer() - desired_format = determine_format(request, serializer) + try: + desired_format = determine_format(request, serializer) + except BadRequest as err: + return HttpResponseBadRequest(str(err)) options = {} @@ -63,10 +75,12 @@ def top_level(request): callback = request.GET.get('callback', 'callback') if not is_valid_jsonp_callback_value(callback): - raise BadRequest('JSONP callback name is invalid.') + return HttpResponseBadRequest("JSONP callback name is invalid") options['callback'] = callback + # This might raise UnsupportedFormat, but that indicates a real server misconfiguration + # so let it bubble up unhandled and trigger a 500 / email to admins. serialized = serializer.serialize(available_resources, desired_format, options) return HttpResponse(content=serialized, content_type=build_content_type(desired_format)) @@ -89,7 +103,7 @@ def get(self, request): 'sendqueue', 'nominee', 'topicfeedbacklastseen', 'alias', 'email', 'apikeys', 'personevent', 'reviewersettings', 'reviewsecretarysettings', 'unavailableperiod', 'reviewwish', 'nextreviewerinteam', 'reviewrequest', 'meetingregistration', 'submissionevent', 'preapproval', - 'user', 'user__communitylist', 'personextresource_set', ] + 'user', 'communitylist', 'personextresource_set', ] return self.json_view(request, filter={'id':person.id}, expand=expand) @@ -100,7 +114,11 @@ class ApiV2PersonExportView(DetailView, JsonExportMixin): model = Person def err(self, code, text): - return HttpResponse(text, status=code, content_type='text/plain') + return HttpResponse( + text, + status=code, + content_type=f"text/plain; charset={settings.DEFAULT_CHARSET}", + ) def post(self, request): querydict = request.POST.copy() @@ -132,79 +150,61 @@ def post(self, request): # else: # return HttpResponse(status=405) -@require_api_key -@role_required('Robot') + +@requires_api_token @csrf_exempt -def api_new_meeting_registration(request): +def api_new_meeting_registration_v2(request): '''REST API to notify the datatracker about a new meeting registration''' - def err(code, text): - return HttpResponse(text, status=code, content_type='text/plain') - required_fields = [ 'meeting', 'first_name', 'last_name', 'affiliation', 'country_code', - 'email', 'reg_type', 'ticket_type', 'checkedin'] - fields = required_fields + [] - if request.method == 'POST': - # parameters: - # apikey: - # meeting - # name - # email - # reg_type (In Person, Remote, Hackathon Only) - # ticket_type (full_week, one_day, student) - # - data = {'attended': False, } - missing_fields = [] - for item in fields: - value = request.POST.get(item, None) - if value is None and item in required_fields: - missing_fields.append(item) - data[item] = value - if missing_fields: - return err(400, "Missing parameters: %s" % ', '.join(missing_fields)) - number = data['meeting'] - try: - meeting = Meeting.objects.get(number=number) - except Meeting.DoesNotExist: - return err(400, "Invalid meeting value: '%s'" % (number, )) - reg_type = data['reg_type'] - email = data['email'] - try: - validate_email(email) - except ValidationError: - return err(400, "Invalid email value: '%s'" % (email, )) - if request.POST.get('cancelled', 'false') == 'true': - MeetingRegistration.objects.filter( - meeting_id=meeting.pk, - email=email, - reg_type=reg_type).delete() - return HttpResponse('OK', status=200, content_type='text/plain') - else: - object, created = MeetingRegistration.objects.get_or_create( - meeting_id=meeting.pk, - email=email, - reg_type=reg_type) - try: - # Update attributes - for key in set(data.keys())-set(['attended', 'apikey', 'meeting', 'email']): - if key == 'checkedin': - new = bool(data.get(key).lower() == 'true') - else: - new = data.get(key) - setattr(object, key, new) - person = Person.objects.filter(email__address=email) - if person.exists(): - object.person = person.first() - object.save() - except ValueError as e: - return err(400, "Unexpected POST data: %s" % e) - response = "Accepted, New registration" if created else "Accepted, Updated registration" - if User.objects.filter(username__iexact=email).exists() or Email.objects.filter(address=email).exists(): - pass - else: - send_account_creation_email(request, email) - response += ", Email sent" - return HttpResponse(response, status=202, content_type='text/plain') - else: - return HttpResponse(status=405) + def _http_err(code, text): + return HttpResponse( + text, + status=code, + content_type=f"text/plain; charset={settings.DEFAULT_CHARSET}", + ) + + def _api_response(result): + return JsonResponse(data={"result": result}) + + if request.method != "POST": + return _http_err(405, "Method not allowed") + + if request.content_type != "application/json": + return _http_err(415, "Content-Type must be application/json") + + # Validate + try: + payload = json.loads(request.body) + import_registration_json_validator.validate(payload) + except json.decoder.JSONDecodeError as err: + return _http_err(400, f"JSON parse error at line {err.lineno} col {err.colno}: {err.msg}") + except jsonschema.exceptions.ValidationError as err: + return _http_err(400, f"JSON schema error at {err.json_path}: {err.message}") + except Exception: + return _http_err(400, "Invalid request format") + + # Get the meeting ID from the first registration, the API only deals with one meeting at a time + first_email = next(iter(payload['objects'])) + meeting_number = payload['objects'][first_email]['meeting'] + try: + meeting = Meeting.objects.get(number=meeting_number) + except Meeting.DoesNotExist: + return _http_err(400, f"Invalid meeting value: {meeting_number}") + + # confirm email exists + try: + Email.objects.get(address=first_email) + except Email.DoesNotExist: + return _http_err(400, f"Unknown email: {first_email}") + + reg_data = payload['objects'][first_email] + + process_single_registration(reg_data, meeting) + + return HttpResponse( + 'Success', + status=202, + content_type=f"text/plain; charset={settings.DEFAULT_CHARSET}", + ) def version(request): @@ -215,9 +215,16 @@ def version(request): if dumpinfo.tz != "UTC": dumpdate = pytz.timezone(dumpinfo.tz).localize(dumpinfo.date.replace(tzinfo=None)) dumptime = dumpdate.strftime('%Y-%m-%d %H:%M:%S %z') if dumpinfo else None + + # important libraries + __version_extra__ = {} + for lib in settings.ADVERTISE_VERSIONS: + __version_extra__[lib] = metadata_version(lib) + return HttpResponse( json.dumps({ 'version': ietf.__version__+ietf.__patch__, + 'other': __version_extra__, 'dumptime': dumptime, }), content_type='application/json', @@ -226,12 +233,27 @@ def version(request): @require_api_key @csrf_exempt -def app_auth(request): +def app_auth(request, app: Literal["authortools", "bibxml"]): return HttpResponse( json.dumps({'success': True}), content_type='application/json') - +@requires_api_token +@csrf_exempt +def nfs_metrics(request): + with NamedTemporaryFile(dir=settings.NFS_METRICS_TMP_DIR,delete=False) as fp: + fp.close() + mark = datetime.datetime.now() + with open(fp.name, mode="w") as f: + f.write("whyioughta"*1024) + write_latency = (datetime.datetime.now() - mark).total_seconds() + mark = datetime.datetime.now() + with open(fp.name, "r") as f: + _=f.read() + read_latency = (datetime.datetime.now() - mark).total_seconds() + Path(f.name).unlink() + response=f'nfs_latency_seconds{{operation="write"}} {write_latency}\nnfs_latency_seconds{{operation="read"}} {read_latency}\n' + return HttpResponse(response) def find_doc_for_rfcdiff(name, rev): """rfcdiff lookup heuristics @@ -317,12 +339,9 @@ def get_previous_url(name, rev=None): previous_url = '' if condition in ('historic version', 'current version'): doc = history if history else document - if found_rev: - doc.is_rfc = lambda: False previous_url = doc.get_href() elif condition == 'version dochistory not found': document.rev = found_rev - document.is_rfc = lambda: False previous_url = document.get_href() return previous_url @@ -330,32 +349,38 @@ def get_previous_url(name, rev=None): def rfcdiff_latest_json(request, name, rev=None): response = dict() condition, document, history, found_rev = find_doc_for_rfcdiff(name, rev) - + if document and document.type_id == "rfc": + draft = document.came_from_draft() if condition == 'no such document': raise Http404 elif condition in ('historic version', 'current version'): doc = history if history else document - if not found_rev and doc.is_rfc(): - response['content_url'] = doc.get_href() - response['name']=doc.canonical_name() - if doc.name != doc.canonical_name(): + if doc.type_id == "rfc": + response['content_url'] = doc.get_href() + response['name']=doc.name + if draft: + prev_rev = draft.rev + if doc.rfc_number in HAS_TOMBSTONE and prev_rev != '00': + prev_rev = f'{(int(draft.rev)-1):02d}' + response['previous'] = f'{draft.name}-{prev_rev}' + response['previous_url'] = get_previous_url(draft.name, prev_rev) + elif doc.type_id == "draft" and not found_rev and doc.relateddocument_set.filter(relationship_id="became_rfc").exists(): + rfc = doc.related_that_doc("became_rfc")[0] + response['content_url'] = rfc.get_href() + response['name']=rfc.name prev_rev = doc.rev - # not sure what to do if non-numeric values come back, so at least log it - log.assertion('doc.rfc_number().isdigit()') # .rfc_number() is expensive... - log.assertion('doc.rev.isdigit()') - if int(doc.rfc_number()) in HAS_TOMBSTONE and prev_rev != '00': + if rfc.rfc_number in HAS_TOMBSTONE and prev_rev != '00': prev_rev = f'{(int(doc.rev)-1):02d}' response['previous'] = f'{doc.name}-{prev_rev}' response['previous_url'] = get_previous_url(doc.name, prev_rev) else: - doc.is_rfc = lambda: False response['content_url'] = doc.get_href() response['rev'] = doc.rev response['name'] = doc.name if doc.rev == '00': replaces_docs = (history.doc if condition=='historic version' else doc).related_that_doc('replaces') if replaces_docs: - replaces = replaces_docs[0].document + replaces = replaces_docs[0] response['previous'] = f'{replaces.name}-{replaces.rev}' response['previous_url'] = get_previous_url(replaces.name, replaces.rev) else: @@ -374,7 +399,6 @@ def rfcdiff_latest_json(request, name, rev=None): response['name'] = document.name response['rev'] = found_rev document.rev = found_rev - document.is_rfc = lambda: False response['content_url'] = document.get_href() # not sure what to do if non-numeric values come back, so at least log it log.assertion('found_rev.isdigit()') @@ -402,6 +426,7 @@ def directauth(request): data = None if raw_data is None or data is None: + log.log("Request body is either missing or invalid") return HttpResponse(json.dumps(dict(result="failure",reason="invalid post")), content_type='application/json') authtoken = data.get('authtoken', None) @@ -409,9 +434,11 @@ def directauth(request): password = data.get('password', None) if any([item is None for item in (authtoken, username, password)]): + log.log("One or more mandatory fields are missing: authtoken, username, password") return HttpResponse(json.dumps(dict(result="failure",reason="invalid post")), content_type='application/json') if not is_valid_token("ietf.api.views.directauth", authtoken): + log.log("Auth token provided is invalid") return HttpResponse(json.dumps(dict(result="failure",reason="invalid authtoken")), content_type='application/json') user_query = User.objects.filter(username__iexact=username) @@ -422,10 +449,288 @@ def directauth(request): # Note well that we are using user.username, not what was passed to the API. - if user_query.count() == 1 and authenticate(username = user_query.first().username, password = password): + user_count = user_query.count() + if user_count == 1 and authenticate(username = user_query.first().username, password = password): + user = user_query.get() + if user_query.filter(person__isnull=True).count() == 1: # Can't inspect user.person direclty here + log.log(f"Direct auth success (personless user): {user.pk}:{user.username}") + else: + log.log(f"Direct auth success: {user.pk}:{user.person.plain_name()}") return HttpResponse(json.dumps(dict(result="success")), content_type='application/json') + log.log(f"Direct auth failure: {username} ({user_count} user(s) found)") return HttpResponse(json.dumps(dict(result="failure", reason="authentication failed")), content_type='application/json') else: + log.log(f"Request must be POST: {request.method} received") return HttpResponse(status=405) + + +@requires_api_token +@csrf_exempt +def draft_aliases(request): + if request.method == "GET": + return JsonResponse( + { + "aliases": [ + { + "alias": alias, + "domains": ["ietf"], + "addresses": address_list, + } + for alias, address_list in DraftAliasGenerator() + ] + } + ) + return HttpResponse(status=405) + + +@requires_api_token +@csrf_exempt +def group_aliases(request): + if request.method == "GET": + return JsonResponse( + { + "aliases": [ + { + "alias": alias, + "domains": domains, + "addresses": address_list, + } + for alias, domains, address_list in GroupAliasGenerator() + ] + } + ) + return HttpResponse(status=405) + + +@requires_api_token +@csrf_exempt +def active_email_list(request): + if request.method == "GET": + return JsonResponse( + { + "addresses": list(Email.objects.filter(active=True).values_list("address", flat=True)), + } + ) + return HttpResponse(status=405) + + +@requires_api_token +@csrf_exempt +def related_email_list(request, email): + """Given an email address, returns all other email addresses known + to Datatracker, via Person object + """ + def _http_err(code, text): + return HttpResponse( + text, + status=code, + content_type=f"text/plain; charset={settings.DEFAULT_CHARSET}", + ) + + if request.method == "GET": + try: + email_obj = Email.objects.get(address=email) + except Email.DoesNotExist: + return _http_err(404, "Email not found") + person = email_obj.person + if not person: + return JsonResponse({"addresses": []}) + return JsonResponse( + { + "addresses": list(person.email_set.values_list("address", flat=True)), + } + ) + return HttpResponse(status=405) + + +@requires_api_token +def role_holder_addresses(request): + if request.method == "GET": + return JsonResponse( + { + "addresses": list( + role_holder_emails() + .order_by("address") + .values_list("address", flat=True) + ) + } + ) + return HttpResponse(status=405) + + +_response_email_json_validator = jsonschema.Draft202012Validator( + schema={ + "type": "object", + "properties": { + "dest": { + "type": "string", + }, + "message": { + "type": "string", # base64-encoded mail message + }, + }, + "required": ["dest", "message"], + } +) + + +class EmailIngestionError(Exception): + """Exception indicating ingestion failed""" + def __init__( + self, + msg="Message rejected", + *, + email_body: Optional[str] = None, + email_recipients: Optional[Iterable[str]] = None, + email_attach_traceback=False, + email_original_message: Optional[bytes]=None, + ): + self.msg = msg + self.email_body = email_body + self.email_subject = msg + self.email_recipients = email_recipients + self.email_attach_traceback = email_attach_traceback + self.email_original_message = email_original_message + self.email_from = settings.SERVER_EMAIL + + @staticmethod + def _summarize_error(error): + frame = extract_tb(error.__traceback__)[-1] + return dedent(f"""\ + Error details: + Exception type: {type(error).__module__}.{type(error).__name__} + File: {frame.filename} + Line: {frame.lineno}""") + + def as_emailmessage(self) -> Optional[EmailMessage]: + """Generate an EmailMessage to report an error""" + if self.email_body is None: + return None + error = self if self.__cause__ is None else self.__cause__ + format_values = dict( + error=error, + error_summary=self._summarize_error(error), + ) + msg = EmailMessage() + if self.email_recipients is None: + msg["To"] = tuple(adm[1] for adm in settings.ADMINS) + else: + msg["To"] = self.email_recipients + msg["From"] = self.email_from + msg["Subject"] = self.msg + msg.set_content( + self.email_body.format(**format_values) + ) + if self.email_attach_traceback: + msg.add_attachment( + "".join(format_exception(None, error, error.__traceback__)), + filename="traceback.txt", + ) + if self.email_original_message is not None: + # Attach incoming message if it was provided. Send as a generic media + # type because we don't know for sure that it was actually a valid + # message. + msg.add_attachment( + self.email_original_message, + 'application', 'octet-stream', # media type + filename='original-message', + ) + return msg + + +def ingest_email_handler(request, test_mode=False): + """Ingest incoming email - handler + + Returns a 4xx or 5xx status code if the HTTP request was invalid or something went + wrong while processing it. If the request was valid, returns a 200. This may or may + not indicate that the message was accepted. + + If test_mode is true, actual processing of a valid message will be skipped. In this + mode, a valid request with a valid destination will be treated as accepted. The + "bad_dest" error may still be returned. + """ + + def _http_err(code, text): + return HttpResponse( + text, + status=code, + content_type=f"text/plain; charset={settings.DEFAULT_CHARSET}", + ) + + def _api_response(result): + return JsonResponse(data={"result": result}) + + if request.method != "POST": + return _http_err(405, "Method not allowed") + + if request.content_type != "application/json": + return _http_err(415, "Content-Type must be application/json") + + # Validate + try: + payload = json.loads(request.body) + _response_email_json_validator.validate(payload) + except json.decoder.JSONDecodeError as err: + return _http_err(400, f"JSON parse error at line {err.lineno} col {err.colno}: {err.msg}") + except jsonschema.exceptions.ValidationError as err: + return _http_err(400, f"JSON schema error at {err.json_path}: {err.message}") + except Exception: + return _http_err(400, "Invalid request format") + + try: + message = base64.b64decode(payload["message"], validate=True) + except binascii.Error: + return _http_err(400, "Invalid message: bad base64 encoding") + + dest = payload["dest"] + valid_dest = False + try: + if dest == "iana-review": + valid_dest = True + if not test_mode: + iana_ingest_review_email(message) + elif dest == "ipr-response": + valid_dest = True + if not test_mode: + ipr_ingest_response_email(message) + elif dest.startswith("nomcom-feedback-"): + maybe_year = dest[len("nomcom-feedback-"):] + if maybe_year.isdecimal(): + valid_dest = True + if not test_mode: + nomcom_ingest_feedback_email(message, int(maybe_year)) + except EmailIngestionError as err: + error_email = err.as_emailmessage() + if error_email is not None: + with suppress(Exception): # send_smtp logs its own exceptions, ignore them here + send_smtp(error_email) + return _api_response("bad_msg") + + if not valid_dest: + return _api_response("bad_dest") + + return _api_response("ok") + + +@requires_api_token +@csrf_exempt +def ingest_email(request): + """Ingest incoming email + + Hands off to ingest_email_handler() with test_mode=False. This allows @requires_api_token to + give the test endpoint a distinct token from the real one. + """ + return ingest_email_handler(request, test_mode=False) + + +@requires_api_token +@csrf_exempt +def ingest_email_test(request): + """Ingest incoming email test endpoint + + Hands off to ingest_email_handler() with test_mode=True. This allows @requires_api_token to + give the test endpoint a distinct token from the real one. + """ + return ingest_email_handler(request, test_mode=True) diff --git a/ietf/bin/.gitignore b/ietf/bin/.gitignore deleted file mode 100644 index c7013ced9df..00000000000 --- a/ietf/bin/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/*.pyc -/settings_local.py diff --git a/ietf/bin/2016-05-25-collect-photos b/ietf/bin/2016-05-25-collect-photos deleted file mode 100755 index dedda767a8e..00000000000 --- a/ietf/bin/2016-05-25-collect-photos +++ /dev/null @@ -1,296 +0,0 @@ -#!/usr/bin/env python - -import os, re, sys, shutil, pathlib -from collections import namedtuple -from PIL import Image - -# boilerplate -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -import django -django.setup() - -from django.conf import settings -from django.utils.text import slugify - -import debug - -from ietf.group.models import Role, Person -from ietf.person.name import name_parts - -old_images_dir = '' -new_images_dir = settings.PHOTOS_DIR - -if not os.path.exists(new_images_dir): - print("New images directory does not exist: %s" % new_images_dir) - sys.exit(1) - -old_image_files = [] -for dir in settings.OLD_PHOTO_DIRS: - if not os.path.exists(dir): - print("Old images directory does not exist: %s" % dir) - sys.exit(1) - old_image_files += [ f for f in pathlib.Path(dir).iterdir() if f.is_file() and f.suffix.lower() in ['.jpg', '.jpeg', '.png'] ] - -photo = namedtuple('photo', ['path', 'name', 'ext', 'width', 'height', 'time', 'file']) - -old_images = [] -for f in old_image_files: - path = str(f) - img = Image.open(path) - old_images.append(photo(path, f.stem.decode('utf8'), f.suffix, img.size[0], img.size[1], f.stat().st_mtime, f)) - -# Fix up some names: - -def fix_missing_surnames(images): - replacement = { - "alissa": "alissa-cooper", - "alissa1": "alissa-cooper", - "andrei": "andrei-robachevsky", - "bernard": "bernard-aboba", - "danny": "danny-mcpherson", - "danny1": "danny-mcpherson", - "dthaler": "dave-thaler", - "eliot-mug": "eliot-lear", - "erik.nordmark-300": "erik-nordmark", - "hannes": "hannes-tschofenig", - "hildebrand": "joe-hildebrand", - "housley": "russ-housley", - "jariarkko": "jari-arkko", - "joel": "joel-jaeggli", - "joel1": "joel-jaeggli", - "joel2": "joel-jaeggli", - "jon": "jon-peterson", - "kessens": "david-kessens", - "klensin": "john-klensin", - "lars": "lars-eggert", - "lars1": "lars-eggert", - "marc_blanchet": "marc-blanchet", - "marcelo": "marcelo-bagnulo", - "olaf": "olaf-kolkman", - "olaf1": "olaf-kolkman", - "ross": "ross-callon", - "spencer": "spencer-dawkins", - "spencer1": "spencer-dawkins", - "vijay": "vijay-gurbani", - "xing": "xing-li", - } - - for i in range(len(images)): - img = images[i] - name = re.sub('-[0-9]+x[0-9]+', '', img.name) - if '/iab/' in img.path and name in replacement: - name = replacement[name] - images[i] = photo(img.path, name, img.ext, img.width, img.height, img.time, img.file) - - -fix_missing_surnames(old_images) - -interesting_persons = set(Person.objects.all()) - -name_alias = { - u"andy": [u"andrew", ], - u"ben": [u"benjamin", ], - u"bill": [u"william", ], - u"bob": [u"robert", ], - u"chris": [u"christopher", u"christian"], - u"dan": [u"daniel", ], - u"dave": [u"david", ], - u"dick": [u"richard", ], - u"fred": [u"alfred", ], - u"geoff": [u"geoffrey", ], - u"jake": [u"jacob", ], - u"jerry": [u"gerald", ], - u"jim": [u"james", ], - u"joe": [u"joseph", ], - u"jon": [u"jonathan", ], - u"mike": [u"michael", ], - u"ned": [u"edward", ], - u"pete": [u"peter", ], - u"ron": [u"ronald", ], - u"russ": [u"russel", ], - u"steve": [u"stephen", ], - u"ted": [u"edward", ], - u"terry": [u"terence", ], - u"tom": [u"thomas", ], - u"wes": [u"wesley", ], - u"will": [u"william", ], - - u"beth": [u"elizabeth", ], - u"liz": [u"elizabeth", ], - u"lynn": [u"carolyn", ], - u"pat": [u"patricia", u"patrick", ], - u"sue": [u"susan", ], -} -# Add lookups from long to short, from the initial set -for key,value in name_alias.items(): - for item in value: - if item in name_alias: - name_alias[item] += [ key ]; - else: - name_alias[item] = [ key ]; - -exceptions = { -'Aboba' : 'aboba-bernard', -'Bernardos' : 'cano-carlos', -'Bormann' : 'bormann-carsten', -'Hinden' : 'hinden-bob', -'Hutton' : 'hutton-andy', -'Narten' : 'narten-thomas', # but there's no picture of him -'O\'Donoghue' : 'odonoghue-karen', -'Przygienda' : 'przygienda-antoni', -'Salowey' : 'salowey-joe', -'Gunter Van de Velde' : 'vandevelde-gunter', -'Eric Vyncke' : 'vynke-eric', -'Zuniga' : 'zuniga-carlos-juan', -'Zhen Cao' : 'zhen-cao', -'Jamal Hadi Salim': 'hadi-salim-jamal', -} - -# Manually copied Bo Burman and Thubert Pascal from wg/photos/ -# Manually copied Victor Pascual (main image, not thumb) from wg/ -# Manually copied Eric Vync?ke (main image, not thumb) from wg/photos/ -# Manually copied Danial King (main image, not thumb) from wg/photos/ -# Manually copied the thumb (not labelled as such) for Tianran Zhou as both the main and thumb image from wg/photos/ - -processed_files = [] - -for person in sorted(list(interesting_persons),key=lambda x:x.last_name()+x.ascii): - substr_pattern = None - for exception in exceptions: - if exception in person.ascii: - substr_pattern = exceptions[exception] - break - if not person.ascii.strip(): - print(" Setting person.ascii for %s" % person.name) - person.ascii = person.name.encode('ascii', errors='replace').decode('ascii') - - _, first, _, last, _ = person.ascii_parts() - first = first.lower() - last = last. lower() - if not substr_pattern: - substr_pattern = slugify("%s %s" % (last, first)) - - if first in ['', '<>'] or last in ['', '<>']: - continue - - #debug.show('1, substr_pattern') - - candidates = [x for x in old_images if x.name.lower().startswith(substr_pattern)] - # Also check the reverse the name order (necessary for Deng Hui, for instance) - substr_pattern = slugify("%s %s" % (first, last)) - #debug.show('2, substr_pattern') - prev_len = len(candidates) - candidates += [x for x in old_images if x.name.lower().startswith(substr_pattern)] - if prev_len < len(candidates) : - print(" Found match with '%s %s' for '%s %s'" % (last, first, first, last, )) - # If no joy, try a short name - if first in name_alias: - prev_len = len(candidates) - for alias in name_alias[first]: - substr_pattern = slugify("%s %s" % (last, alias)) - #debug.show('3, substr_pattern') - candidates += [x for x in old_images if x.name.lower().startswith(substr_pattern)] - if prev_len < len(candidates): - print(" Found match with '%s %s' for '%s %s'" % (alias, last, first, last, )) - - -# # If still no joy, try with Person.plain_name() (necessary for Donald Eastlake) -# if not candidates: -# prefix, first, middle, last, suffix = person.name_parts() -# name_parts = person.plain_name().lower().split() -# -# substr_pattern = u'-'.join(name_parts[-1:]+name_parts[0:1]) -# candidates = [x for x in old_images if x.name.lower().startswith(substr_pattern)] -# # If no joy, try a short name -# if not candidates and first in name_alias: -# prev_len = len(candidates) -# for alias in name_alias[first]: -# substr_pattern = u'-'.join(name_parts[-1:]+[alias]) -# candidates += [x for x in old_images if x.name.lower().startswith(substr_pattern)] -# if prev_len < len(candidates) : -# print(" Used '%s %s' instead of '%s %s'" % (alias, last, first, last, )) - -# # Fixup for other exceptional cases -# if person.ascii=="David Oran": -# candidates = ['oran-dave-th.jpg','oran-david.jpg'] -# -# if person.ascii=="Susan Hares": -# candidates = ['hares-sue-th.jpg','hares-susan.JPG'] -# -# if person.ascii=="Mahesh Jethanandani": -# candidates = ['Mahesh-Jethanandani-th.jpg','Jethanandani-Mahesh.jpg'] - - processed_files += [ c.path for c in candidates ] - - # We now have a list of candidate photos. - # * Consider anything less than 200x200 a thumbnail - # * For the full photo, sort by size (width) and time - # * For the thumbnail: - # - first look for a square photo less than 200x200 - # - if none found, then for the first in the sorted list less than 200x200 - # - if none found, then the smallest photo - if candidates: - candidates.sort(key=lambda x: "%04d-%d" % (x.width, x.time)) - iesg_cand = [ c for c in candidates if '/iesg/' in c.path ] - iab_cand = [ c for c in candidates if '/iab/' in c.path ] - if iesg_cand: - full = iesg_cand[-1] - thumb = iesg_cand[-1] - elif iab_cand: - full = iab_cand[-1] - thumb = iab_cand[0] - else: - full = candidates[-1] - thumbs = [ c for c in candidates if c.width==c.height and c.width <= 200 ] - if not thumbs: - thumbs = [ c for c in candidates if c.width==c.height ] - if not thumbs: - thumbs = [ c for c in candidates if c.width <= 200 ] - if not thumbs: - thumbs = candidates[:1] - thumb = thumbs[-1] - candidates = [ thumb, full ] - - # At this point we either have no candidates or two. If two, the first will be the thumb - - def copy(old, new): - if not os.path.exists(new): - print("Copying "+old+" to "+new) - shutil.copy(old, new) - shutil.copystat(old, new) - - assert(len(candidates) in [0,2]) - if len(candidates)==2: - thumb, full = candidates - - new_name = person.photo_name(thumb=False)+full.ext.lower() - new_thumb_name = person.photo_name(thumb=True)+thumb.ext.lower() - - copy( full.path, os.path.join(new_images_dir,new_name) ) - - # - copy( thumb.path, os.path.join(new_images_dir,new_thumb_name) ) - - -print("") -not_processed = 0 -for file in old_image_files: - if ( file.is_file() - and not file.suffix.lower() in ['.txt', '.lck', '.html',] - and not file.name.startswith('index.') - and not file.name.startswith('milestoneupdate') - and not file.name.startswith('nopicture') - and not file.name.startswith('robots.txt') - ): - if not str(file).decode('utf8') in processed_files: - not_processed += 1 - print(u"Not processed: "+str(file).decode('utf8')) -print("") -print("Not processed: %s files" % not_processed) diff --git a/ietf/bin/aliases-from-json.py b/ietf/bin/aliases-from-json.py new file mode 100644 index 00000000000..0da5d1f8b97 --- /dev/null +++ b/ietf/bin/aliases-from-json.py @@ -0,0 +1,104 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +# +# Uses only Python standard lib +# + +import argparse +import datetime +import json +import shutil +import stat +import sys + +from pathlib import Path +from tempfile import TemporaryDirectory + +# Default options +POSTCONFIRM_PATH = "/a/postconfirm/wrapper" +VDOMAIN = "virtual.ietf.org" + +# Map from domain label to dns domain +ADOMAINS = { + "ietf": "ietf.org", + "irtf": "irtf.org", + "iab": "iab.org", +} + + +def generate_files(records, adest, vdest, postconfirm, vdomain): + """Generate files from an iterable of records + + If adest or vdest exists as a file, it will be overwritten. If it is a directory, files + with the default names (draft-aliases and draft-virtual) will be created, but existing + files _will not_ be overwritten! + """ + with TemporaryDirectory() as tmpdir: + tmppath = Path(tmpdir) + apath = tmppath / "aliases" + vpath = tmppath / "virtual" + + with apath.open("w") as afile, vpath.open("w") as vfile: + date = datetime.datetime.now(datetime.UTC) + signature = f"# Generated by {Path(__file__).absolute()} at {date}\n" + afile.write(signature) + vfile.write(signature) + vfile.write(f"{vdomain} anything\n") + + for item in records: + alias = item["alias"] + domains = item["domains"] + address_list = item["addresses"] + filtername = f"xfilter-{alias}" + afile.write(f'{filtername + ":":64s} "|{postconfirm} filter expand-{alias} {vdomain}"\n') + for dom in domains: + vfile.write(f"{f'{alias}@{ADOMAINS[dom]}':64s} {filtername}\n") + vfile.write(f"{f'expand-{alias}@{vdomain}':64s} {', '.join(sorted(address_list))}\n") + + perms = stat.S_IWUSR | stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH + apath.chmod(perms) + vpath.chmod(perms) + shutil.move(apath, adest) + shutil.move(vpath, vdest) + + +def directory_path(val): + p = Path(val) + if p.is_dir(): + return p + else: + raise argparse.ArgumentTypeError(f"{p} is not a directory") + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Convert a JSON stream of draft alias definitions into alias / virtual alias files." + ) + parser.add_argument( + "--prefix", + required=True, + help="Prefix for output files. Files will be named -aliases and -virtual." + ) + parser.add_argument( + "--output-dir", + default="./", + type=directory_path, + help="Destination for output files.", + ) + parser.add_argument( + "--postconfirm", + default=POSTCONFIRM_PATH, + help=f"Full path to postconfirm executable (defaults to {POSTCONFIRM_PATH}", + ) + parser.add_argument( + "--vdomain", + default=VDOMAIN, + help=f"Virtual domain (defaults to {VDOMAIN}_", + ) + args = parser.parse_args() + data = json.load(sys.stdin) + generate_files( + data["aliases"], + adest=args.output_dir / f"{args.prefix}-aliases", + vdest=args.output_dir / f"{args.prefix}-virtual", + postconfirm=args.postconfirm, + vdomain=args.vdomain, + ) diff --git a/ietf/bin/announce-header-change b/ietf/bin/announce-header-change deleted file mode 100755 index 256324e31a8..00000000000 --- a/ietf/bin/announce-header-change +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python - -import sys, os, sys -import datetime - -# boilerplate -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -import django -django.setup() - -from django.core import management -from django.template.loader import render_to_string - -from ietf import settings -from ietf.utils.mail import send_mail_preformatted -from ietf.utils.mail import send_mail - -target_date=datetime.date(year=2014,month=1,day=24) - -send_mail(request = None, - to = "IETF-Announce ", - frm = "The IESG ", - subject = "Upcoming change to announcement email header fields (using old header)", - template = "utils/header_change_content.txt", - context = dict(oldornew='old', target_date=target_date), - extra = {'Reply-To' : 'ietf@ietf.org', - 'Sender' : '', - } - ) - -send_mail(request = None, - to = "IETF-Announce:;", - frm = "The IESG ", - subject = "Upcoming change to announcement email header fields (using new header)", - template = "utils/header_change_content.txt", - context = dict(oldornew='new', target_date=target_date), - extra = {'Reply-To' : 'IETF Discussion List ', - 'Sender' : '', - }, - bcc = '', - ) diff --git a/ietf/bin/create-break-sessions b/ietf/bin/create-break-sessions deleted file mode 100755 index 52ce044d8c8..00000000000 --- a/ietf/bin/create-break-sessions +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -*- Python -*- -# - -import os, sys - -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -import django -django.setup() - -from ietf.group.models import Group -from ietf.person.models import Person -from ietf.name.models import SessionStatusName -from ietf.meeting.models import Meeting, Session, ScheduledSession as ScheduleTimeslotSSessionAssignment - -secretariat = Group.objects.get(acronym='secretariat') -system = Person.objects.get(id=1, name='(System)') -scheduled = SessionStatusName.objects.get(slug='sched') - -for meeting in Meeting.objects.filter(type="ietf").order_by("date"): - print "Checking %s schedules ..." % meeting - brk, __ = Session.objects.get_or_create(meeting=meeting, group=secretariat, requested_by=system, status=scheduled, name='Break', type_id='break',) - reg, __ = Session.objects.get_or_create(meeting=meeting, group=secretariat, requested_by=system, status=scheduled, name='Registration', type_id='reg',) - - for schedule in meeting.schedule_set.all(): - print " Checking for missing Break and Reg sessions in %s" % schedule - for timeslot in meeting.timeslot_set.all(): - if timeslot.type_id == 'break' and not (schedule.base and SchedTimeSessAssignment.objects.filter(timeslot=timeslot, session=brk, schedule=schedule.base).exists()): - assignment, created = SchedTimeSessAssignment.objects.get_or_create(timeslot=timeslot, session=brk, schedule=schedule) - if created: - print " Added %s break assignment" % timeslot - if timeslot.type_id == 'reg' and not (schedule.base and SchedTimeSessAssignment.objects.filter(timeslot=timeslot, session=reg, schedule=schedule.base).exists()): - assignment, created = SchedTimeSessAssignment.objects.get_or_create(timeslot=timeslot, session=reg, schedule=schedule) - if created: - print " Added %s registration assignment" % timeslot diff --git a/ietf/bin/create-charter-newrevisiondocevents b/ietf/bin/create-charter-newrevisiondocevents deleted file mode 100755 index d91c0b5b730..00000000000 --- a/ietf/bin/create-charter-newrevisiondocevents +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python - -import os -import sys - -version = "0.10" -program = os.path.basename(sys.argv[0]) -progdir = os.path.dirname(sys.argv[0]) - -# boilerplate -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - - -# ---------------------------------------------------------------------- -def note(string): - sys.stdout.write("%s\n" % (string)) - -# ---------------------------------------------------------------------- -def warn(string): - sys.stderr.write(" * %s\n" % (string)) - -# ------------------------------------------------------------------------------ - -import re -import datetime - -import django -django.setup() - -from django.conf import settings - -from ietf.utils.path import path as Path -from ietf.doc.models import Document, NewRevisionDocEvent -from ietf.person.models import Person - -system_entity = Person.objects.get(name="(System)") - -charterdir = Path(settings.CHARTER_PATH) -for file in charterdir.files("charter-ietf-*.txt"): - fname = file.name - ftime = datetime.datetime.fromtimestamp(file.mtime, datetime.timezone.utc) - match = re.search("^(?P[a-z0-9-]+)-(?P\d\d-\d\d)\.txt$", fname) - if match: - name = match.group("name") - rev = match.group("rev") - else: - match = re.search("^(?P[a-z0-9-]+)-(?P\d\d)\.txt$", fname) - if match: - name = match.group("name") - rev = match.group("rev") - else: - warn("Failed extracting revision from filename: '%s'" % fname) - try: - doc = Document.objects.get(type="charter", name=name) - try: - event = NewRevisionDocEvent.objects.get(doc=doc, type='new_revision', rev=rev) - note(".") - except NewRevisionDocEvent.MultipleObjectsReturned, e: - warn("Multiple NewRevisionDocEvent exists for '%s'" % fname) - except NewRevisionDocEvent.DoesNotExist: - event = NewRevisionDocEvent(doc=doc, type='new_revision', rev=rev, by=system_entity, time=ftime, desc="") - event.save() - note("Created new NewRevisionDocEvent for %s-%s" % (name, rev)) - except Document.DoesNotExist: - warn("Document not found: '%s'; no NewRevisionDocEvent created for '%s'" % (name, fname)) - diff --git a/ietf/bin/dump-draft-info b/ietf/bin/dump-draft-info deleted file mode 100755 index 3ac2e4a58a4..00000000000 --- a/ietf/bin/dump-draft-info +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python - -import os -import sys - -version = "0.10" -program = os.path.basename(sys.argv[0]) -progdir = os.path.dirname(sys.argv[0]) - -# boilerplate -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -import django -django.setup() - -from django.template import Template, Context - -from ietf.doc.models import Document -from ietf.person.models import Person - -drafts = Document.objects.filter(type="draft") - -ads = {} -for p in Person.objects.filter(ad_document_set__type="draft").distinct(): - ads[p.id] = p.role_email("ad") - -for d in drafts: - d.ad_email = ads.get(d.ad_id) - -templ_text = """{% for draft in drafts %}{% if draft.notify or draft.ad_email %}{{ draft.name }}{% if draft.notify %} docnotify='{{ draft.notify|cut:"<"|cut:">" }}'{% endif %}{% if draft.ad_email %} docsponsor='{{ draft.ad_email }}'{% endif %} -{% endif %}{% endfor %}""" -template = Template(templ_text) -context = Context({ 'drafts':drafts }) - -print template.render(context).encode('utf-8') diff --git a/ietf/bin/email-sync-discrepancies b/ietf/bin/email-sync-discrepancies deleted file mode 100755 index 3593fd126f2..00000000000 --- a/ietf/bin/email-sync-discrepancies +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python - -import sys, os, sys -import syslog - -# boilerplate -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -from optparse import OptionParser - -parser = OptionParser() -parser.add_option("-t", "--to", dest="to", - help="Email address to send report to", metavar="EMAIL") - -options, args = parser.parse_args() - -syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER) - -import django -django.setup() - -from ietf.sync.mails import email_discrepancies - -receivers = ["iesg-secretary@ietf.org"] - -if options.to: - receivers = [options.to] - -email_discrepancies(receivers) - -syslog.syslog("Emailed sync discrepancies to %s" % receivers) diff --git a/ietf/bin/expire-ids b/ietf/bin/expire-ids index 98ee8d75fe5..bb0b94ee61b 100755 --- a/ietf/bin/expire-ids +++ b/ietf/bin/expire-ids @@ -13,10 +13,6 @@ basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) sys.path = [ basedir ] + sys.path os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER) import django diff --git a/ietf/bin/expire-last-calls b/ietf/bin/expire-last-calls deleted file mode 100755 index 83b565e1924..00000000000 --- a/ietf/bin/expire-last-calls +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -# This script requires that the proper virtual python environment has been -# invoked before start - -import os -import sys -import syslog - -# boilerplate -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER) - -import django -django.setup() - -# ---------------------------------------------------------------------- - -from ietf.doc.lastcall import get_expired_last_calls, expire_last_call - -drafts = get_expired_last_calls() -for doc in drafts: - try: - expire_last_call(doc) - syslog.syslog("Expired last call for %s (id=%s)" % (doc.file_tag(), doc.pk)) - except Exception as e: - syslog.syslog(syslog.LOG_ERR, "ERROR: Failed to expire last call for %s (id=%s)" % (doc.file_tag(), doc.pk)) diff --git a/ietf/bin/expire-submissions b/ietf/bin/expire-submissions index 22db38322d8..113a53ddfa0 100755 --- a/ietf/bin/expire-submissions +++ b/ietf/bin/expire-submissions @@ -8,10 +8,6 @@ basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) sys.path = [ basedir ] + sys.path os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER) import django diff --git a/ietf/bin/find-submission-confirmation-email-in-postfix-log b/ietf/bin/find-submission-confirmation-email-in-postfix-log deleted file mode 100755 index 6bf41574a10..00000000000 --- a/ietf/bin/find-submission-confirmation-email-in-postfix-log +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python - -import io -import os -import sys - -version = "0.10" -program = os.path.basename(sys.argv[0]) -progdir = os.path.dirname(sys.argv[0]) - -# boilerplate -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -# ---------------------------------------------------------------------- -def note(string): - sys.stdout.write("%s\n" % (string)) - -# ---------------------------------------------------------------------- -def warn(string): - sys.stderr.write(" * %s\n" % (string)) - -# ------------------------------------------------------------------------------ - -import re -from datetime import datetime as Datetime -import time -import warnings -warnings.filterwarnings('ignore', message='the sets module is deprecated', append=True) - -import django -django.setup() - -from django.conf import settings - -from ietf.utils.path import path as Path - -from ietf.submit.models import Submission -from ietf.doc.models import Document - - - -args = sys.argv[1:] -if len(args) < 3: - warn("Expected '$ %s DRAFTNAME USER.LOG POSTFIX.LOG', but found no arguments -- exiting" % program) - sys.exit(1) - -draft = args[0] -if re.search("\.txt$", draft): - draft = draft[:-4] -if re.search("-\d\d$", draft): - draft = draft[:-3] - -if len(args) == 1: - logfiles = [ arg[1] ] -else: - logfiles = args[1:] - -from_email = settings.IDSUBMIT_FROM_EMAIL -if "<" in from_email: - from_email = from_email.split("<")[1].split(">")[0] - -submission = Submission.objects.filter(name=draft).latest('submission_date') -document = Document.objects.get(name=draft) -emails = [ author.email.address for author in document.documentauthor_set.all() if author.email ] - -timestrings = [] -for file in [ Path(settings.INTERNET_DRAFT_PATH) / ("%s-%s.txt"%(draft, submission.rev)), - Path(settings.IDSUBMIT_STAGING_PATH) / ("%s-%s.txt"%(draft, submission.rev)) ]: - if os.path.exists(file): - upload_time = time.localtime(file.mtime) - ts = time.strftime("%b %d %H:%M", upload_time) - timestrings += [ ts ] - timestrings += [ ts[:-1] + chr(((ord(ts[-1])-ord('0')+1)%10)+ord('0')) ] - print "Looking for mail log lines timestamped %s, also checking %s ..." % (timestrings[0], timestrings[1]) - -for log in logfiles: - print "\n Checking %s ...\n" % log - if log.endswith('.gz'): - import gzip - logfile = gzip.open(log) - else: - logfile = io.open(log) - queue_ids = [] - for line in logfile: - if from_email in line and "Confirmation for Auto-Post of I-D "+draft in line: - ts = line[:12] - timestrings += [ ts ] - print "Found a mention of %s, adding timestamp %s: \n %s" % (draft, ts, line) - for ts in timestrings: - if line.startswith(ts): - if from_email in line: - for to_email in emails: - if to_email in line: - sys.stdout.write(line) - if "queued_as:" in line: - queue_ids += [ line.split("queued_as:")[1].split(",")[0] ] - elif queue_ids: - for qi in queue_ids: - if qi in line: - sys.stdout.write(line) diff --git a/ietf/bin/iana-review-email b/ietf/bin/iana-review-email index 5c7a7183b9c..27aee4015ec 100755 --- a/ietf/bin/iana-review-email +++ b/ietf/bin/iana-review-email @@ -8,10 +8,6 @@ basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) sys.path = [ basedir ] + sys.path os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER) import django diff --git a/ietf/bin/interim_minutes_reminder b/ietf/bin/interim_minutes_reminder deleted file mode 100755 index 7f2f84f739e..00000000000 --- a/ietf/bin/interim_minutes_reminder +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -*- Python -*- -# -''' -This script calls ietf.meeting.helpers.check_interim_minutes() which sends -a reminder email for interim meetings that occurred 10 days ago but still -don't have minutes. -''' - -# Set PYTHONPATH and load environment variables for standalone script ----------------- -import os, sys -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -import django -django.setup() -# ------------------------------------------------------------------------------------- - -from ietf.meeting.helpers import check_interim_minutes - -check_interim_minutes() diff --git a/ietf/bin/list-role-holder-emails b/ietf/bin/list-role-holder-emails deleted file mode 100755 index 6d6c1604640..00000000000 --- a/ietf/bin/list-role-holder-emails +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python - - -import os, sys -import syslog - -# boilerplate -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER) - -import django -django.setup() - -from django.utils.encoding import force_str -from ietf.group.models import Role - -addresses = set() -for role in Role.objects.filter( - group__state__slug='active', - group__type__in=['ag','area','dir','iab','ietf','irtf','nomcom','rg','team','wg','rag']): - #sys.stderr.write(str(role)+'\n') - for e in role.person.email_set.all(): - if e.active and not e.address.startswith('unknown-email-'): - addresses.add(e.address) - -addresses = list(addresses) -addresses.sort() -for a in addresses: - print(force_str(a)) diff --git a/ietf/bin/mailman_listinfo.py b/ietf/bin/mailman_listinfo.py deleted file mode 100755 index f7e4cfe4c1b..00000000000 --- a/ietf/bin/mailman_listinfo.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/python2.7 -# Copyright The IETF Trust 2022, All Rights Reserved -# Note the shebang. This specifically targets deployment on IETFA and intends to use its system python2.7. - -# This is an adaptor to pull information out of Mailman2 using its python libraries (which are only available for python2). -# It is NOT django code, and does not have access to django.conf.settings. - -import json -import sys - -from collections import defaultdict - -def main(): - - sys.path.append('/usr/lib/mailman') - - have_mailman = False - try: - from Mailman import Utils - from Mailman import MailList - from Mailman import MemberAdaptor - have_mailman = True - except ImportError: - pass - - - if not have_mailman: - sys.stderr.write("Could not import mailman modules -- skipping import of mailman list info") - sys.exit() - - names = list(Utils.list_names()) - - # need to emit dict of names, each name has an mlist, and each mlist has description, advertised, and members (calculated as below) - result = defaultdict(dict) - for name in names: - mlist = MailList.MailList(name, lock=False) - result[name] = dict() - result[name]['internal_name'] = mlist.internal_name() - result[name]['real_name'] = mlist.real_name - result[name]['description'] = mlist.description # Not attempting to change encoding - result[name]['advertised'] = mlist.advertised - result[name]['members'] = list() - if mlist.advertised: - members = mlist.getRegularMemberKeys() + mlist.getDigestMemberKeys() - members = set([ m for m in members if mlist.getDeliveryStatus(m) == MemberAdaptor.ENABLED ]) - result[name]['members'] = list(members) - json.dump(result, sys.stdout) - -if __name__ == "__main__": - main() diff --git a/ietf/bin/merge-person-records b/ietf/bin/merge-person-records deleted file mode 100755 index 155e5755f6b..00000000000 --- a/ietf/bin/merge-person-records +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -*- Python -*- -# -''' -This script merges two Person records into one. It determines which record is the target -based on most current User record (last_login) unless -f (force) option is used to -force SOURCE TARGET as specified on the command line. The order of operations is -important. We must complete all source.save() operations before moving the aliases to -the target, this is to avoid extra "Possible duplicate Person" emails going out, if the -Person is saved without an alias the Person.save() creates another one, which then -conflicts with the moved one. -''' - -# Set PYTHONPATH and load environment variables for standalone script ----------------- -import os, sys -basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) -sys.path = [ basedir ] + sys.path -os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" - -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - -import django -django.setup() -# ------------------------------------------------------------------------------------- - -import argparse -from django.contrib import admin -from ietf.person.models import Person -from ietf.person.utils import (merge_persons, send_merge_notification, handle_users, - determine_merge_order) - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("source_id",type=int) - parser.add_argument("target_id",type=int) - parser.add_argument('-f','--force', help='force merge order',action='store_true') - parser.add_argument('-v','--verbose', help='verbose output',action='store_true') - args = parser.parse_args() - - source = Person.objects.get(pk=args.source_id) - target = Person.objects.get(pk=args.target_id) - - # set merge order - if not args.force: - source,target = determine_merge_order(source,target) - - # confirm - print "Merging person {}({}) to {}({})".format(source.ascii,source.pk,target.ascii,target.pk) - print handle_users(source,target,check_only=True) - response = raw_input('Ok to continue y/n? ') - if response.lower() != 'y': - sys.exit() - - # perform merge - success, changes = merge_persons(source, target, verbose=args.verbose) - - # send email notification - send_merge_notification(target,changes) - -if __name__ == "__main__": - main() diff --git a/ietf/bin/notify-expirations b/ietf/bin/notify-expirations index 0270c137659..fc2fd86a31b 100755 --- a/ietf/bin/notify-expirations +++ b/ietf/bin/notify-expirations @@ -7,10 +7,6 @@ basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) sys.path = [ basedir ] + sys.path os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings" -virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py") -if os.path.exists(virtualenv_activation): - execfile(virtualenv_activation, dict(__file__=virtualenv_activation)) - import django django.setup() diff --git a/ietf/bin/pretty-xml-dump b/ietf/bin/pretty-xml-dump deleted file mode 100755 index 22abc08a649..00000000000 --- a/ietf/bin/pretty-xml-dump +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -python manage.py dumpdata --format=xml "$@" | sed -e 's/<\/*object/\ - &/g' -e 's/')][1:])) - else: - retval.append(ParsedAuthor(a.strip(),None)) - - return retval - -def calculate_changes(tracker_persons,tracker_emails,names,emails): - adds = set() - deletes = set() - for email in emails: - if email and email!='none' and email not in ignore_addresses: - p = Person.objects.filter(email__address=email).first() - if p: - if not set(map(unicode.lower,p.email_set.values_list('address',flat=True))).intersection(tracker_emails): - adds.add(email) - else: - #person_name = names[emails.index(email)] - adds.add(email) - for person in tracker_persons: - if not set(map(unicode.lower,person.email_set.values_list('address',flat=True))).intersection(emails): - match = False - for index in [i for i,j in enumerate(emails) if j=='none' or not j]: - if names[index].split()[-1].lower()==person.last_name().lower(): - match = True - if not match: - deletes.add(person) - return adds, deletes - -def _main(): - - parser = argparse.ArgumentParser(description="Recalculate RFC documentauthor_set"+'\n\n'+__doc__, - formatter_class=argparse.RawDescriptionHelpFormatter,) - parser.add_argument('-v','--verbose',help="Show the action taken for each RFC",action='store_true') - parser.add_argument('--rfc',type=int, nargs='*',help="Only recalculate the given rfc numbers",dest='rfcnumberlist') - args = parser.parse_args() - - probable_email_match = set() - probable_duplicates = [] - - all_the_email = get_all_the_email() - author_names, author_emails = get_rfc_data() - - stats = { 'rfc not in tracker' :0, - 'same addresses' :0, - 'different addresses belonging to same people' :0, - 'same names, rfced emails do not match' :0, - 'rfced data is unusable' :0, - "data doesn't match but no changes found" :0, - 'changed authors' :0, } - - for rfc_num in args.rfcnumberlist or sorted(author_names.keys()): - - rfc = Document.objects.filter(docalias__name='rfc%s'%rfc_num).first() - - if not rfc: - if args.verbose: - show_verbose(rfc_num,'rfc not in tracker') - stats['rfc not in tracker'] += 1 - continue - - rfced_emails = set(author_emails[rfc_num]) - tracker_emails = set(map(unicode.lower,rfc.authors.values_list('address',flat=True))) - tracker_persons = set([x.person for x in rfc.authors.all()]) - matching_emails = get_matching_emails(all_the_email,rfced_emails) - rfced_persons = set([x.person for x in matching_emails]) - known_emails = set([e.l_address for e in matching_emails]) - unknown_emails = rfced_emails - known_emails - unknown_persons = tracker_persons-rfced_persons - - rfced_lastnames = sorted([n.split()[-1].lower() for n in author_names[rfc_num]]) - tracker_lastnames = sorted([p.last_name().lower() for p in tracker_persons]) - - if rfced_emails == tracker_emails: - if args.verbose: - show_verbose(rfc_num,'tracker and rfc editor have the same addresses') - stats['same addresses'] += 1 - continue - - if len(rfced_emails)==len(tracker_emails) and not 'none' in author_emails[rfc_num]: - if tracker_persons == rfced_persons: - if args.verbose: - show_verbose(rfc_num,'tracker and rfc editor have the different addresses belonging to same people') - stats['different addresses belonging to same people'] += 1 - continue - else: - if len(unknown_emails)==1 and len(tracker_persons-rfced_persons)==1: - p = list(tracker_persons-rfced_persons)[0] - probable_email_match.add(u"%s is probably %s (%s) : %s "%(list(unknown_emails)[0], p, p.pk, rfc_num)) - elif len(unknown_emails)==len(unknown_persons): - probable_email_match.add(u"%s are probably %s : %s"%(unknown_emails,[(p.ascii,p.pk) for p in unknown_persons],rfc_num)) - else: - probable_duplicates.append((tracker_persons^rfced_persons,rfc_num)) - - if tracker_lastnames == rfced_lastnames: - if args.verbose: - show_verbose(rfc_num,"emails don't match up, but person names appear to be the same") - stats[ 'same names, rfced emails do not match'] += 1 - continue - - use_rfc_data = bool(len(author_emails[rfc_num])==len(author_names[rfc_num])) - if not use_rfc_data: - if args.verbose: - print 'Ignoring rfc database for rfc%d'%rfc_num - stats[ 'rfced data is unusable'] += 1 - - if use_rfc_data: - adds, deletes = calculate_changes(tracker_persons,tracker_emails,author_names[rfc_num],author_emails[rfc_num]) - parsed_authors=get_parsed_authors(rfc_num) - parsed_adds, parsed_deletes = calculate_changes(tracker_persons,tracker_emails,[x.name for x in parsed_authors],[x.address for x in parsed_authors]) - - for e in adds.union(parsed_adds) if use_rfc_data else parsed_adds: - if not e or e in ignore_addresses: - continue - if not Person.objects.filter(email__address=e).exists(): - if e not in parsed_adds: - #print rfc_num,"Would add",e,"as",author_names[rfc_num][author_emails[rfc_num].index(e)],"(rfced database)" - print "(address='%s',name='%s'),"%(e,author_names[rfc_num][author_emails[rfc_num].index(e)]),"# (rfced %d)"%rfc_num - for p in Person.objects.filter(name__iendswith=author_names[rfc_num][author_emails[rfc_num].index(e)].split(' ')[-1]): - print "\t", p.pk, p.ascii - else: - name = [x.name for x in parsed_authors if x.address==e][0] - p = Person.objects.filter(name=name).first() - if p: - #print e,"is probably",p.pk,p - print "'%s': %d, # %s (%d)"%(e,p.pk,p.ascii,rfc_num) - - else: - p = Person.objects.filter(ascii=name).first() - if p: - print e,"is probably",p.pk,p - print "'%s': %d, # %s (%d)"%(e,p.pk,p.ascii,rfc_num) - else: - p = Person.objects.filter(ascii_short=name).first() - if p: - print e,"is probably",p.pk,p - print "'%s': %d, # %s (%d)"%(e,p.pk,p.ascii,rfc_num) - #print rfc_num,"Would add",e,"as",name,"(parsed)" - print "(address='%s',name='%s'),"%(e,name),"# (parsed %d)"%rfc_num - for p in Person.objects.filter(name__iendswith=name.split(' ')[-1]): - print "\t", p.pk, p.ascii - - if False: # This was a little useful, but the noise in the rfc_ed file keeps it from being completely useful - for p in deletes: - for n in author_names[rfc_num]: - if p.last_name().lower()==n.split()[-1].lower(): - email_candidate = author_emails[rfc_num][author_names[rfc_num].index(n)] - email_found = Email.objects.filter(address=email_candidate).first() - if email_found: - probable_duplicates.append((set([p,email_found.person]),rfc_num)) - else: - probable_email_match.add(u"%s is probably %s (%s) : %s"%(email_candidate, p, p.pk, rfc_num)) - - if args.verbose: - if use_rfc_data: - working_adds = parsed_adds - seen_people = set(Email.objects.get(address=e).person for e in parsed_adds) - for addr in adds: - person = Email.objects.get(address=addr).person - if person not in seen_people: - working_adds.add(addr) - seen_people.add(person) - working_deletes = deletes.union(parsed_deletes) - else: - working_adds = parsed_adds - working_deletes = parsed_deletes - # unique_adds = set() # TODO don't add different addresses for the same person from the two sources - if working_adds or working_deletes: - show_verbose(rfc_num,"Changing original list",tracker_persons,"by adding",working_adds," and deleting",working_deletes) - print "(",rfc_num,",",[e for e in working_adds],",",[p.pk for p in working_deletes],"), #",[p.ascii for p in working_deletes] - else: - stats["data doesn't match but no changes found"] += 1 - show_verbose(rfc_num,"Couldn't figure out what to change") - - if False: - #if tracker_persons: - #if any(['iab@' in e for e in adds]) or any(['iesg@' in e for e in adds]) or any(['IESG'==p.name for p in deletes]) or any(['IAB'==p.name for p in deletes]): - print rfc_num - print "tracker_persons",tracker_persons - print "author_names",author_names[rfc_num] - print "author_emails",author_emails[rfc_num] - print "Adds:", adds - print "Deletes:", deletes - - stats['changed authors'] += 1 - - if False: - debug.show('rfc_num') - debug.show('rfced_emails') - debug.show('tracker_emails') - debug.show('known_emails') - debug.show('unknown_emails') - debug.show('tracker_persons') - debug.show('rfced_persons') - debug.show('tracker_persons==rfced_persons') - debug.show('[p.id for p in tracker_persons]') - debug.show('[p.id for p in rfced_persons]') - exit() - - if True: - for p in sorted(list(probable_email_match)): - print p - if True: - print "Probable duplicate persons" - for d,r in sorted(probable_duplicates): - print [(p,p.pk) for p in d], r - else: - print len(probable_duplicates)," probable duplicate persons" - - print stats - -if __name__ == "__main__": - _main() - diff --git a/ietf/bin/redirect-dump b/ietf/bin/redirect-dump deleted file mode 100755 index ef35bbf0de9..00000000000 --- a/ietf/bin/redirect-dump +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# -# Copyright The IETF Trust 2007, All Rights Reserved -# -#python manage.py dumpdata --format=xml redirects | xmllint --format - -python manage.py dumpdata --format=xml redirects | sed -e 's/<\/*object/\ - &/g' -e 's/ {self.bucket}:{self.blob}" diff --git a/ietf/blobdb/replication.py b/ietf/blobdb/replication.py new file mode 100644 index 00000000000..b9d55c94982 --- /dev/null +++ b/ietf/blobdb/replication.py @@ -0,0 +1,178 @@ +# Copyright The IETF Trust 2025, All Rights Reserved +import datetime +from dataclasses import dataclass +from io import BytesIO +from typing import Optional + +from django.conf import settings +from django.core.files import File +from django.core.files.storage import storages, InvalidStorageError +from django.db import connections + +from ietf.utils import log + +DEFAULT_SETTINGS = { + "ENABLED": False, + "DEST_STORAGE_PATTERN": "r2-{bucket}", + "INCLUDE_BUCKETS": (), # empty means include all + "EXCLUDE_BUCKETS": (), # empty means exclude none + "VERBOSE_LOGGING": False, +} + + +class SimpleMetadataFile(File): + def __init__(self, file, name=None): + super().__init__(file, name) + self.custom_metadata = {} + self.content_type = "" + + +def get_replication_settings(): + return DEFAULT_SETTINGS | getattr(settings, "BLOBDB_REPLICATION", {}) + + +def validate_replication_settings(): + replicator_settings = get_replication_settings() + # No extra settings allowed + unknown_settings = set(DEFAULT_SETTINGS.keys()) - set(replicator_settings.keys()) + if len(unknown_settings) > 0: + raise RuntimeError( + f"Unrecognized BLOBDB_REPLICATOR settings: {', '.join(str(unknown_settings))}" + ) + # destination storage pattern must be a string that includes {bucket} + pattern = replicator_settings["DEST_STORAGE_PATTERN"] + if not isinstance(pattern, str): + raise RuntimeError( + f"DEST_STORAGE_PATTERN must be a str, not {type(pattern).__name__}" + ) + if "{bucket}" not in pattern: + raise RuntimeError( + f"DEST_STORAGE_PATTERN must contain the substring '{{bucket}}' (found '{pattern}')" + ) + # include/exclude buckets must be list-like + include_buckets = replicator_settings["INCLUDE_BUCKETS"] + if not isinstance(include_buckets, (list, tuple, set)): + raise RuntimeError("INCLUDE_BUCKETS must be a list, tuple, or set") + exclude_buckets = replicator_settings["EXCLUDE_BUCKETS"] + if not isinstance(exclude_buckets, (list, tuple, set)): + raise RuntimeError("EXCLUDE_BUCKETS must be a list, tuple, or set") + # if we have explicit include_buckets, make sure the necessary storages exist + if len(include_buckets) > 0: + include_storages = {destination_storage_name_for(b) for b in include_buckets} + exclude_storages = {destination_storage_name_for(b) for b in exclude_buckets} + configured_storages = set(settings.STORAGES.keys()) + missing_storages = include_storages - exclude_storages - configured_storages + if len(missing_storages) > 0: + raise RuntimeError( + f"Replication requires unknown storage(s): {', '.join(missing_storages)}" + ) + + +def destination_storage_name_for(bucket: str): + pattern = get_replication_settings()["DEST_STORAGE_PATTERN"] + return pattern.format(bucket=bucket) + + +def destination_storage_for(bucket: str): + storage_name = destination_storage_name_for(bucket) + return storages[storage_name] + + +def replication_enabled(bucket: str): + replication_settings = get_replication_settings() + if not replication_settings["ENABLED"]: + return False + # Default is all buckets are included + included = ( + len(replication_settings["INCLUDE_BUCKETS"]) == 0 + or bucket in replication_settings["INCLUDE_BUCKETS"] + ) + # Default is no buckets are excluded + excluded = ( + len(replication_settings["EXCLUDE_BUCKETS"]) > 0 + and bucket in replication_settings["EXCLUDE_BUCKETS"] + ) + return included and not excluded + + +def verbose_logging_enabled(): + return bool(get_replication_settings()["VERBOSE_LOGGING"]) + + +@dataclass +class SqlBlob: + content: bytes + checksum: str + modified: datetime.datetime + mtime: Optional[datetime.datetime] + content_type: str + + +def fetch_blob_via_sql(bucket: str, name: str) -> Optional[SqlBlob]: + blobdb_connection = connections["blobdb"] + cursor = blobdb_connection.cursor() + cursor.execute( + """ + SELECT content, checksum, modified, mtime, content_type FROM blobdb_blob + WHERE bucket=%s AND name=%s LIMIT 1 + """, + [bucket, name], + ) + row = cursor.fetchone() + col_names = [col[0] for col in cursor.description] + return None if row is None else SqlBlob(**{ + col_name: row_val + for col_name, row_val in zip(col_names, row) + }) + + +def replicate_blob(bucket, name): + """Replicate a Blobdb blob to a Storage""" + if not replication_enabled(bucket): + if verbose_logging_enabled(): + log.log( + f"Not replicating {bucket}:{name} because replication is not enabled for {bucket}" + ) + return + + try: + destination_storage = destination_storage_for(bucket) + except InvalidStorageError as e: + log.log( + f"Failed to replicate {bucket}:{name} because destination storage for {bucket} is not configured" + ) + raise ReplicationError from e + + blob = fetch_blob_via_sql(bucket, name) + if blob is None: + if verbose_logging_enabled(): + log.log("Deleting {bucket}:{name} from replica") + try: + destination_storage.delete(name) + except Exception as e: + log.log("Failed to delete {bucket}:{name} from replica: {e}") + raise ReplicationError from e + else: + # Add metadata expected by the MetadataS3Storage + file_with_metadata = SimpleMetadataFile(file=BytesIO(blob.content)) + file_with_metadata.content_type = blob.content_type + file_with_metadata.custom_metadata = { + "sha384": blob.checksum, + "mtime": (blob.mtime or blob.modified).isoformat(), + } + if verbose_logging_enabled(): + log.log( + f"Saving {bucket}:{name} to replica (" + f"sha384: '{file_with_metadata.custom_metadata['sha384'][:16]}...', " + f"content_type: '{file_with_metadata.content_type}', " + f"mtime: '{file_with_metadata.custom_metadata['mtime']})" + ) + try: + destination_storage.save(name, file_with_metadata) + except Exception as e: + log.log("Failed to save {bucket}:{name} to replica: {e}") + raise ReplicationError from e + + +class ReplicationError(Exception): + pass diff --git a/ietf/blobdb/routers.py b/ietf/blobdb/routers.py new file mode 100644 index 00000000000..319c0fbc71a --- /dev/null +++ b/ietf/blobdb/routers.py @@ -0,0 +1,58 @@ +# Copyright The IETF Trust 2025, All Rights Reserved +from django.apps import apps + +from .apps import BlobdbConfig, get_blobdb + + +class BlobdbStorageRouter: + """Database router for the Blobdb""" + + _app_label = None + + @property + def app_label(self): + if self._app_label is None: + for app in apps.get_app_configs(): + if isinstance(app, BlobdbConfig): + self._app_label = app.label + break + if self._app_label is None: + raise RuntimeError( + f"{BlobdbConfig.name} is not present in the Django app registry" + ) + return self._app_label + + @property + def db(self): + return get_blobdb() + + def db_for_read(self, model, **hints): + """Suggest the database that should be used for read operations for objects of type model + + Returns None if there is no suggestion. + """ + if model._meta.app_label == self.app_label: + return self.db + return None # no suggestion + + def db_for_write(self, model, **hints): + """Suggest the database that should be used for write of objects of type model + + Returns None if there is no suggestion. + """ + if model._meta.app_label == self.app_label: + return self.db + return None # no suggestion + + def allow_migrate(self, db, app_label, model_name=None, **hints): + """Determine if the migration operation is allowed to run on the database with alias db + + Return True if the operation should run, False if it shouldn’t run, or + None if the router has no opinion. + """ + if self.db is None: + return None # no opinion, use the default db + is_our_app = app_label == self.app_label + is_our_db = db == self.db + if is_our_app or is_our_db: + return is_our_app and is_our_db diff --git a/ietf/blobdb/storage.py b/ietf/blobdb/storage.py new file mode 100644 index 00000000000..4213ec801df --- /dev/null +++ b/ietf/blobdb/storage.py @@ -0,0 +1,96 @@ +# Copyright The IETF Trust 2025, All Rights Reserved +from typing import Optional + +from django.core.exceptions import SuspiciousFileOperation +from django.core.files.base import ContentFile +from django.core.files.storage import Storage +from django.db.models.functions import Length +from django.utils.deconstruct import deconstructible +from django.utils import timezone + +from ietf.utils.storage import MetadataFile +from .models import Blob + + +class BlobFile(MetadataFile): + + def __init__(self, content, name=None, mtime=None, content_type=""): + super().__init__( + file=ContentFile(content), + name=name, + mtime=mtime, + content_type=content_type, + ) + + +@deconstructible +class BlobdbStorage(Storage): + + def __init__(self, bucket_name: Optional[str]=None): + if bucket_name is None: + raise ValueError("BlobdbStorage bucket_name must be specified") + self.bucket_name = bucket_name + + def get_queryset(self): + return Blob.objects.filter(bucket=self.bucket_name) + + def delete(self, name): + blob = self.get_queryset().filter(name=name).first() + if blob is not None: + blob.delete() + + def exists(self, name): + return self.get_queryset().filter(name=name).exists() + + def size(self, name): + sizes = ( + self.get_queryset() + .filter(name=name) + .annotate(object_size=Length("content")) + .values_list("object_size", flat=True) + ) + if len(sizes) == 0: + raise FileNotFoundError( + f"No object '{name}' exists in bucket '{self.bucket_name}'" + ) + return sizes[0] # unique constraint guarantees 0 or 1 entry + + def _open(self, name, mode="rb"): + try: + blob = self.get_queryset().get(name=name) + except Blob.DoesNotExist: + raise FileNotFoundError( + f"No object '{name}' exists in bucket '{self.bucket_name}'" + ) + return BlobFile( + content=blob.content, + name=blob.name, + mtime=blob.mtime or blob.modified, # fall back to modified time + content_type=blob.content_type, + ) + + def _save(self, name, content): + """Perform the save operation + + The storage API allows _save() to save to a different name than was requested. This method will + never do that, instead overwriting the existing blob. + """ + Blob.objects.update_or_create( + name=name, + bucket=self.bucket_name, + defaults={ + "content": content.read(), + "modified": timezone.now(), + "mtime": getattr(content, "mtime", None), + "content_type": getattr(content, "content_type", ""), + }, + ) + return name + + def get_available_name(self, name, max_length=None): + if max_length is not None and len(name) > max_length: + raise SuspiciousFileOperation( + f"BlobdbStorage only allows names up to {max_length}, but was" + f"asked to store the name '{name[:5]}...{name[-5:]} of length {len(name)}" + ) + return name # overwrite is permitted diff --git a/ietf/blobdb/tasks.py b/ietf/blobdb/tasks.py new file mode 100644 index 00000000000..538d4158304 --- /dev/null +++ b/ietf/blobdb/tasks.py @@ -0,0 +1,17 @@ +# Copyright The IETF Trust 2025, All Rights Reserved + +import json + +from celery import shared_task + +from .replication import replicate_blob, ReplicationError + + +@shared_task( + autoretry_for=(ReplicationError,), retry_backoff=10, retry_kwargs={"max_retries": 5} +) +def pybob_the_blob_replicator_task(body: str): + request = json.loads(body) + bucket = request["bucket"] + name = request["name"] + replicate_blob(bucket, name) diff --git a/ietf/blobdb/tests.py b/ietf/blobdb/tests.py new file mode 100644 index 00000000000..0eadad0a1f7 --- /dev/null +++ b/ietf/blobdb/tests.py @@ -0,0 +1,80 @@ +# Copyright The IETF Trust 2025, All Rights Reserved +import datetime + +from django.core.files.base import ContentFile + +from ietf.utils.test_utils import TestCase +from .factories import BlobFactory +from .models import Blob +from .storage import BlobFile, BlobdbStorage + + +class StorageTests(TestCase): + def test_save(self): + storage = BlobdbStorage(bucket_name="my-bucket") + timestamp = datetime.datetime( + 2025, + 3, + 17, + 1, + 2, + 3, + tzinfo=datetime.timezone.utc, + ) + # Create file to save + my_file = BlobFile( + content=b"These are my bytes.", + mtime=timestamp, + content_type="application/x-my-content-type", + ) + # save the file + saved_name = storage.save("myfile.txt", my_file) + # validate the outcome + self.assertEqual(saved_name, "myfile.txt") + blob = Blob.objects.filter(bucket="my-bucket", name="myfile.txt").first() + self.assertIsNotNone(blob) # validates bucket and name + self.assertEqual(bytes(blob.content), b"These are my bytes.") + self.assertEqual(blob.mtime, timestamp) + self.assertEqual(blob.content_type, "application/x-my-content-type") + + def test_save_naive_file(self): + storage = BlobdbStorage(bucket_name="my-bucket") + my_naive_file = ContentFile(content=b"These are my naive bytes.") + # save the file + saved_name = storage.save("myfile.txt", my_naive_file) + # validate the outcome + self.assertEqual(saved_name, "myfile.txt") + blob = Blob.objects.filter(bucket="my-bucket", name="myfile.txt").first() + self.assertIsNotNone(blob) # validates bucket and name + self.assertEqual(bytes(blob.content), b"These are my naive bytes.") + self.assertIsNone(blob.mtime) + self.assertEqual(blob.content_type, "") + + def test_open(self): + """BlobdbStorage open yields a BlobFile with specific mtime and content_type""" + mtime = datetime.datetime(2021, 1, 2, 3, 45, tzinfo=datetime.timezone.utc) + blob = BlobFactory(mtime=mtime, content_type="application/x-oh-no-you-didnt") + storage = BlobdbStorage(bucket_name=blob.bucket) + with storage.open(blob.name, "rb") as f: + self.assertTrue(isinstance(f, BlobFile)) + assert isinstance(f, BlobFile) # redundant, narrows type for linter + self.assertEqual(f.read(), bytes(blob.content)) + self.assertEqual(f.mtime, mtime) + self.assertEqual(f.content_type, "application/x-oh-no-you-didnt") + + def test_open_null_mtime(self): + """BlobdbStorage open yields a BlobFile with default mtime and content_type""" + blob = BlobFactory(content_type="application/x-oh-no-you-didnt") # does not set mtime + storage = BlobdbStorage(bucket_name=blob.bucket) + with storage.open(blob.name, "rb") as f: + self.assertTrue(isinstance(f, BlobFile)) + assert isinstance(f, BlobFile) # redundant, narrows type for linter + self.assertEqual(f.read(), bytes(blob.content)) + self.assertIsNotNone(f.mtime) + self.assertEqual(f.mtime, blob.modified) + self.assertEqual(f.content_type, "application/x-oh-no-you-didnt") + + def test_open_file_not_found(self): + storage = BlobdbStorage(bucket_name="not-a-bucket") + with self.assertRaises(FileNotFoundError): + storage.open("definitely/not-a-file.txt") diff --git a/ietf/celeryapp.py b/ietf/celeryapp.py index cefde3a8d36..fda89c30bec 100644 --- a/ietf/celeryapp.py +++ b/ietf/celeryapp.py @@ -1,11 +1,20 @@ import os +import scout_apm.celery + +import celery +from scout_apm.api import Config + + +# Disable celery's internal logging configuration, we set it up via Django +@celery.signals.setup_logging.connect +def on_setup_logging(**kwargs): + pass -from celery import Celery # Set the default Django settings module for the 'celery' program os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ietf.settings') -app = Celery('ietf') +app = celery.Celery('ietf') # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. @@ -13,6 +22,28 @@ # should have a `CELERY_` prefix. app.config_from_object('django.conf:settings', namespace='CELERY') +# Turn on Scout APM celery instrumentation if configured in the environment +scout_key = os.environ.get("DATATRACKER_SCOUT_KEY", None) +if scout_key is not None: + scout_name = os.environ.get("DATATRACKER_SCOUT_NAME", "Datatracker") + scout_core_agent_socket_path = "tcp://{host}:{port}".format( + host=os.environ.get("DATATRACKER_SCOUT_CORE_AGENT_HOST", "localhost"), + port=os.environ.get("DATATRACKER_SCOUT_CORE_AGENT_PORT", "6590"), + ) + Config.set( + key=scout_key, + name=scout_name, + monitor=True, + core_agent_download=False, + core_agent_launch=False, + core_agent_path=scout_core_agent_socket_path, + ) + # Note: Passing the Celery app to install() method as recommended in the + # Scout documentation causes failure at startup, likely because Scout + # ingests the config greedily before Django is ready. Have not found a + # workaround for this other than explicitly configuring Scout. + scout_apm.celery.install() + # Load task modules from all registered Django apps. app.autodiscover_tasks() diff --git a/ietf/checks.py b/ietf/checks.py index c823abf1186..f911d081f0b 100644 --- a/ietf/checks.py +++ b/ietf/checks.py @@ -28,81 +28,6 @@ def already_ran(): checks_run.append(name) return False -@checks.register('directories') -def check_cdn_directory_exists(app_configs, **kwargs): - """This checks that the path from which the CDN will serve static files for - this version of the datatracker actually exists. In development and test - mode STATIC_ROOT will normally be just static/, but in production it will be - set to a different part of the file system which is served via CDN, and the - path will contain the datatracker release version. - """ - if already_ran(): - return [] - # - errors = [] - if settings.SERVER_MODE == 'production' and not os.path.exists(settings.STATIC_ROOT): - errors.append(checks.Error( - "The static files directory has not been set up.", - hint="Please run 'ietf/manage.py collectstatic'.", - obj=None, - id='datatracker.E001', - )) - return errors - -@checks.register('files') -def check_group_email_aliases_exists(app_configs, **kwargs): - from ietf.group.views import check_group_email_aliases - # - if already_ran(): - return [] - # - errors = [] - try: - ok = check_group_email_aliases() - if not ok: - errors.append(checks.Error( - "Found no aliases in the group email aliases file\n'%s'."%settings.GROUP_ALIASES_PATH, - hint="Please run the generate_group_aliases management command to generate them.", - obj=None, - id="datatracker.E0002", - )) - except IOError as e: - errors.append(checks.Error( - "Could not read group email aliases:\n %s" % e, - hint="Please run the generate_group_aliases management command to generate them.", - obj=None, - id="datatracker.E0003", - )) - - return errors - -@checks.register('files') -def check_doc_email_aliases_exists(app_configs, **kwargs): - from ietf.doc.views_doc import check_doc_email_aliases - # - if already_ran(): - return [] - # - errors = [] - try: - ok = check_doc_email_aliases() - if not ok: - errors.append(checks.Error( - "Found no aliases in the document email aliases file\n'%s'."%settings.DRAFT_VIRTUAL_PATH, - hint="Please run the generate_draft_aliases management command to generate them.", - obj=None, - id="datatracker.E0004", - )) - except IOError as e: - errors.append(checks.Error( - "Could not read document email aliases:\n %s" % e, - hint="Please run the generate_draft_aliases management command to generate them.", - obj=None, - id="datatracker.E0005", - )) - - return errors - @checks.register('directories') def check_id_submission_directories(app_configs, **kwargs): # diff --git a/ietf/community/admin.py b/ietf/community/admin.py index 890819d9d98..4c947ad3f78 100644 --- a/ietf/community/admin.py +++ b/ietf/community/admin.py @@ -7,8 +7,8 @@ from ietf.community.models import CommunityList, SearchRule, EmailSubscription class CommunityListAdmin(admin.ModelAdmin): - list_display = ['id', 'user', 'group'] - raw_id_fields = ['user', 'group', 'added_docs'] + list_display = ['id', 'person', 'group'] + raw_id_fields = ['person', 'group', 'added_docs'] admin.site.register(CommunityList, CommunityListAdmin) class SearchRuleAdmin(admin.ModelAdmin): diff --git a/ietf/community/apps.py b/ietf/community/apps.py new file mode 100644 index 00000000000..ab0a6d6054b --- /dev/null +++ b/ietf/community/apps.py @@ -0,0 +1,12 @@ +# Copyright The IETF Trust 2024, All Rights Reserved + +from django.apps import AppConfig + + +class CommunityConfig(AppConfig): + name = "ietf.community" + + def ready(self): + """Initialize the app after the registry is populated""" + # implicitly connects @receiver-decorated signals + from . import signals # pyflakes: ignore diff --git a/ietf/community/forms.py b/ietf/community/forms.py index 8d72ce0d702..d3fa01dd19d 100644 --- a/ietf/community/forms.py +++ b/ietf/community/forms.py @@ -30,6 +30,8 @@ def __init__(self, clist, rule_type, *args, **kwargs): super(SearchRuleForm, self).__init__(*args, **kwargs) def restrict_state(state_type, slug=None): + if "state" not in self.fields: + raise RuntimeError(f"Rule type {rule_type} cannot include state filtering") f = self.fields['state'] f.queryset = f.queryset.filter(used=True).filter(type=state_type) if slug: @@ -38,11 +40,15 @@ def restrict_state(state_type, slug=None): f.initial = f.queryset[0].pk f.widget = forms.HiddenInput() + if rule_type.endswith("_rfc"): + del self.fields["state"] # rfc rules must not look at document states + if rule_type in ["group", "group_rfc", "area", "area_rfc", "group_exp"]: if rule_type == "group_exp": restrict_state("draft", "expired") else: - restrict_state("draft", "rfc" if rule_type.endswith("rfc") else "active") + if not rule_type.endswith("_rfc"): + restrict_state("draft", "active") if rule_type.startswith("area"): self.fields["group"].label = "Area" @@ -70,7 +76,8 @@ def restrict_state(state_type, slug=None): del self.fields["text"] elif rule_type in ["author", "author_rfc", "shepherd", "ad"]: - restrict_state("draft", "rfc" if rule_type.endswith("rfc") else "active") + if not rule_type.endswith("_rfc"): + restrict_state("draft", "active") if rule_type.startswith("author"): self.fields["person"].label = "Author" @@ -84,7 +91,8 @@ def restrict_state(state_type, slug=None): del self.fields["text"] elif rule_type == "name_contains": - restrict_state("draft", "rfc" if rule_type.endswith("rfc") else "active") + if not rule_type.endswith("_rfc"): + restrict_state("draft", "active") del self.fields["person"] del self.fields["group"] @@ -106,14 +114,13 @@ def clean_text(self): class SubscriptionForm(forms.ModelForm): - def __init__(self, user, clist, *args, **kwargs): + def __init__(self, person, clist, *args, **kwargs): self.clist = clist - self.user = user super(SubscriptionForm, self).__init__(*args, **kwargs) self.fields["notify_on"].widget = forms.RadioSelect(choices=self.fields["notify_on"].choices) - self.fields["email"].queryset = self.fields["email"].queryset.filter(person__user=user, active=True).order_by("-primary") + self.fields["email"].queryset = self.fields["email"].queryset.filter(person=person, active=True).order_by("-primary") self.fields["email"].widget = forms.RadioSelect(choices=[t for t in self.fields["email"].choices if t[0]]) if self.fields["email"].queryset: diff --git a/ietf/community/migrations/0003_track_rfcs.py b/ietf/community/migrations/0003_track_rfcs.py new file mode 100644 index 00000000000..3c2d04097da --- /dev/null +++ b/ietf/community/migrations/0003_track_rfcs.py @@ -0,0 +1,50 @@ +# Generated by Django 4.2.3 on 2023-07-07 18:33 + +from django.db import migrations + + +def forward(apps, schema_editor): + """Track any RFCs that were created from tracked drafts""" + CommunityList = apps.get_model("community", "CommunityList") + RelatedDocument = apps.get_model("doc", "RelatedDocument") + + # Handle individually tracked documents + for cl in CommunityList.objects.all(): + for rfc in set( + RelatedDocument.objects.filter( + source__in=cl.added_docs.all(), + relationship__slug="became_rfc", + ).values_list("target__docs", flat=True) + ): + cl.added_docs.add(rfc) + + # Handle rules - rules ending with _rfc should no longer filter by state. + # There are 9 CommunityLists with invalid author_rfc rules that are filtering + # by (draft, active) instead of (draft, rfc) state before migration. All but one + # also includes an author rule for (draft, active), so these will start following + # RFCs as well. The one exception will start tracking RFCs instead of I-Ds, which + # is probably what was intended, but will be a change in their user experience. + SearchRule = apps.get_model("community", "SearchRule") + rfc_rules = SearchRule.objects.filter(rule_type__endswith="_rfc") + rfc_rules.update(state=None) + +def reverse(apps, schema_editor): + Document = apps.get_model("doc", "Document") + for rfc in Document.objects.filter(type__slug="rfc"): + rfc.communitylist_set.clear() + + # See the comment above regarding author_rfc + SearchRule = apps.get_model("community", "SearchRule") + State = apps.get_model("doc", "State") + SearchRule.objects.filter(rule_type__endswith="_rfc").update( + state=State.objects.get(type_id="draft", slug="rfc") + ) + + +class Migration(migrations.Migration): + dependencies = [ + ("community", "0002_auto_20230320_1222"), + ("doc", "0014_move_rfc_docaliases"), + ] + + operations = [migrations.RunPython(forward, reverse)] diff --git a/ietf/community/migrations/0004_delete_useless_community_lists.py b/ietf/community/migrations/0004_delete_useless_community_lists.py new file mode 100644 index 00000000000..9f657a3c349 --- /dev/null +++ b/ietf/community/migrations/0004_delete_useless_community_lists.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.9 on 2024-01-05 21:28 + +from django.db import migrations + + +def forward(apps, schema_editor): + CommunityList = apps.get_model("community", "CommunityList") + # As of 2024-01-05, there are 570 personal CommunityLists with a user + # who has no associated Person. None of these has an EmailSubscription, + # so the lists are doing nothing and can be safely deleted. + personal_lists_no_person = CommunityList.objects.exclude( + user__isnull=True + ).filter( + user__person__isnull=True + ) + # Confirm the assumption that none of the lists to be deleted has an EmailSubscription + assert not personal_lists_no_person.filter(emailsubscription__isnull=False).exists() + personal_lists_no_person.delete() + + +class Migration(migrations.Migration): + dependencies = [ + ("community", "0003_track_rfcs"), + ] + + operations = [migrations.RunPython(forward)] diff --git a/ietf/community/migrations/0005_user_to_person.py b/ietf/community/migrations/0005_user_to_person.py new file mode 100644 index 00000000000..01d8950edb7 --- /dev/null +++ b/ietf/community/migrations/0005_user_to_person.py @@ -0,0 +1,54 @@ +# Generated by Django 4.2.2 on 2023-06-12 19:35 + +from django.conf import settings +from django.db import migrations +import django.db.models.deletion +import ietf.utils.models + + +def forward(apps, schema_editor): + CommunityList = apps.get_model('community', 'CommunityList') + for clist in CommunityList.objects.all(): + try: + clist.person = clist.user.person + except: + clist.person = None + clist.save() + +def reverse(apps, schema_editor): + CommunityList = apps.get_model('community', 'CommunityList') + for clist in CommunityList.objects.all(): + try: + clist.user = clist.person.user + except: + clist.user = None + clist.save() + +class Migration(migrations.Migration): + dependencies = [ + ("community", "0004_delete_useless_community_lists"), + ("person", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="communitylist", + name="person", + field=ietf.utils.models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="person.Person", + ), + ), + migrations.RunPython(forward, reverse), + migrations.RemoveField( + model_name="communitylist", + name="user", + field=ietf.utils.models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/ietf/community/models.py b/ietf/community/models.py index 9b2383f2114..6945918f9a4 100644 --- a/ietf/community/models.py +++ b/ietf/community/models.py @@ -1,25 +1,23 @@ # Copyright The IETF Trust 2012-2020, All Rights Reserved # -*- coding: utf-8 -*- - -from django.contrib.auth.models import User from django.db import models -from django.db.models import signals from django.urls import reverse as urlreverse -from ietf.doc.models import Document, DocEvent, State +from ietf.doc.models import Document, State from ietf.group.models import Group from ietf.person.models import Person, Email from ietf.utils.models import ForeignKey + class CommunityList(models.Model): - user = ForeignKey(User, blank=True, null=True) + person = ForeignKey(Person, blank=True, null=True) group = ForeignKey(Group, blank=True, null=True) added_docs = models.ManyToManyField(Document) def long_name(self): - if self.user: - return 'Personal I-D list of %s' % self.user.username + if self.person: + return 'Personal I-D list of %s' % self.person.plain_name() elif self.group: return 'I-D list for %s' % self.group.name else: @@ -30,8 +28,8 @@ def __str__(self): def get_absolute_url(self): import ietf.community.views - if self.user: - return urlreverse(ietf.community.views.view_list, kwargs={ 'username': self.user.username }) + if self.person: + return urlreverse(ietf.community.views.view_list, kwargs={ 'email_or_name': self.person.email() }) elif self.group: return urlreverse("ietf.group.views.group_documents", kwargs={ 'acronym': self.group.acronym }) return "" @@ -95,20 +93,3 @@ class EmailSubscription(models.Model): def __str__(self): return "%s to %s (%s changes)" % (self.email, self.community_list, self.notify_on) - - -def notify_events(sender, instance, **kwargs): - if not isinstance(instance, DocEvent): - return - - if instance.doc.type_id != 'draft': - return - - if getattr(instance, "skip_community_list_notification", False): - return - - from ietf.community.utils import notify_event_to_subscribers - notify_event_to_subscribers(instance) - - -signals.post_save.connect(notify_events) diff --git a/ietf/community/signals.py b/ietf/community/signals.py new file mode 100644 index 00000000000..20ee761129f --- /dev/null +++ b/ietf/community/signals.py @@ -0,0 +1,44 @@ +# Copyright The IETF Trust 2024, All Rights Reserved + +from django.conf import settings +from django.db import transaction +from django.db.models.signals import post_save +from django.dispatch import receiver + +from ietf.doc.models import DocEvent +from .tasks import notify_event_to_subscribers_task + + +def notify_of_event(event: DocEvent): + """Send subscriber notification emails for a 'draft'-related DocEvent + + If the event is attached to a draft of type 'doc', queues a task to send notification emails to + community list subscribers. No emails will be sent when SERVER_MODE is 'test'. + """ + if event.doc.type_id != "draft": + return + + if getattr(event, "skip_community_list_notification", False): + return + + # kludge alert: queuing a celery task in response to a signal can cause unexpected attempts to + # start a Celery task during tests. To prevent this, don't queue a celery task if we're running + # tests. + if settings.SERVER_MODE != "test": + # Wrap in on_commit in case a transaction is open + transaction.on_commit( + lambda: notify_event_to_subscribers_task.delay(event_id=event.pk) + ) + + +# dispatch_uid ensures only a single signal receiver binding is made +@receiver(post_save, dispatch_uid="notify_of_events_receiver_uid") +def notify_of_events_receiver(sender, instance, **kwargs): + """Call notify_of_event after saving a new DocEvent""" + if not isinstance(instance, DocEvent): + return + + if not kwargs.get("created", False): + return # only notify on creation + + notify_of_event(instance) diff --git a/ietf/community/tasks.py b/ietf/community/tasks.py new file mode 100644 index 00000000000..763a5964953 --- /dev/null +++ b/ietf/community/tasks.py @@ -0,0 +1,15 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +from celery import shared_task + +from ietf.doc.models import DocEvent +from ietf.utils.log import log + + +@shared_task +def notify_event_to_subscribers_task(event_id): + from .utils import notify_event_to_subscribers + event = DocEvent.objects.filter(pk=event_id).first() + if event is None: + log(f"Unable to send subscriber notifications because DocEvent {event_id} was not found") + else: + notify_event_to_subscribers(event) diff --git a/ietf/community/tests.py b/ietf/community/tests.py index 3dd86f70e36..04f1433d61a 100644 --- a/ietf/community/tests.py +++ b/ietf/community/tests.py @@ -1,60 +1,112 @@ -# Copyright The IETF Trust 2016-2020, All Rights Reserved +# Copyright The IETF Trust 2016-2023, All Rights Reserved # -*- coding: utf-8 -*- - +from unittest import mock from pyquery import PyQuery +from django.test.utils import override_settings from django.urls import reverse as urlreverse -from django.contrib.auth.models import User - -from django_webtest import WebTest +from lxml import etree -import debug # pyflakes:ignore +import debug # pyflakes:ignore from ietf.community.models import CommunityList, SearchRule, EmailSubscription -from ietf.community.utils import docs_matching_community_list_rule, community_list_rules_matching_doc -from ietf.community.utils import reset_name_contains_index_for_rule +from ietf.community.signals import notify_of_event +from ietf.community.utils import ( + docs_matching_community_list_rule, + community_list_rules_matching_doc, +) +from ietf.community.utils import ( + reset_name_contains_index_for_rule, + notify_event_to_subscribers, +) +from ietf.community.tasks import notify_event_to_subscribers_task import ietf.community.views from ietf.group.models import Group from ietf.group.utils import setup_default_community_list_for_group +from ietf.doc.factories import DocumentFactory from ietf.doc.models import State from ietf.doc.utils import add_state_change_event -from ietf.person.models import Person, Email -from ietf.utils.test_utils import login_testing_unauthorized -from ietf.utils.mail import outbox -from ietf.doc.factories import WgDraftFactory +from ietf.person.models import Person, Email, Alias +from ietf.utils.test_utils import TestCase, login_testing_unauthorized +from ietf.doc.factories import DocEventFactory, WgDraftFactory from ietf.group.factories import GroupFactory, RoleFactory -from ietf.person.factories import PersonFactory +from ietf.person.factories import PersonFactory, EmailFactory, AliasFactory + -class CommunityListTests(WebTest): +class CommunityListTests(TestCase): def test_rule_matching(self): - plain = PersonFactory(user__username='plain') - ad = Person.objects.get(user__username='ad') + plain = PersonFactory(user__username="plain") + ad = Person.objects.get(user__username="ad") draft = WgDraftFactory( - group__parent=Group.objects.get(acronym='farfut' ), + group__parent=Group.objects.get(acronym="farfut"), authors=[ad], ad=ad, shepherd=plain.email(), - states=[('draft-iesg','lc'),('draft','active')], + states=[("draft-iesg", "lc"), ("draft", "active")], ) - clist = CommunityList.objects.create(user=User.objects.get(username="plain")) + clist = CommunityList.objects.create(person=plain) - rule_group = SearchRule.objects.create(rule_type="group", group=draft.group, state=State.objects.get(type="draft", slug="active"), community_list=clist) - rule_group_rfc = SearchRule.objects.create(rule_type="group_rfc", group=draft.group, state=State.objects.get(type="draft", slug="rfc"), community_list=clist) - rule_area = SearchRule.objects.create(rule_type="area", group=draft.group.parent, state=State.objects.get(type="draft", slug="active"), community_list=clist) + rule_group = SearchRule.objects.create( + rule_type="group", + group=draft.group, + state=State.objects.get(type="draft", slug="active"), + community_list=clist, + ) + rule_group_rfc = SearchRule.objects.create( + rule_type="group_rfc", + group=draft.group, + state=State.objects.get(type="rfc", slug="published"), + community_list=clist, + ) + rule_area = SearchRule.objects.create( + rule_type="area", + group=draft.group.parent, + state=State.objects.get(type="draft", slug="active"), + community_list=clist, + ) - rule_state_iesg = SearchRule.objects.create(rule_type="state_iesg", state=State.objects.get(type="draft-iesg", slug="lc"), community_list=clist) + rule_state_iesg = SearchRule.objects.create( + rule_type="state_iesg", + state=State.objects.get(type="draft-iesg", slug="lc"), + community_list=clist, + ) - rule_author = SearchRule.objects.create(rule_type="author", state=State.objects.get(type="draft", slug="active"), person=Person.objects.filter(documentauthor__document=draft).first(), community_list=clist) + rule_author = SearchRule.objects.create( + rule_type="author", + state=State.objects.get(type="draft", slug="active"), + person=Person.objects.filter(documentauthor__document=draft).first(), + community_list=clist, + ) - rule_ad = SearchRule.objects.create(rule_type="ad", state=State.objects.get(type="draft", slug="active"), person=draft.ad, community_list=clist) + rule_ad = SearchRule.objects.create( + rule_type="ad", + state=State.objects.get(type="draft", slug="active"), + person=draft.ad, + community_list=clist, + ) - rule_shepherd = SearchRule.objects.create(rule_type="shepherd", state=State.objects.get(type="draft", slug="active"), person=draft.shepherd.person, community_list=clist) + rule_shepherd = SearchRule.objects.create( + rule_type="shepherd", + state=State.objects.get(type="draft", slug="active"), + person=draft.shepherd.person, + community_list=clist, + ) - rule_group_exp = SearchRule.objects.create(rule_type="group_exp", group=draft.group, state=State.objects.get(type="draft", slug="expired"), community_list=clist) + rule_group_exp = SearchRule.objects.create( + rule_type="group_exp", + group=draft.group, + state=State.objects.get(type="draft", slug="expired"), + community_list=clist, + ) - rule_name_contains = SearchRule.objects.create(rule_type="name_contains", state=State.objects.get(type="draft", slug="active"), text="draft-.*" + "-".join(draft.name.split("-")[2:]), community_list=clist) + rule_name_contains = SearchRule.objects.create( + rule_type="name_contains", + state=State.objects.get(type="draft", slug="active"), + text="draft-.*" + "-".join(draft.name.split("-")[2:]), + community_list=clist, + ) reset_name_contains_index_for_rule(rule_name_contains) # doc -> rules @@ -71,37 +123,71 @@ def test_rule_matching(self): # rule -> docs self.assertTrue(draft in list(docs_matching_community_list_rule(rule_group))) - self.assertTrue(draft not in list(docs_matching_community_list_rule(rule_group_rfc))) + self.assertTrue( + draft not in list(docs_matching_community_list_rule(rule_group_rfc)) + ) self.assertTrue(draft in list(docs_matching_community_list_rule(rule_area))) - self.assertTrue(draft in list(docs_matching_community_list_rule(rule_state_iesg))) + self.assertTrue( + draft in list(docs_matching_community_list_rule(rule_state_iesg)) + ) self.assertTrue(draft in list(docs_matching_community_list_rule(rule_author))) self.assertTrue(draft in list(docs_matching_community_list_rule(rule_ad))) self.assertTrue(draft in list(docs_matching_community_list_rule(rule_shepherd))) - self.assertTrue(draft in list(docs_matching_community_list_rule(rule_name_contains))) - self.assertTrue(draft not in list(docs_matching_community_list_rule(rule_group_exp))) + self.assertTrue( + draft in list(docs_matching_community_list_rule(rule_name_contains)) + ) + self.assertTrue( + draft not in list(docs_matching_community_list_rule(rule_group_exp)) + ) - draft.set_state(State.objects.get(type='draft', slug='expired')) + draft.set_state(State.objects.get(type="draft", slug="expired")) # doc -> rules matching_rules = list(community_list_rules_matching_doc(draft)) self.assertTrue(rule_group_exp in matching_rules) # rule -> docs - self.assertTrue(draft in list(docs_matching_community_list_rule(rule_group_exp))) + self.assertTrue( + draft in list(docs_matching_community_list_rule(rule_group_exp)) + ) - def test_view_list(self): - PersonFactory(user__username='plain') - draft = WgDraftFactory() + def test_view_list_duplicates(self): + person = PersonFactory( + name="John Q. Public", user__username="bazquux@example.com" + ) + PersonFactory(name="John Q. Public", user__username="foobar@example.com") - url = urlreverse(ietf.community.views.view_list, kwargs={ "username": "plain" }) + url = urlreverse( + ietf.community.views.view_list, + kwargs={"email_or_name": person.plain_name()}, + ) + r = self.client.get(url) + self.assertEqual(r.status_code, 404) + def complex_person(self, *args, **kwargs): + person = PersonFactory(*args, **kwargs) + EmailFactory(person=person) + AliasFactory(person=person) + return person + + def email_or_name_set(self, person): + return [e for e in Email.objects.filter(person=person)] + [ + a for a in Alias.objects.filter(person=person) + ] + + def do_view_list_test(self, person): + draft = WgDraftFactory() # without list - r = self.client.get(url) - self.assertEqual(r.status_code, 200) + for id in self.email_or_name_set(person): + url = urlreverse( + ietf.community.views.view_list, kwargs={"email_or_name": id} + ) + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") # with list - clist = CommunityList.objects.create(user=User.objects.get(username="plain")) - if not draft in clist.added_docs.all(): + clist = CommunityList.objects.create(person=person) + if draft not in clist.added_docs.all(): clist.added_docs.add(draft) SearchRule.objects.create( community_list=clist, @@ -109,86 +195,135 @@ def test_view_list(self): state=State.objects.get(type="draft", slug="active"), text="test", ) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - self.assertContains(r, draft.name) + for id in self.email_or_name_set(person): + url = urlreverse( + ietf.community.views.view_list, kwargs={"email_or_name": id} + ) + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + self.assertContains(r, draft.name) - def test_manage_personal_list(self): + def test_view_list(self): + person = self.complex_person(user__username="plain") + self.do_view_list_test(person) + + def test_view_list_without_active_email(self): + person = self.complex_person(user__username="plain") + person.email_set.update(active=False) + self.do_view_list_test(person) - PersonFactory(user__username='plain') - ad = Person.objects.get(user__username='ad') + def test_manage_personal_list(self): + person = self.complex_person(user__username="plain") + ad = Person.objects.get(user__username="ad") draft = WgDraftFactory(authors=[ad]) - url = urlreverse(ietf.community.views.manage_list, kwargs={ "username": "plain" }) + url = urlreverse( + ietf.community.views.manage_list, kwargs={"email_or_name": person.email()} + ) login_testing_unauthorized(self, "plain", url) - page = self.app.get(url, user='plain') - self.assertEqual(page.status_int, 200) - - # add document - self.assertIn('add_document', page.forms) - form = page.forms['add_document'] - form['documents'].options=[(draft.pk, True, draft.name)] - page = form.submit('action',value='add_documents') - self.assertEqual(page.status_int, 302) - clist = CommunityList.objects.get(user__username="plain") - self.assertTrue(clist.added_docs.filter(pk=draft.pk)) - page = page.follow() - - self.assertContains(page, draft.name) - - # remove document - self.assertIn('remove_document_%s' % draft.pk, page.forms) - form = page.forms['remove_document_%s' % draft.pk] - page = form.submit('action',value='remove_document') - self.assertEqual(page.status_int, 302) - clist = CommunityList.objects.get(user__username="plain") - self.assertTrue(not clist.added_docs.filter(pk=draft.pk)) - page = page.follow() - - # add rule - r = self.client.post(url, { - "action": "add_rule", - "rule_type": "author_rfc", - "author_rfc-person": Person.objects.filter(documentauthor__document=draft).first().pk, - "author_rfc-state": State.objects.get(type="draft", slug="rfc").pk, - }) - self.assertEqual(r.status_code, 302) - clist = CommunityList.objects.get(user__username="plain") - self.assertTrue(clist.searchrule_set.filter(rule_type="author_rfc")) - - # add name_contains rule - r = self.client.post(url, { - "action": "add_rule", - "rule_type": "name_contains", - "name_contains-text": "draft.*mars", - "name_contains-state": State.objects.get(type="draft", slug="active").pk, - }) - self.assertEqual(r.status_code, 302) - clist = CommunityList.objects.get(user__username="plain") - self.assertTrue(clist.searchrule_set.filter(rule_type="name_contains")) - - # rule shows up on GET - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - rule = clist.searchrule_set.filter(rule_type="author_rfc").first() - q = PyQuery(r.content) - self.assertEqual(len(q('#r%s' % rule.pk)), 1) - - # remove rule - r = self.client.post(url, { - "action": "remove_rule", - "rule": rule.pk, - }) - - clist = CommunityList.objects.get(user__username="plain") - self.assertTrue(not clist.searchrule_set.filter(rule_type="author_rfc")) + for id in self.email_or_name_set(person): + url = urlreverse( + ietf.community.views.manage_list, kwargs={"email_or_name": id} + ) + r = self.client.get(url, user="plain") + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + + # We can't call post() with follow=True because that 404's if + # the url contains unicode, because the django test client + # apparently re-encodes the already-encoded url. + def follow(r): + redirect_url = r.url or url + return self.client.get(redirect_url, user="plain") + + # add document + self.assertContains(r, "add_document") + r = self.client.post( + url, {"action": "add_documents", "documents": draft.pk} + ) + self.assertEqual(r.status_code, 302, msg=f"id='{id}', url='{url}'") + clist = CommunityList.objects.get(person__user__username="plain") + self.assertTrue(clist.added_docs.filter(pk=draft.pk)) + r = follow(r) + self.assertContains(r, draft.name, status_code=200) + + # remove document + self.assertContains(r, "remove_document_%s" % draft.pk) + r = self.client.post( + url, {"action": "remove_document", "document": draft.pk} + ) + self.assertEqual(r.status_code, 302, msg=f"id='{id}', url='{url}'") + clist = CommunityList.objects.get(person__user__username="plain") + self.assertTrue(not clist.added_docs.filter(pk=draft.pk)) + r = follow(r) + self.assertNotContains(r, draft.name, status_code=200) + + # add rule + r = self.client.post( + url, + { + "action": "add_rule", + "rule_type": "author_rfc", + "author_rfc-person": Person.objects.filter( + documentauthor__document=draft + ) + .first() + .pk, + "author_rfc-state": State.objects.get( + type="rfc", slug="published" + ).pk, + }, + ) + self.assertEqual(r.status_code, 302, msg=f"id='{id}', url='{url}'") + clist = CommunityList.objects.get(person__user__username="plain") + self.assertTrue(clist.searchrule_set.filter(rule_type="author_rfc")) + + # add name_contains rule + r = self.client.post( + url, + { + "action": "add_rule", + "rule_type": "name_contains", + "name_contains-text": "draft.*mars", + "name_contains-state": State.objects.get( + type="draft", slug="active" + ).pk, + }, + ) + self.assertEqual(r.status_code, 302, msg=f"id='{id}', url='{url}'") + clist = CommunityList.objects.get(person__user__username="plain") + self.assertTrue(clist.searchrule_set.filter(rule_type="name_contains")) + + # rule shows up on GET + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + rule = clist.searchrule_set.filter(rule_type="author_rfc").first() + q = PyQuery(r.content) + self.assertEqual(len(q("#r%s" % rule.pk)), 1) + + # remove rule + r = self.client.post( + url, + { + "action": "remove_rule", + "rule": rule.pk, + }, + ) + + clist = CommunityList.objects.get(person__user__username="plain") + self.assertTrue(not clist.searchrule_set.filter(rule_type="author_rfc")) def test_manage_group_list(self): - draft = WgDraftFactory(group__acronym='mars') - RoleFactory(group__acronym='mars',name_id='chair',person=PersonFactory(user__username='marschairman')) + draft = WgDraftFactory(group__acronym="mars") + RoleFactory( + group__acronym="mars", + name_id="chair", + person=PersonFactory(user__username="marschairman"), + ) - url = urlreverse(ietf.community.views.manage_list, kwargs={ "acronym": draft.group.acronym }) + url = urlreverse( + ietf.community.views.manage_list, kwargs={"acronym": draft.group.acronym} + ) setup_default_community_list_for_group(draft.group) login_testing_unauthorized(self, "marschairman", url) @@ -197,95 +332,132 @@ def test_manage_group_list(self): self.assertEqual(r.status_code, 200) # Verify GET also works with non-WG and RG groups - for gtype in ['area','program']: + for gtype in ["area", "program"]: g = GroupFactory.create(type_id=gtype) # make sure the group's features have been initialized to improve coverage - _ = g.features # pyflakes:ignore + _ = g.features # pyflakes:ignore p = PersonFactory() - g.role_set.create(name_id={'area':'ad','program':'lead'}[gtype],person=p, email=p.email()) - url = urlreverse(ietf.community.views.manage_list, kwargs={ "acronym": g.acronym }) + g.role_set.create( + name_id={"area": "ad", "program": "lead"}[gtype], + person=p, + email=p.email(), + ) + url = urlreverse( + ietf.community.views.manage_list, kwargs={"acronym": g.acronym} + ) setup_default_community_list_for_group(g) - self.client.login(username=p.user.username,password=p.user.username+"+password") + self.client.login( + username=p.user.username, password=p.user.username + "+password" + ) r = self.client.get(url) self.assertEqual(r.status_code, 200) def test_track_untrack_document(self): - PersonFactory(user__username='plain') + person = self.complex_person(user__username="plain") draft = WgDraftFactory() - url = urlreverse(ietf.community.views.track_document, kwargs={ "username": "plain", "name": draft.name }) + url = urlreverse( + ietf.community.views.track_document, + kwargs={"email_or_name": person.email(), "name": draft.name}, + ) login_testing_unauthorized(self, "plain", url) - # track - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - - r = self.client.post(url) - self.assertEqual(r.status_code, 302) - clist = CommunityList.objects.get(user__username="plain") - self.assertEqual(list(clist.added_docs.all()), [draft]) + for id in self.email_or_name_set(person): + url = urlreverse( + ietf.community.views.track_document, + kwargs={"email_or_name": id, "name": draft.name}, + ) - # untrack - url = urlreverse(ietf.community.views.untrack_document, kwargs={ "username": "plain", "name": draft.name }) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) + # track + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + + r = self.client.post(url) + self.assertEqual(r.status_code, 302, msg=f"id='{id}', url='{url}'") + clist = CommunityList.objects.get(person__user__username="plain") + self.assertEqual(list(clist.added_docs.all()), [draft]) + + # untrack + url = urlreverse( + ietf.community.views.untrack_document, + kwargs={"email_or_name": id, "name": draft.name}, + ) + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") - r = self.client.post(url) - self.assertEqual(r.status_code, 302) - clist = CommunityList.objects.get(user__username="plain") - self.assertEqual(list(clist.added_docs.all()), []) + r = self.client.post(url) + self.assertEqual(r.status_code, 302, msg=f"id='{id}', url='{url}'") + clist = CommunityList.objects.get(person__user__username="plain") + self.assertEqual(list(clist.added_docs.all()), []) def test_track_untrack_document_through_ajax(self): - PersonFactory(user__username='plain') + person = self.complex_person(user__username="plain") draft = WgDraftFactory() - url = urlreverse(ietf.community.views.track_document, kwargs={ "username": "plain", "name": draft.name }) + url = urlreverse( + ietf.community.views.track_document, + kwargs={"email_or_name": person.email(), "name": draft.name}, + ) login_testing_unauthorized(self, "plain", url) - # track - r = self.client.post(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(r.status_code, 200) - self.assertEqual(r.json()["success"], True) - clist = CommunityList.objects.get(user__username="plain") - self.assertEqual(list(clist.added_docs.all()), [draft]) - - # untrack - url = urlreverse(ietf.community.views.untrack_document, kwargs={ "username": "plain", "name": draft.name }) - r = self.client.post(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(r.status_code, 200) - self.assertEqual(r.json()["success"], True) - clist = CommunityList.objects.get(user__username="plain") - self.assertEqual(list(clist.added_docs.all()), []) + for id in self.email_or_name_set(person): + url = urlreverse( + ietf.community.views.track_document, + kwargs={"email_or_name": id, "name": draft.name}, + ) + + # track + r = self.client.post(url, HTTP_X_REQUESTED_WITH="XMLHttpRequest") + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + self.assertEqual(r.json()["success"], True) + clist = CommunityList.objects.get(person__user__username="plain") + self.assertEqual(list(clist.added_docs.all()), [draft]) + + # untrack + url = urlreverse( + ietf.community.views.untrack_document, + kwargs={"email_or_name": id, "name": draft.name}, + ) + r = self.client.post(url, HTTP_X_REQUESTED_WITH="XMLHttpRequest") + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + self.assertEqual(r.json()["success"], True) + clist = CommunityList.objects.get(person__user__username="plain") + self.assertEqual(list(clist.added_docs.all()), []) def test_csv(self): - PersonFactory(user__username='plain') + person = self.complex_person(user__username="plain") draft = WgDraftFactory() - url = urlreverse(ietf.community.views.export_to_csv, kwargs={ "username": "plain" }) + for id in self.email_or_name_set(person): + url = urlreverse( + ietf.community.views.export_to_csv, kwargs={"email_or_name": id} + ) - # without list - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - - # with list - clist = CommunityList.objects.create(user=User.objects.get(username="plain")) - if not draft in clist.added_docs.all(): - clist.added_docs.add(draft) - SearchRule.objects.create( - community_list=clist, - rule_type="name_contains", - state=State.objects.get(type="draft", slug="active"), - text="test", - ) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - # this is a simple-minded test, we don't actually check the fields - self.assertContains(r, draft.name) + # without list + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + + # with list + clist = CommunityList.objects.create(person=person) + if draft not in clist.added_docs.all(): + clist.added_docs.add(draft) + SearchRule.objects.create( + community_list=clist, + rule_type="name_contains", + state=State.objects.get(type="draft", slug="active"), + text="test", + ) + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + # this is a simple-minded test, we don't actually check the fields + self.assertContains(r, draft.name) def test_csv_for_group(self): draft = WgDraftFactory() - url = urlreverse(ietf.community.views.export_to_csv, kwargs={ "acronym": draft.group.acronym }) + url = urlreverse( + ietf.community.views.export_to_csv, kwargs={"acronym": draft.group.acronym} + ) setup_default_community_list_for_group(draft.group) @@ -294,60 +466,85 @@ def test_csv_for_group(self): self.assertEqual(r.status_code, 200) def test_feed(self): - PersonFactory(user__username='plain') + person = self.complex_person(user__username="plain") draft = WgDraftFactory() - url = urlreverse(ietf.community.views.feed, kwargs={ "username": "plain" }) - - # without list - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - - # with list - clist = CommunityList.objects.create(user=User.objects.get(username="plain")) - if not draft in clist.added_docs.all(): - clist.added_docs.add(draft) - SearchRule.objects.create( - community_list=clist, - rule_type="name_contains", - state=State.objects.get(type="draft", slug="active"), - text="test", - ) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - self.assertContains(r, draft.name) + for id in self.email_or_name_set(person): + url = urlreverse(ietf.community.views.feed, kwargs={"email_or_name": id}) - # only significant - r = self.client.get(url + "?significant=1") - self.assertEqual(r.status_code, 200) - self.assertNotContains(r, '') + # without list + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + + # with list + clist = CommunityList.objects.create(person=person) + if draft not in clist.added_docs.all(): + clist.added_docs.add(draft) + SearchRule.objects.create( + community_list=clist, + rule_type="name_contains", + state=State.objects.get(type="draft", slug="active"), + text="test", + ) + r = self.client.get(url) + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + self.assertContains(r, draft.name) + + # test atom xml + xml = etree.fromstring(r.content) + ns = {"atom": "http://www.w3.org/2005/Atom"} + updated = xml.xpath("/atom:feed/atom:updated", namespaces=ns)[0].text + entries = xml.xpath("/atom:feed/atom:entry", namespaces=ns) + self.assertIn("+00:00", updated) # RFC 3339 compatible UTC TZ + for entry in entries: + updated = entry.xpath("atom:updated", namespaces=ns)[0].text + published = entry.xpath("atom:published", namespaces=ns)[0].text + entry_id = entry.xpath("atom:id", namespaces=ns)[0].text + self.assertIn("+00:00", updated) + self.assertIn("+00:00", published) + self.assertIn( + "urn:datatracker-ietf-org:event:", entry_id + ) # atom:entry:id must be a valid URN + + # only significant + r = self.client.get(url + "?significant=1") + self.assertEqual(r.status_code, 200, msg=f"id='{id}', url='{url}'") + self.assertNotContains(r, "") def test_feed_for_group(self): draft = WgDraftFactory() - url = urlreverse(ietf.community.views.feed, kwargs={ "acronym": draft.group.acronym }) + url = urlreverse( + ietf.community.views.feed, kwargs={"acronym": draft.group.acronym} + ) setup_default_community_list_for_group(draft.group) # test GET, rest is tested with personal list r = self.client.get(url) self.assertEqual(r.status_code, 200) - + def test_subscription(self): - PersonFactory(user__username='plain') + person = self.complex_person(user__username="plain") draft = WgDraftFactory() - url = urlreverse(ietf.community.views.subscription, kwargs={ "username": "plain" }) - + url = urlreverse( + ietf.community.views.subscription, kwargs={"email_or_name": person.email()} + ) login_testing_unauthorized(self, "plain", url) - # subscription without list - r = self.client.get(url) - self.assertEqual(r.status_code, 404) + for id in self.email_or_name_set(person): + url = urlreverse( + ietf.community.views.subscription, kwargs={"email_or_name": id} + ) + + # subscription without list + r = self.client.get(url) + self.assertEqual(r.status_code, 404, msg=f"id='{id}', url='{url}'") # subscription with list - clist = CommunityList.objects.create(user=User.objects.get(username="plain")) - if not draft in clist.added_docs.all(): + clist = CommunityList.objects.create(person=person) + if draft not in clist.added_docs.all(): clist.added_docs.add(draft) SearchRule.objects.create( community_list=clist, @@ -355,28 +552,51 @@ def test_subscription(self): state=State.objects.get(type="draft", slug="active"), text="test", ) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - # subscribe - email = Email.objects.filter(person__user__username="plain").first() - r = self.client.post(url, { "email": email.pk, "notify_on": "significant", "action": "subscribe" }) - self.assertEqual(r.status_code, 302) + for email in Email.objects.filter(person=person): + url = urlreverse( + ietf.community.views.subscription, kwargs={"email_or_name": email} + ) - subscription = EmailSubscription.objects.filter(community_list=clist, email=email, notify_on="significant").first() - - self.assertTrue(subscription) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) - # delete subscription - r = self.client.post(url, { "subscription_id": subscription.pk, "action": "unsubscribe" }) - self.assertEqual(r.status_code, 302) - self.assertEqual(EmailSubscription.objects.filter(community_list=clist, email=email, notify_on="significant").count(), 0) + # subscribe + r = self.client.post( + url, + {"email": email.pk, "notify_on": "significant", "action": "subscribe"}, + ) + self.assertEqual(r.status_code, 302) + + subscription = EmailSubscription.objects.filter( + community_list=clist, email=email, notify_on="significant" + ).first() + + self.assertTrue(subscription) + + # delete subscription + r = self.client.post( + url, {"subscription_id": subscription.pk, "action": "unsubscribe"} + ) + self.assertEqual(r.status_code, 302) + self.assertEqual( + EmailSubscription.objects.filter( + community_list=clist, email=email, notify_on="significant" + ).count(), + 0, + ) def test_subscription_for_group(self): - draft = WgDraftFactory(group__acronym='mars') - RoleFactory(group__acronym='mars',name_id='chair',person=PersonFactory(user__username='marschairman')) + draft = WgDraftFactory(group__acronym="mars") + RoleFactory( + group__acronym="mars", + name_id="chair", + person=PersonFactory(user__username="marschairman"), + ) - url = urlreverse(ietf.community.views.subscription, kwargs={ "acronym": draft.group.acronym }) + url = urlreverse( + ietf.community.views.subscription, kwargs={"acronym": draft.group.acronym} + ) setup_default_community_list_for_group(draft.group) @@ -385,27 +605,136 @@ def test_subscription_for_group(self): # test GET, rest is tested with personal list r = self.client.get(url) self.assertEqual(r.status_code, 200) - - def test_notification(self): - PersonFactory(user__username='plain') + + @mock.patch("ietf.community.signals.notify_of_event") + def test_notification_signal_receiver(self, mock_notify_of_event): + """Saving a newly created DocEvent should notify subscribers + + This implicitly tests that notify_of_event_receiver is hooked up to the post_save signal. + """ + # Arbitrary model that's not a DocEvent + person = PersonFactory.build() # builds but does not save... + mock_notify_of_event.reset_mock() # clear any calls that resulted from the factories + person.save() + self.assertFalse(mock_notify_of_event.called) + + # build a DocEvent that is not yet persisted + doc = DocumentFactory() + event = DocEventFactory.build(by=person, doc=doc) # builds but does not save... + mock_notify_of_event.reset_mock() # clear any calls that resulted from the factories + event.save() + self.assertEqual( + mock_notify_of_event.call_count, + 1, + "notify_task should be run on creation of DocEvent", + ) + self.assertEqual(mock_notify_of_event.call_args, mock.call(event)) + + # save the existing DocEvent and see that no notification is sent + mock_notify_of_event.reset_mock() + event.save() + self.assertFalse( + mock_notify_of_event.called, + "notify_task should not be run save of on existing DocEvent", + ) + + # Mock out the on_commit call so we can tell whether the task was actually queued + @mock.patch("ietf.submit.views.transaction.on_commit", side_effect=lambda x: x()) + @mock.patch("ietf.community.signals.notify_event_to_subscribers_task") + def test_notify_of_event(self, mock_notify_task, mock_on_commit): + """The community notification task should be called as intended""" + person = PersonFactory() # builds but does not save... + doc = DocumentFactory() + event = DocEventFactory(by=person, doc=doc) + # be careful overriding SERVER_MODE - we do it here because the method + # under test does not make this call when in "test" mode + with override_settings(SERVER_MODE="not-test"): + notify_of_event(event) + self.assertTrue( + mock_notify_task.delay.called, + "notify_task should run for a DocEvent on a draft", + ) + mock_notify_task.reset_mock() + + event.skip_community_list_notification = True + # be careful overriding SERVER_MODE - we do it here because the method + # under test does not make this call when in "test" mode + with override_settings(SERVER_MODE="not-test"): + notify_of_event(event) + self.assertFalse( + mock_notify_task.delay.called, + "notify_task should not run when skip_community_list_notification is set", + ) + + event = DocEventFactory.build(by=person, doc=DocumentFactory(type_id="rfc")) + # be careful overriding SERVER_MODE - we do it here because the method + # under test does not make this call when in "test" mode + with override_settings(SERVER_MODE="not-test"): + notify_of_event(event) + self.assertFalse( + mock_notify_task.delay.called, + "notify_task should not run on a document with type 'rfc'", + ) + + @mock.patch("ietf.utils.mail.send_mail_text") + def test_notify_event_to_subscribers(self, mock_send_mail_text): + person = PersonFactory(user__username="plain") draft = WgDraftFactory() - clist = CommunityList.objects.create(user=User.objects.get(username="plain")) - if not draft in clist.added_docs.all(): + clist = CommunityList.objects.create(person=person) + if draft not in clist.added_docs.all(): clist.added_docs.add(draft) - EmailSubscription.objects.create(community_list=clist, email=Email.objects.filter(person__user__username="plain").first(), notify_on="significant") + sub_to_significant = EmailSubscription.objects.create( + community_list=clist, + email=Email.objects.filter(person__user__username="plain").first(), + notify_on="significant", + ) + sub_to_all = EmailSubscription.objects.create( + community_list=clist, + email=Email.objects.filter(person__user__username="plain").first(), + notify_on="all", + ) - mailbox_before = len(outbox) active_state = State.objects.get(type="draft", slug="active") system = Person.objects.get(name="(System)") - add_state_change_event(draft, system, None, active_state) - self.assertEqual(len(outbox), mailbox_before) + event = add_state_change_event(draft, system, None, active_state) + notify_event_to_subscribers(event) + self.assertEqual(mock_send_mail_text.call_count, 1) + address = mock_send_mail_text.call_args[0][1] + subject = mock_send_mail_text.call_args[0][3] + content = mock_send_mail_text.call_args[0][4] + self.assertEqual(address, sub_to_all.email.address) + self.assertIn(draft.name, subject) + self.assertIn(clist.long_name(), content) - mailbox_before = len(outbox) rfc_state = State.objects.get(type="draft", slug="rfc") - add_state_change_event(draft, system, active_state, rfc_state) - self.assertEqual(len(outbox), mailbox_before + 1) - self.assertTrue(draft.name in outbox[-1]["Subject"]) - - \ No newline at end of file + event = add_state_change_event(draft, system, active_state, rfc_state) + mock_send_mail_text.reset_mock() + notify_event_to_subscribers(event) + self.assertEqual(mock_send_mail_text.call_count, 2) + addresses = [ + call_args[0][1] for call_args in mock_send_mail_text.call_args_list + ] + subjects = {call_args[0][3] for call_args in mock_send_mail_text.call_args_list} + contents = {call_args[0][4] for call_args in mock_send_mail_text.call_args_list} + self.assertCountEqual( + addresses, + [sub_to_significant.email.address, sub_to_all.email.address], + ) + self.assertEqual(len(subjects), 1) + self.assertIn(draft.name, subjects.pop()) + self.assertEqual(len(contents), 1) + self.assertIn(clist.long_name(), contents.pop()) + + @mock.patch("ietf.community.utils.notify_event_to_subscribers") + def test_notify_event_to_subscribers_task(self, mock_notify): + d = DocEventFactory() + notify_event_to_subscribers_task(event_id=d.pk) + self.assertEqual(mock_notify.call_count, 1) + self.assertEqual(mock_notify.call_args, mock.call(d)) + mock_notify.reset_mock() + + d.delete() + notify_event_to_subscribers_task(event_id=d.pk) + self.assertFalse(mock_notify.called) diff --git a/ietf/community/urls.py b/ietf/community/urls.py index f80547ffad1..3ab132f2dca 100644 --- a/ietf/community/urls.py +++ b/ietf/community/urls.py @@ -4,11 +4,11 @@ from ietf.utils.urls import url urlpatterns = [ - url(r'^personal/(?P[^/]+)/$', views.view_list), - url(r'^personal/(?P[^/]+)/manage/$', views.manage_list), - url(r'^personal/(?P[^/]+)/trackdocument/(?P[^/]+)/$', views.track_document), - url(r'^personal/(?P[^/]+)/untrackdocument/(?P[^/]+)/$', views.untrack_document), - url(r'^personal/(?P[^/]+)/csv/$', views.export_to_csv), - url(r'^personal/(?P[^/]+)/feed/$', views.feed), - url(r'^personal/(?P[^/]+)/subscription/$', views.subscription), + url(r'^personal/(?P[^/]+)/$', views.view_list), + url(r'^personal/(?P[^/]+)/manage/$', views.manage_list), + url(r'^personal/(?P[^/]+)/trackdocument/(?P[^/]+)/$', views.track_document), + url(r'^personal/(?P[^/]+)/untrackdocument/(?P[^/]+)/$', views.untrack_document), + url(r'^personal/(?P[^/]+)/csv/$', views.export_to_csv), + url(r'^personal/(?P[^/]+)/feed/$', views.feed), + url(r'^personal/(?P[^/]+)/subscription/$', views.subscription), ] diff --git a/ietf/community/utils.py b/ietf/community/utils.py index 8130954b924..f23e8d26abd 100644 --- a/ietf/community/utils.py +++ b/ietf/community/utils.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2016-2020, All Rights Reserved +# Copyright The IETF Trust 2016-2023, All Rights Reserved # -*- coding: utf-8 -*- @@ -11,11 +11,9 @@ from ietf.community.models import CommunityList, EmailSubscription, SearchRule from ietf.doc.models import Document, State -from ietf.group.models import Role, Group +from ietf.group.models import Role from ietf.person.models import Person from ietf.ietfauth.utils import has_role -from django.contrib.auth.models import User -from django.shortcuts import get_object_or_404 from ietf.utils.mail import send_mail @@ -29,24 +27,12 @@ def states_of_significant_change(): Q(type="draft", slug__in=['rfc', 'dead']) ) -def lookup_community_list(username=None, acronym=None): - assert username or acronym - - if acronym: - group = get_object_or_404(Group, acronym=acronym) - clist = CommunityList.objects.filter(group=group).first() or CommunityList(group=group) - else: - user = get_object_or_404(User, username__iexact=username) - clist = CommunityList.objects.filter(user=user).first() or CommunityList(user=user) - - return clist - def can_manage_community_list(user, clist): if not user or not user.is_authenticated: return False - if clist.user: - return user == clist.user + if clist.person: + return user == clist.person.user elif clist.group: if has_role(user, 'Secretariat'): return True @@ -60,7 +46,7 @@ def reset_name_contains_index_for_rule(rule): if not rule.rule_type == "name_contains": return - rule.name_contains_index.set(Document.objects.filter(docalias__name__regex=rule.text)) + rule.name_contains_index.set(Document.objects.filter(name__regex=rule.text)) def update_name_contains_indexes_with_new_doc(doc): for r in SearchRule.objects.filter(rule_type="name_contains"): @@ -71,71 +57,104 @@ def update_name_contains_indexes_with_new_doc(doc): if re.search(r.text, doc.name) and not doc in r.name_contains_index.all(): r.name_contains_index.add(doc) + def docs_matching_community_list_rule(rule): docs = Document.objects.all() + + if rule.rule_type.endswith("_rfc"): + docs = docs.filter(type_id="rfc") # rule.state is ignored for RFCs + else: + docs = docs.filter(type_id="draft", states=rule.state) + if rule.rule_type in ['group', 'area', 'group_rfc', 'area_rfc']: - return docs.filter(Q(group=rule.group_id) | Q(group__parent=rule.group_id), states=rule.state) + return docs.filter(Q(group=rule.group_id) | Q(group__parent=rule.group_id)) elif rule.rule_type in ['group_exp']: - return docs.filter(group=rule.group_id, states=rule.state) + return docs.filter(group=rule.group_id) elif rule.rule_type.startswith("state_"): - return docs.filter(states=rule.state) + return docs elif rule.rule_type in ["author", "author_rfc"]: - return docs.filter(states=rule.state, documentauthor__person=rule.person) + return docs.filter(documentauthor__person=rule.person) elif rule.rule_type == "ad": - return docs.filter(states=rule.state, ad=rule.person) + return docs.filter(ad=rule.person) elif rule.rule_type == "shepherd": - return docs.filter(states=rule.state, shepherd__person=rule.person) + return docs.filter(shepherd__person=rule.person) elif rule.rule_type == "name_contains": - return docs.filter(states=rule.state, searchrule=rule) + return docs.filter(searchrule=rule) raise NotImplementedError -def community_list_rules_matching_doc(doc): - states = list(doc.states.values_list("pk", flat=True)) +def community_list_rules_matching_doc(doc): rules = SearchRule.objects.none() + if doc.type_id not in ["draft", "rfc"]: + return rules # none + states = list(doc.states.values_list("pk", flat=True)) + # group and area rules if doc.group_id: groups = [doc.group_id] if doc.group.parent_id: groups.append(doc.group.parent_id) + rules_to_add = SearchRule.objects.filter(group__in=groups) + if doc.type_id == "rfc": + rules_to_add = rules_to_add.filter(rule_type__in=["group_rfc", "area_rfc"]) + else: + rules_to_add = rules_to_add.filter( + rule_type__in=["group", "area", "group_exp"], + state__in=states, + ) + rules |= rules_to_add + + # state rules (only relevant for I-Ds) + if doc.type_id == "draft": rules |= SearchRule.objects.filter( - rule_type__in=['group', 'area', 'group_rfc', 'area_rfc', 'group_exp'], + rule_type__in=[ + "state_iab", + "state_iana", + "state_iesg", + "state_irtf", + "state_ise", + "state_rfceditor", + "state_ietf", + ], state__in=states, - group__in=groups ) - rules |= SearchRule.objects.filter( - rule_type__in=['state_iab', 'state_iana', 'state_iesg', 'state_irtf', 'state_ise', 'state_rfceditor', 'state_ietf'], - state__in=states, - ) - - rules |= SearchRule.objects.filter( - rule_type__in=["author", "author_rfc"], - state__in=states, - person__in=list(Person.objects.filter(documentauthor__document=doc)), - ) - - if doc.ad_id: + # author rules + if doc.type_id == "rfc": + rules |= SearchRule.objects.filter( + rule_type="author_rfc", + person__in=list(Person.objects.filter(documentauthor__document=doc)), + ) + else: rules |= SearchRule.objects.filter( - rule_type="ad", + rule_type="author", state__in=states, - person=doc.ad_id, + person__in=list(Person.objects.filter(documentauthor__document=doc)), ) - if doc.shepherd_id: + # Other draft-only rules rules + if doc.type_id == "draft": + if doc.ad_id: + rules |= SearchRule.objects.filter( + rule_type="ad", + state__in=states, + person=doc.ad_id, + ) + + if doc.shepherd_id: + rules |= SearchRule.objects.filter( + rule_type="shepherd", + state__in=states, + person__email=doc.shepherd_id, + ) + rules |= SearchRule.objects.filter( - rule_type="shepherd", + rule_type="name_contains", state__in=states, - person__email=doc.shepherd_id, + name_contains_index=doc, # search our materialized index to avoid full scan ) - rules |= SearchRule.objects.filter( - rule_type="name_contains", - state__in=states, - name_contains_index=doc, # search our materialized index to avoid full scan - ) - return rules @@ -146,7 +165,11 @@ def docs_tracked_by_community_list(clist): # in theory, we could use an OR query, but databases seem to have # trouble with OR queries and complicated joins so do the OR'ing # manually - doc_ids = set(clist.added_docs.values_list("pk", flat=True)) + doc_ids = set() + for doc in clist.added_docs.all(): + doc_ids.add(doc.pk) + doc_ids.update(rfc.pk for rfc in doc.related_that_doc("became_rfc")) + for rule in clist.searchrule_set.all(): doc_ids = doc_ids | set(docs_matching_community_list_rule(rule).values_list("pk", flat=True)) diff --git a/ietf/community/views.py b/ietf/community/views.py index b0646424a3c..08b1c24fe58 100644 --- a/ietf/community/views.py +++ b/ietf/community/views.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2012-2020, All Rights Reserved +# Copyright The IETF Trust 2012-2023, All Rights Reserved # -*- coding: utf-8 -*- @@ -13,60 +13,119 @@ from django.utils import timezone from django.utils.html import strip_tags -import debug # pyflakes:ignore - -from ietf.community.models import SearchRule, EmailSubscription -from ietf.community.forms import SearchRuleTypeForm, SearchRuleForm, AddDocumentsForm, SubscriptionForm -from ietf.community.utils import lookup_community_list, can_manage_community_list -from ietf.community.utils import docs_tracked_by_community_list, docs_matching_community_list_rule -from ietf.community.utils import states_of_significant_change, reset_name_contains_index_for_rule +import debug # pyflakes:ignore + +from ietf.community.models import CommunityList, EmailSubscription, SearchRule +from ietf.community.forms import ( + SearchRuleTypeForm, + SearchRuleForm, + AddDocumentsForm, + SubscriptionForm, +) +from ietf.community.utils import can_manage_community_list +from ietf.community.utils import ( + docs_tracked_by_community_list, + docs_matching_community_list_rule, +) +from ietf.community.utils import ( + states_of_significant_change, + reset_name_contains_index_for_rule, +) +from ietf.group.models import Group from ietf.doc.models import DocEvent, Document from ietf.doc.utils_search import prepare_document_table +from ietf.person.utils import lookup_persons +from ietf.utils.decorators import ignore_view_kwargs +from ietf.utils.http import is_ajax from ietf.utils.response import permission_denied -def view_list(request, username=None): - clist = lookup_community_list(username) +def lookup_community_list(request, email_or_name=None, acronym=None): + """Finds a CommunityList for a person or group + + Instantiates an unsaved CommunityList if one is not found. + + If the person or group cannot be found and uniquely identified, raises an Http404 exception + """ + assert email_or_name or acronym + + if acronym: + group = get_object_or_404(Group, acronym=acronym) + clist = CommunityList.objects.filter(group=group).first() or CommunityList( + group=group + ) + else: + persons = lookup_persons(email_or_name) + if len(persons) > 1: + if hasattr(request.user, "person") and request.user.person in persons: + person = request.user.person + else: + raise Http404( + f"Unable to identify the CommunityList for {email_or_name}" + ) + else: + person = persons[0] + clist = CommunityList.objects.filter(person=person).first() or CommunityList( + person=person + ) + return clist + + +def view_list(request, email_or_name=None): + clist = lookup_community_list(request, email_or_name) # may raise Http404 docs = docs_tracked_by_community_list(clist) docs, meta = prepare_document_table(request, docs, request.GET) - subscribed = request.user.is_authenticated and EmailSubscription.objects.filter(community_list=clist, email__person__user=request.user) + subscribed = request.user.is_authenticated and ( + EmailSubscription.objects.none() + if clist.pk is None + else EmailSubscription.objects.filter( + community_list=clist, email__person__user=request.user + ) + ) + + return render( + request, + "community/view_list.html", + { + "clist": clist, + "docs": docs, + "meta": meta, + "can_manage_list": can_manage_community_list(request.user, clist), + "subscribed": subscribed, + "email_or_name": email_or_name, + }, + ) - return render(request, 'community/view_list.html', { - 'clist': clist, - 'docs': docs, - 'meta': meta, - 'can_manage_list': can_manage_community_list(request.user, clist), - 'subscribed': subscribed, - }) @login_required -def manage_list(request, username=None, acronym=None, group_type=None): +@ignore_view_kwargs("group_type") +def manage_list(request, email_or_name=None, acronym=None): # we need to be a bit careful because clist may not exist in the # database so we can't call related stuff on it yet - clist = lookup_community_list(username, acronym) + clist = lookup_community_list(request, email_or_name, acronym) # may raise Http404 if not can_manage_community_list(request.user, clist): permission_denied(request, "You do not have permission to access this view") - action = request.POST.get('action') + action = request.POST.get("action") - if request.method == 'POST' and action == 'add_documents': + if request.method == "POST" and action == "add_documents": add_doc_form = AddDocumentsForm(request.POST) if add_doc_form.is_valid(): if clist.pk is None: clist.save() - for d in add_doc_form.cleaned_data['documents']: - if not d in clist.added_docs.all(): + for d in add_doc_form.cleaned_data["documents"]: + if d not in clist.added_docs.all(): clist.added_docs.add(d) return HttpResponseRedirect("") else: add_doc_form = AddDocumentsForm() - if request.method == 'POST' and action == 'remove_document': - document_id = request.POST.get('document') + if request.method == "POST" and action == "remove_document": + document_id = request.POST.get("document") if clist.pk is not None and document_id: document = get_object_or_404(clist.added_docs, id=document_id) clist.added_docs.remove(document) @@ -74,30 +133,29 @@ def manage_list(request, username=None, acronym=None, group_type=None): return HttpResponseRedirect("") rule_form = None - if request.method == 'POST' and action == 'add_rule': + if request.method == "POST" and action == "add_rule": rule_type_form = SearchRuleTypeForm(request.POST) if rule_type_form.is_valid(): - rule_type = rule_type_form.cleaned_data['rule_type'] - - if rule_type: - rule_form = SearchRuleForm(clist, rule_type, request.POST) - if rule_form.is_valid(): - if clist.pk is None: - clist.save() - - rule = rule_form.save(commit=False) - rule.community_list = clist - rule.rule_type = rule_type - rule.save() - if rule.rule_type == "name_contains": - reset_name_contains_index_for_rule(rule) + rule_type = rule_type_form.cleaned_data["rule_type"] + if rule_type: + rule_form = SearchRuleForm(clist, rule_type, request.POST) + if rule_form.is_valid(): + if clist.pk is None: + clist.save() + + rule = rule_form.save(commit=False) + rule.community_list = clist + rule.rule_type = rule_type + rule.save() + if rule.rule_type == "name_contains": + reset_name_contains_index_for_rule(rule) return HttpResponseRedirect("") else: rule_type_form = SearchRuleTypeForm() - if request.method == 'POST' and action == 'remove_rule': - rule_pk = request.POST.get('rule') + if request.method == "POST" and action == "remove_rule": + rule_pk = request.POST.get("rule") if clist.pk is not None and rule_pk: rule = get_object_or_404(SearchRule, pk=rule_pk, community_list=clist) rule.delete() @@ -108,53 +166,74 @@ def manage_list(request, username=None, acronym=None, group_type=None): for r in rules: r.matching_documents_count = docs_matching_community_list_rule(r).count() - empty_rule_forms = { rule_type: SearchRuleForm(clist, rule_type) for rule_type, _ in SearchRule.RULE_TYPES } + empty_rule_forms = { + rule_type: SearchRuleForm(clist, rule_type) + for rule_type, _ in SearchRule.RULE_TYPES + } total_count = docs_tracked_by_community_list(clist).count() - all_forms = [f for f in [rule_type_form, rule_form, add_doc_form, *empty_rule_forms.values()] - if f is not None] - return render(request, 'community/manage_list.html', { - 'clist': clist, - 'rules': rules, - 'individually_added': clist.added_docs.all() if clist.pk is not None else [], - 'rule_type_form': rule_type_form, - 'rule_form': rule_form, - 'empty_rule_forms': empty_rule_forms, - 'total_count': total_count, - 'add_doc_form': add_doc_form, - 'all_forms': all_forms, - }) + all_forms = [ + f + for f in [rule_type_form, rule_form, add_doc_form, *empty_rule_forms.values()] + if f is not None + ] + return render( + request, + "community/manage_list.html", + { + "clist": clist, + "rules": rules, + "individually_added": ( + clist.added_docs.all() if clist.pk is not None else [] + ), + "rule_type_form": rule_type_form, + "rule_form": rule_form, + "empty_rule_forms": empty_rule_forms, + "total_count": total_count, + "add_doc_form": add_doc_form, + "all_forms": all_forms, + }, + ) @login_required -def track_document(request, name, username=None, acronym=None): - doc = get_object_or_404(Document, docalias__name=name) +def track_document(request, name, email_or_name=None, acronym=None): + doc = get_object_or_404(Document, name=name) if request.method == "POST": - clist = lookup_community_list(username, acronym) + clist = lookup_community_list( + request, email_or_name, acronym + ) # may raise Http404 if not can_manage_community_list(request.user, clist): permission_denied(request, "You do not have permission to access this view") if clist.pk is None: clist.save() - if not doc in clist.added_docs.all(): + if doc not in clist.added_docs.all(): clist.added_docs.add(doc) - if request.is_ajax(): - return HttpResponse(json.dumps({ 'success': True }), content_type='application/json') + if is_ajax(request): + return HttpResponse( + json.dumps({"success": True}), content_type="application/json" + ) else: return HttpResponseRedirect(clist.get_absolute_url()) - return render(request, "community/track_document.html", { - "name": doc.name, - }) + return render( + request, + "community/track_document.html", + { + "name": doc.name, + }, + ) + @login_required -def untrack_document(request, name, username=None, acronym=None): - doc = get_object_or_404(Document, docalias__name=name) - clist = lookup_community_list(username, acronym) +def untrack_document(request, name, email_or_name=None, acronym=None): + doc = get_object_or_404(Document, name=name) + clist = lookup_community_list(request, email_or_name, acronym) # may raise Http404 if not can_manage_community_list(request.user, clist): permission_denied(request, "You do not have permission to access this view") @@ -162,29 +241,35 @@ def untrack_document(request, name, username=None, acronym=None): if clist.pk is not None: clist.added_docs.remove(doc) - if request.is_ajax(): - return HttpResponse(json.dumps({ 'success': True }), content_type='application/json') + if is_ajax(request): + return HttpResponse( + json.dumps({"success": True}), content_type="application/json" + ) else: return HttpResponseRedirect(clist.get_absolute_url()) - return render(request, "community/untrack_document.html", { - "name": doc.name, - }) - + return render( + request, + "community/untrack_document.html", + { + "name": doc.name, + }, + ) -def export_to_csv(request, username=None, acronym=None, group_type=None): - clist = lookup_community_list(username, acronym) - response = HttpResponse(content_type='text/csv') +@ignore_view_kwargs("group_type") +def export_to_csv(request, email_or_name=None, acronym=None): + clist = lookup_community_list(request, email_or_name, acronym) # may raise Http404 + response = HttpResponse(content_type="text/csv") if clist.group: filename = "%s-draft-list.csv" % clist.group.acronym else: filename = "draft-list.csv" - response['Content-Disposition'] = 'attachment; filename=%s' % filename + response["Content-Disposition"] = "attachment; filename=%s" % filename - writer = csv.writer(response, dialect=csv.excel, delimiter=str(',')) + writer = csv.writer(response, dialect=csv.excel, delimiter=str(",")) header = [ "Name", @@ -197,12 +282,12 @@ def export_to_csv(request, username=None, acronym=None, group_type=None): ] writer.writerow(header) - docs = docs_tracked_by_community_list(clist).select_related('type', 'group', 'ad') + docs = docs_tracked_by_community_list(clist).select_related("type", "group", "ad") for doc in docs.prefetch_related("states", "tags"): row = [] row.append(doc.name) row.append(doc.title) - e = doc.latest_event(type='new_revision') + e = doc.latest_event(type="new_revision") row.append(e.time.strftime("%Y-%m-%d") if e else "") row.append(strip_tags(doc.friendly_state())) row.append(doc.group.acronym if doc.group else "") @@ -213,53 +298,73 @@ def export_to_csv(request, username=None, acronym=None, group_type=None): return response -def feed(request, username=None, acronym=None, group_type=None): - clist = lookup_community_list(username, acronym) - significant = request.GET.get('significant', '') == '1' +@ignore_view_kwargs("group_type") +def feed(request, email_or_name=None, acronym=None): + clist = lookup_community_list(request, email_or_name, acronym) # may raise Http404 + significant = request.GET.get("significant", "") == "1" - documents = docs_tracked_by_community_list(clist).values_list('pk', flat=True) - since = timezone.now() - datetime.timedelta(days=14) + documents = docs_tracked_by_community_list(clist).values_list("pk", flat=True) + updated = timezone.now() + since = updated - datetime.timedelta(days=14) - events = DocEvent.objects.filter( - doc__id__in=documents, - time__gte=since, - ).distinct().order_by('-time', '-id').select_related("doc") + events = ( + DocEvent.objects.filter( + doc__id__in=documents, + time__gte=since, + ) + .distinct() + .order_by("-time", "-id") + .select_related("doc") + ) if significant: - events = events.filter(type="changed_state", statedocevent__state__in=list(states_of_significant_change())) + events = events.filter( + type="changed_state", + statedocevent__state__in=list(states_of_significant_change()), + ) host = request.get_host() - feed_url = 'https://%s%s' % (host, request.get_full_path()) + feed_url = "https://%s%s" % (host, request.get_full_path()) feed_id = uuid.uuid5(uuid.NAMESPACE_URL, str(feed_url)) - title = '%s RSS Feed' % clist.long_name() + title = "%s RSS Feed" % clist.long_name() if significant: - subtitle = 'Significant document changes' + subtitle = "Significant document changes" else: - subtitle = 'Document changes' - - return render(request, 'community/atom.xml', { - 'clist': clist, - 'entries': events[:50], - 'title': title, - 'subtitle': subtitle, - 'id': feed_id.urn, - 'updated': timezone.now(), - }, content_type='text/xml') + subtitle = "Document changes" + + return render( + request, + "community/atom.xml", + { + "clist": clist, + "entries": events[:50], + "title": title, + "subtitle": subtitle, + "id": feed_id.urn, + "updated": updated, + }, + content_type="text/xml", + ) @login_required -def subscription(request, username=None, acronym=None, group_type=None): - clist = lookup_community_list(username, acronym) +@ignore_view_kwargs("group_type") +def subscription(request, email_or_name=None, acronym=None): + clist = lookup_community_list(request, email_or_name, acronym) # may raise Http404 if clist.pk is None: raise Http404 - existing_subscriptions = EmailSubscription.objects.filter(community_list=clist, email__person__user=request.user) + person = request.user.person + + existing_subscriptions = EmailSubscription.objects.filter( + community_list=clist, email__person=person + ) - if request.method == 'POST': + if request.method == "POST": action = request.POST.get("action") if action == "subscribe": - form = SubscriptionForm(request.user, clist, request.POST) + form = SubscriptionForm(person, clist, request.POST) if form.is_valid(): subscription = form.save(commit=False) subscription.community_list = clist @@ -268,14 +373,20 @@ def subscription(request, username=None, acronym=None, group_type=None): return HttpResponseRedirect("") elif action == "unsubscribe": - existing_subscriptions.filter(pk=request.POST.get("subscription_id")).delete() + existing_subscriptions.filter( + pk=request.POST.get("subscription_id") + ).delete() return HttpResponseRedirect("") else: - form = SubscriptionForm(request.user, clist) - - return render(request, 'community/subscription.html', { - 'clist': clist, - 'form': form, - 'existing_subscriptions': existing_subscriptions, - }) + form = SubscriptionForm(person, clist) + + return render( + request, + "community/subscription.html", + { + "clist": clist, + "form": form, + "existing_subscriptions": existing_subscriptions, + }, + ) diff --git a/ietf/context_processors.py b/ietf/context_processors.py index baa8d7a5d26..5aaa4ab2567 100644 --- a/ietf/context_processors.py +++ b/ietf/context_processors.py @@ -5,6 +5,7 @@ from django.conf import settings from django.utils import timezone from ietf import __version__, __patch__, __release_branch__, __release_hash__ +from opentelemetry.propagate import inject def server_mode(request): return {'server_mode': settings.SERVER_MODE} @@ -51,3 +52,8 @@ def timezone_now(request): return { 'timezone_now': timezone.now(), } + +def traceparent_id(request): + context_extras = {} + inject(context_extras) + return { "otel": context_extras } diff --git a/ietf/cookies/.gitignore b/ietf/cookies/.gitignore deleted file mode 100644 index a74b07aee47..00000000000 --- a/ietf/cookies/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/*.pyc diff --git a/ietf/database-notes/.gitignore b/ietf/database-notes/.gitignore deleted file mode 100644 index c7013ced9df..00000000000 --- a/ietf/database-notes/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/*.pyc -/settings_local.py diff --git a/ietf/dbtemplate/fixtures/nomcom_templates.xml b/ietf/dbtemplate/fixtures/nomcom_templates.xml index abf0cb58f69..e7065b84cd3 100644 --- a/ietf/dbtemplate/fixtures/nomcom_templates.xml +++ b/ietf/dbtemplate/fixtures/nomcom_templates.xml @@ -1,190 +1,190 @@ - - - - /nomcom/defaults/home.rst - Home page of group - - rst - Home page -========= - -This is the home page of the nomcom group. - - - - /nomcom/defaults/email/inexistent_person.txt - Email sent to chair of nomcom and secretariat when Email and Person are created if some of them don't exist - $email: Newly created email -$fullname: Fullname of the new person -$person_id: Id of the new Person object -$group: Name of the group - plain - Hello, - -A new person with name $fullname and email $email has been created. The new Person object has the following id: '$person_id'. - -Please, check if there is some more action nedeed. - - - - /nomcom/defaults/email/new_nominee.txt - Email sent to nominees when they are nominated - $nominee: Full name of the nominee -$position: Name of the position -$domain: Server domain -$accept_url: Url hash to accept nominations -$decline_url: Url hash to decline nominations - plain - Hi, - -You have been nominated for the position of $position. - -The NomCom would appreciate receiving an indication of whether or not you accept this nomination to stand for consideration as a candidate for this position. - -You can accept the nomination via web going to the following link https://$domain$accept_url or decline the nomination going the following link https://$domain$decline_url - -If you accept, you will need to fill out a questionnaire. You will receive the questionnaire by email. - -Best regards, - - - - - /nomcom/defaults/email/new_nomination.txt - Email sent to nominators and secretariat when the nominators make the nominations - $nominator: Full name of the nominator -$nominator_email: Email of the nominator -$nominee: Full name of the nominee -$nominee_email: Email of the nominee -$position: Nomination position - plain - A new nomination have been received. - -Nominator: $nominator ($nominator_email) -Nominee: $nominee ($nominee_email) -Position: $position - - - - /nomcom/defaults/position/questionnaire.txt - Questionnaire sent to the nomine - $position: Position - plain - Enter here the questionnaire for the position $position: - -Questionnaire - - - - /nomcom/defaults/position/requirements - Position requirements - $position: Position - rst - These are the requirements for the position $position: - -Requirements. - - - - /nomcom/defaults/position/header_questionnaire.txt - Header of the email that contains the questionnaire sent to the nomine - $nominee: Full name of the nomine -$position: Position - plain - Hi $nominee, this is the questionnaire for the position $position: - - - - - - /nomcom/defaults/email/nomination_accept_reminder.txt - Email sent to nominees asking them to accept (or decline) the nominations. - $positions: Nomination positions - plain - Hi, - -You have been nominated for the position of $position. - -The NomCom would appreciate receiving an indication of whether or not you accept this nomination to stand for consideration as a candidate for this position. - -You can accept the nomination via web going to the following link https://$domain$accept_url or decline the nomination going the following link https://$domain$decline_url - -If you accept, you will need to fill out a questionnaire. - -Best regards, - - - - /nomcom/defaults/email/nomination_receipt.txt - Email sent to nominator to get a confirmation mail containing feedback in cleartext - $nominee: Full name of the nominee -$position: Name of the position -$domain: Server domain -$accept_url: Url hash to accept nominations -$decline_url: Url hash to decline nominations - plain - Hi, - -Your nomination of $nominee for the position of -$position has been received and registered. - -The following comments have also been registered: - --------------------------------------------------------------------------- -$comments --------------------------------------------------------------------------- - -Thank you, - - - - /nomcom/defaults/email/feedback_receipt.txt - Email sent to feedback author to get a confirmation mail containing feedback in cleartext - $nominee: Full name of the nominee -$position: Nomination position -$comments: Comments on this candidate - plain - Hi, - -Your input regarding $about has been received and registered. - -The following comments have been registered: - --------------------------------------------------------------------------- -$comments --------------------------------------------------------------------------- - -Thank you, - - - - /nomcom/defaults/email/questionnaire_reminder.txt - Email sent to nominees reminding them to complete a questionnaire - $positions: Nomination positions - plain - -Thank you for accepting your nomination for the position of $position. - -Please remember to complete and return the questionnaire for this position at your earliest opportunity. -The questionnaire is repeated below for your convenience. - --------- - - - - /nomcom/defaults/topic/description - Description of Topic - $topic: Topic' - rst - This is a description of the topic "$topic" - -Describe the topic and add any information/instructions for the responder here. - - - - /nomcom/defaults/iesg_requirements - Generic IESG Requirements - rst - Generic IESG Requirements Yo! - - + + + + /nomcom/defaults/home.rst + Home page of group + + rst + Home page +========= + +This is the home page of the nomcom group. + + + + /nomcom/defaults/email/inexistent_person.txt + Email sent to chair of nomcom and secretariat when Email and Person are created if some of them don't exist + $email: Newly created email +$fullname: Fullname of the new person +$person_id: Id of the new Person object +$group: Name of the group + plain + Hello, + +A new person with name $fullname and email $email has been created. The new Person object has the following id: '$person_id'. + +Please, check if there is some more action nedeed. + + + + /nomcom/defaults/email/new_nominee.txt + Email sent to nominees when they are nominated + $nominee: Full name of the nominee +$position: Name of the position +$domain: Server domain +$accept_url: Url hash to accept nominations +$decline_url: Url hash to decline nominations + plain + Hi, + +You have been nominated for the position of $position. + +The NomCom would appreciate receiving an indication of whether or not you accept this nomination to stand for consideration as a candidate for this position. + +You can accept the nomination via web going to the following link https://$domain$accept_url or decline the nomination going the following link https://$domain$decline_url + +If you accept, you will need to fill out a questionnaire. You will receive the questionnaire by email. + +Best regards, + + + + + /nomcom/defaults/email/new_nomination.txt + Email sent to nominators and secretariat when the nominators make the nominations + $nominator: Full name of the nominator +$nominator_email: Email of the nominator +$nominee: Full name of the nominee +$nominee_email: Email of the nominee +$position: Nomination position + plain + A new nomination have been received. + +Nominator: $nominator ($nominator_email) +Nominee: $nominee ($nominee_email) +Position: $position + + + + /nomcom/defaults/position/questionnaire.txt + Questionnaire sent to the nomine + $position: Position + plain + Enter here the questionnaire for the position $position: + +Questionnaire + + + + /nomcom/defaults/position/requirements + Position requirements + $position: Position + rst + These are the requirements for the position $position: + +Requirements. + + + + /nomcom/defaults/position/header_questionnaire.txt + Header of the email that contains the questionnaire sent to the nomine + $nominee: Full name of the nomine +$position: Position + plain + Hi $nominee, this is the questionnaire for the position $position: + + + + + + /nomcom/defaults/email/nomination_accept_reminder.txt + Email sent to nominees asking them to accept (or decline) the nominations. + $positions: Nomination positions + plain + Hi, + +You have been nominated for the position of $position. + +The NomCom would appreciate receiving an indication of whether or not you accept this nomination to stand for consideration as a candidate for this position. + +You can accept the nomination via web going to the following link https://$domain$accept_url or decline the nomination going the following link https://$domain$decline_url + +If you accept, you will need to fill out a questionnaire. + +Best regards, + + + + /nomcom/defaults/email/nomination_receipt.txt + Email sent to nominator to get a confirmation mail containing feedback in cleartext + $nominee: Full name of the nominee +$position: Name of the position +$domain: Server domain +$accept_url: Url hash to accept nominations +$decline_url: Url hash to decline nominations + plain + Hi, + +Your nomination of $nominee for the position of +$position has been received and registered. + +The following comments have also been registered: + +-------------------------------------------------------------------------- +$comments +-------------------------------------------------------------------------- + +Thank you, + + + + /nomcom/defaults/email/feedback_receipt.txt + Email sent to feedback author to get a confirmation mail containing feedback in cleartext + $nominee: Full name of the nominee +$position: Nomination position +$comments: Comments on this candidate + plain + Hi, + +Your input regarding $about has been received and registered. + +The following comments have been registered: + +-------------------------------------------------------------------------- +$comments +-------------------------------------------------------------------------- + +Thank you, + + + + /nomcom/defaults/email/questionnaire_reminder.txt + Email sent to nominees reminding them to complete a questionnaire + $positions: Nomination positions + plain + +Thank you for accepting your nomination for the position of $position. + +Please remember to complete and return the questionnaire for this position at your earliest opportunity. +The questionnaire is repeated below for your convenience. + +-------- + + + + /nomcom/defaults/topic/description + Description of Topic + $topic: Topic' + rst + This is a description of the topic "$topic" + +Describe the topic and add any information/instructions for the responder here. + + + + /nomcom/defaults/iesg_requirements + Generic IESG Requirements + rst + Generic IESG Requirements Yo! + + diff --git a/ietf/doc/admin.py b/ietf/doc/admin.py index 64b9d9eff8b..745536f9a1e 100644 --- a/ietf/doc/admin.py +++ b/ietf/doc/admin.py @@ -1,18 +1,19 @@ -# Copyright The IETF Trust 2010-2021, All Rights Reserved +# Copyright The IETF Trust 2010-2025, All Rights Reserved # -*- coding: utf-8 -*- from django.contrib import admin from django.db import models from django import forms +from rangefilter.filters import DateRangeQuickSelectListFilterBuilder from .models import (StateType, State, RelatedDocument, DocumentAuthor, Document, RelatedDocHistory, - DocHistoryAuthor, DocHistory, DocAlias, DocReminder, DocEvent, NewRevisionDocEvent, + DocHistoryAuthor, DocHistory, DocReminder, DocEvent, NewRevisionDocEvent, StateDocEvent, ConsensusDocEvent, BallotType, BallotDocEvent, WriteupDocEvent, LastCallDocEvent, TelechatDocEvent, BallotPositionDocEvent, ReviewRequestDocEvent, InitialReviewDocEvent, AddedMessageEvent, SubmissionDocEvent, DeletedEvent, EditedAuthorsDocEvent, DocumentURL, ReviewAssignmentDocEvent, IanaExpertDocEvent, IRSGBallotDocEvent, DocExtResource, DocumentActionHolder, - BofreqEditorDocEvent, BofreqResponsibleDocEvent ) + BofreqEditorDocEvent, BofreqResponsibleDocEvent, StoredObject ) from ietf.utils.validators import validate_external_resource_value @@ -21,16 +22,12 @@ class StateTypeAdmin(admin.ModelAdmin): admin.site.register(StateType, StateTypeAdmin) class StateAdmin(admin.ModelAdmin): - list_display = ["slug", "type", 'name', 'order', 'desc'] - list_filter = ["type", ] + list_display = ["slug", "type", 'name', 'order', 'desc', "used"] + list_filter = ["type", "used"] search_fields = ["slug", "type__label", "type__slug", "name", "desc"] filter_horizontal = ["next_states"] admin.site.register(State, StateAdmin) -# class DocAliasInline(admin.TabularInline): -# model = DocAlias -# extra = 1 - class DocAuthorInline(admin.TabularInline): model = DocumentAuthor raw_id_fields = ['person', 'email'] @@ -43,8 +40,9 @@ class DocActionHolderInline(admin.TabularInline): class RelatedDocumentInline(admin.TabularInline): model = RelatedDocument + fk_name= 'source' def this(self, instance): - return instance.source.canonical_name() + return instance.source.name readonly_fields = ['this', ] fields = ['this', 'relationship', 'target', ] raw_id_fields = ['target'] @@ -70,7 +68,7 @@ class Meta: class DocumentAuthorAdmin(admin.ModelAdmin): list_display = ['id', 'document', 'person', 'email', 'affiliation', 'country', 'order'] - search_fields = ['document__docalias__name', 'person__name', 'email__address', 'affiliation', 'country'] + search_fields = ['document__name', 'person__name', 'email__address', 'affiliation', 'country'] raw_id_fields = ["document", "person", "email"] admin.site.register(DocumentAuthor, DocumentAuthorAdmin) @@ -108,14 +106,6 @@ def state(self, instance): admin.site.register(DocHistory, DocHistoryAdmin) -class DocAliasAdmin(admin.ModelAdmin): - list_display = ['name', 'targets'] - search_fields = ['name', 'docs__name'] - raw_id_fields = ['docs'] - def targets(self, obj): - return ', '.join([o.name for o in obj.docs.all()]) -admin.site.register(DocAlias, DocAliasAdmin) - class DocReminderAdmin(admin.ModelAdmin): list_display = ['id', 'event', 'type', 'due', 'active'] list_filter = ['type', 'due', 'active'] @@ -125,7 +115,7 @@ class DocReminderAdmin(admin.ModelAdmin): class RelatedDocumentAdmin(admin.ModelAdmin): list_display = ['source', 'target', 'relationship', ] list_filter = ['relationship', ] - search_fields = ['source__name', 'target__name', 'target__docs__name', ] + search_fields = ['source__name', 'target__name', ] raw_id_fields = ['source', 'target', ] admin.site.register(RelatedDocument, RelatedDocumentAdmin) @@ -153,6 +143,13 @@ class DocumentActionHolderAdmin(admin.ModelAdmin): # events +class DeletedEventAdmin(admin.ModelAdmin): + list_display = ['id', 'content_type', 'json', 'by', 'time'] + list_filter = ['time'] + raw_id_fields = ['content_type', 'by'] +admin.site.register(DeletedEvent, DeletedEventAdmin) + + class DocEventAdmin(admin.ModelAdmin): def event_type(self, obj): return str(obj.type) @@ -170,39 +167,42 @@ def short_desc(self, obj): admin.site.register(StateDocEvent, DocEventAdmin) admin.site.register(ConsensusDocEvent, DocEventAdmin) admin.site.register(BallotDocEvent, DocEventAdmin) +admin.site.register(IRSGBallotDocEvent, DocEventAdmin) admin.site.register(WriteupDocEvent, DocEventAdmin) admin.site.register(LastCallDocEvent, DocEventAdmin) admin.site.register(TelechatDocEvent, DocEventAdmin) -admin.site.register(ReviewRequestDocEvent, DocEventAdmin) -admin.site.register(ReviewAssignmentDocEvent, DocEventAdmin) admin.site.register(InitialReviewDocEvent, DocEventAdmin) -admin.site.register(AddedMessageEvent, DocEventAdmin) -admin.site.register(SubmissionDocEvent, DocEventAdmin) admin.site.register(EditedAuthorsDocEvent, DocEventAdmin) admin.site.register(IanaExpertDocEvent, DocEventAdmin) -class DeletedEventAdmin(admin.ModelAdmin): - list_display = ['id', 'content_type', 'json', 'by', 'time'] - list_filter = ['time'] - raw_id_fields = ['content_type', 'by'] -admin.site.register(DeletedEvent, DeletedEventAdmin) - class BallotPositionDocEventAdmin(DocEventAdmin): - raw_id_fields = ["doc", "by", "balloter", "ballot"] + raw_id_fields = DocEventAdmin.raw_id_fields + ["balloter", "ballot"] admin.site.register(BallotPositionDocEvent, BallotPositionDocEventAdmin) - -class IRSGBallotDocEventAdmin(DocEventAdmin): - raw_id_fields = ["doc", "by"] -admin.site.register(IRSGBallotDocEvent, IRSGBallotDocEventAdmin) class BofreqEditorDocEventAdmin(DocEventAdmin): - raw_id_fields = ["doc", "by", "editors" ] + raw_id_fields = DocEventAdmin.raw_id_fields + ["editors"] admin.site.register(BofreqEditorDocEvent, BofreqEditorDocEventAdmin) class BofreqResponsibleDocEventAdmin(DocEventAdmin): - raw_id_fields = ["doc", "by", "responsible" ] + raw_id_fields = DocEventAdmin.raw_id_fields + ["responsible"] admin.site.register(BofreqResponsibleDocEvent, BofreqResponsibleDocEventAdmin) +class ReviewRequestDocEventAdmin(DocEventAdmin): + raw_id_fields = DocEventAdmin.raw_id_fields + ["review_request"] +admin.site.register(ReviewRequestDocEvent, ReviewRequestDocEventAdmin) + +class ReviewAssignmentDocEventAdmin(DocEventAdmin): + raw_id_fields = DocEventAdmin.raw_id_fields + ["review_assignment"] +admin.site.register(ReviewAssignmentDocEvent, ReviewAssignmentDocEventAdmin) + +class AddedMessageEventAdmin(DocEventAdmin): + raw_id_fields = DocEventAdmin.raw_id_fields + ["message"] +admin.site.register(AddedMessageEvent, AddedMessageEventAdmin) + +class SubmissionDocEventAdmin(DocEventAdmin): + raw_id_fields = DocEventAdmin.raw_id_fields + ["submission"] +admin.site.register(SubmissionDocEvent, SubmissionDocEventAdmin) + class DocumentUrlAdmin(admin.ModelAdmin): list_display = ['id', 'doc', 'tag', 'url', 'desc', ] search_fields = ['doc__name', 'url', ] @@ -219,3 +219,20 @@ class DocExtResourceAdmin(admin.ModelAdmin): search_fields = ['doc__name', 'value', 'display_name', 'name__slug',] raw_id_fields = ['doc', ] admin.site.register(DocExtResource, DocExtResourceAdmin) + +class StoredObjectAdmin(admin.ModelAdmin): + list_display = ['store', 'name', 'doc_name', 'modified', 'is_deleted'] + list_filter = [ + 'store', + ('modified', DateRangeQuickSelectListFilterBuilder()), + ('deleted', DateRangeQuickSelectListFilterBuilder()), + ] + search_fields = ['name', 'doc_name', 'doc_rev'] + list_display_links = ['name'] + + @admin.display(boolean=True, description="Deleted?", ordering="deleted") + def is_deleted(self, instance): + return instance.deleted is not None + + +admin.site.register(StoredObject, StoredObjectAdmin) diff --git a/ietf/doc/expire.py b/ietf/doc/expire.py index f6779e04718..bf8523aa98f 100644 --- a/ietf/doc/expire.py +++ b/ietf/doc/expire.py @@ -3,6 +3,8 @@ # expiry of Internet-Drafts +import debug # pyflakes:ignore + from django.conf import settings from django.utils import timezone @@ -11,12 +13,13 @@ from typing import List, Optional # pyflakes:ignore +from ietf.doc.storage_utils import exists_in_storage, remove_from_storage +from ietf.doc.utils import update_action_holders from ietf.utils import log from ietf.utils.mail import send_mail -from ietf.doc.models import Document, DocEvent, State, IESG_SUBSTATE_TAGS +from ietf.doc.models import Document, DocEvent, State from ietf.person.models import Person from ietf.meeting.models import Meeting -from ietf.doc.utils import add_state_change_event, update_action_holders from ietf.mailtrigger.utils import gather_address_lists from ietf.utils.timezone import date_today, datetime_today, DEADLINE_TZINFO @@ -34,8 +37,8 @@ def expirable_drafts(queryset=None): # Populate this first time through (but after django has been set up) if nonexpirable_states is None: - # all IESG states except I-D Exists, AD Watching, and Dead block expiry - nonexpirable_states = list(State.objects.filter(used=True, type="draft-iesg").exclude(slug__in=("idexists","watching", "dead"))) + # all IESG states except I-D Exists and Dead block expiry + nonexpirable_states = list(State.objects.filter(used=True, type="draft-iesg").exclude(slug__in=("idexists", "dead"))) # sent to RFC Editor and RFC Published block expiry (the latter # shouldn't be possible for an active draft, though) nonexpirable_states += list(State.objects.filter(used=True, type__in=("draft-stream-iab", "draft-stream-irtf", "draft-stream-ise"), slug__in=("rfc-edit", "pub"))) @@ -139,16 +142,32 @@ def move_file(f): if os.path.exists(src): try: + # ghostlinkd would keep this in the combined all archive since it would + # be sourced from a different place. But when ghostlinkd is removed, nothing + # new is needed here - the file will already exist in the combined archive shutil.move(src, dst) except IOError as e: if "No such file or directory" in str(e): pass else: raise - + + def remove_ftp_copy(f): + mark = Path(settings.FTP_DIR) / "internet-drafts" / f + if mark.exists(): + mark.unlink() + + def remove_from_active_draft_storage(file): + # Assumes the glob will never find a file with no suffix + ext = file.suffix[1:] + remove_from_storage("active-draft", f"{ext}/{file.name}", warn_if_missing=False) + + # Note that the object is already in the "draft" storage. src_dir = Path(settings.INTERNET_DRAFT_PATH) for file in src_dir.glob("%s-%s.*" % (doc.name, rev)): move_file(str(file.name)) + remove_ftp_copy(str(file.name)) + remove_from_active_draft_storage(file) def expire_draft(doc): # clean up files @@ -158,24 +177,11 @@ def expire_draft(doc): events = [] - # change the state - if doc.latest_event(type='started_iesg_process'): - new_state = State.objects.get(used=True, type="draft-iesg", slug="dead") - prev_state = doc.get_state(new_state.type_id) - prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) - if new_state != prev_state: - doc.set_state(new_state) - doc.tags.remove(*prev_tags) - e = add_state_change_event(doc, system, prev_state, new_state, prev_tags=prev_tags, new_tags=[]) - if e: - events.append(e) - e = update_action_holders(doc, prev_state, new_state, prev_tags=prev_tags, new_tags=[]) - if e: - events.append(e) - events.append(DocEvent.objects.create(doc=doc, rev=doc.rev, by=system, type="expired_document", desc="Document has expired")) + prev_draft_state=doc.get_state("draft") doc.set_state(State.objects.get(used=True, type="draft", slug="expired")) + events.append(update_action_holders(doc, prev_draft_state, doc.get_state("draft"),[],[])) doc.save_with_history(events) def clean_up_draft_files(): @@ -213,8 +219,19 @@ def splitext(fn): filename, revision = match.groups() def move_file_to(subdir): + # Similar to move_draft_files_to_archive shutil.move(path, os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, subdir, basename)) + mark = Path(settings.FTP_DIR) / "internet-drafts" / basename + if mark.exists(): + mark.unlink() + if ext: + # Note that we're not moving these strays anywhere - the assumption + # is that the active-draft blobstore will not get strays. + # See, however, the note about "major system failures" at "unknown_ids" + blobname = f"{ext[1:]}/{basename}" + if exists_in_storage("active-draft", blobname): + remove_from_storage("active-draft", blobname) try: doc = Document.objects.get(name=filename, rev=revision) @@ -229,4 +246,6 @@ def move_file_to(subdir): move_file_to("") except Document.DoesNotExist: + # All uses of this past 2014 seem related to major system failures. move_file_to("unknown_ids") + diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py index 95fbedfaaed..19aa9ecc9cc 100644 --- a/ietf/doc/factories.py +++ b/ietf/doc/factories.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2016-2020, All Rights Reserved +# Copyright The IETF Trust 2016-2023, All Rights Reserved # -*- coding: utf-8 -*- @@ -7,12 +7,12 @@ import factory.fuzzy import datetime -from typing import Optional # pyflakes:ignore +from typing import Any # pyflakes:ignore from django.conf import settings from django.utils import timezone -from ietf.doc.models import ( Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor, +from ietf.doc.models import ( Document, DocEvent, NewRevisionDocEvent, State, DocumentAuthor, StateDocEvent, BallotPositionDocEvent, BallotDocEvent, BallotType, IRSGBallotDocEvent, TelechatDocEvent, DocumentActionHolder, BofreqEditorDocEvent, BofreqResponsibleDocEvent, DocExtResource ) from ietf.group.models import Group @@ -23,7 +23,6 @@ from ietf.utils.timezone import date_today - def draft_name_generator(type_id,group,n): return '%s-%s-%s-%s%d'%( type_id, @@ -36,14 +35,18 @@ def draft_name_generator(type_id,group,n): class BaseDocumentFactory(factory.django.DjangoModelFactory): class Meta: model = Document + skip_postgeneration_save = True + # n.b., a few attributes are typed as Any so mypy won't complain when we override in subclasses title = factory.Faker('sentence',nb_words=5) - abstract = factory.Faker('paragraph', nb_sentences=5) + abstract: Any = factory.Faker('paragraph', nb_sentences=5) rev = '00' - std_level_id = None # type: Optional[str] + std_level_id: Any = None intended_std_level_id = None time = timezone.now() - expires = factory.LazyAttribute(lambda o: o.time+datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE)) + expires: Any = factory.LazyAttribute( + lambda o: o.time+datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE) + ) pages = factory.fuzzy.FuzzyInteger(2,400) @@ -51,16 +54,11 @@ class Meta: def name(self, n): return draft_name_generator(self.type_id,self.group,n) - newrevisiondocevent = factory.RelatedFactory('ietf.doc.factories.NewRevisionDocEventFactory','doc') - @factory.post_generation - def other_aliases(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument - alias = DocAliasFactory(name=obj.name) - alias.docs.add(obj) - if create and extracted: - for name in extracted: - alias = DocAliasFactory(name=name) - alias.docs.add(obj) + def newrevisiondocevent(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument + if create: + if obj.type_id != "rfc": + NewRevisionDocEventFactory(doc=obj) @factory.post_generation def states(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument @@ -83,13 +81,7 @@ def authors(obj, create, extracted, **kwargs): # pylint: disable=no-self-argumen def relations(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument if create and extracted: for (rel_id, doc) in extracted: - if isinstance(doc, Document): - docalias = doc.docalias.first() - elif isinstance(doc, DocAlias): - docalias = doc - else: - continue - obj.relateddocument_set.create(relationship_id=rel_id, target=docalias) + obj.relateddocument_set.create(relationship_id=rel_id, target=doc) @factory.post_generation def create_revisions(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument @@ -119,10 +111,12 @@ class DocumentFactory(BaseDocumentFactory): group = factory.SubFactory('ietf.group.factories.GroupFactory',acronym='none') -class IndividualDraftFactory(BaseDocumentFactory): - - type_id = 'draft' - group = factory.SubFactory('ietf.group.factories.GroupFactory',acronym='none') +class RfcFactory(BaseDocumentFactory): + type_id = "rfc" + rev = "" + rfc_number = factory.Sequence(lambda n: n + 1000) + name = factory.LazyAttribute(lambda o: f"rfc{o.rfc_number:d}") + expires = None @factory.post_generation def states(obj, create, extracted, **kwargs): @@ -131,15 +125,14 @@ def states(obj, create, extracted, **kwargs): if extracted: for (state_type_id,state_slug) in extracted: obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug)) - if not obj.get_state('draft-iesg'): - obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) else: - obj.set_state(State.objects.get(type_id='draft',slug='active')) - obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) + obj.set_state(State.objects.get(type_id='rfc',slug='published')) -class IndividualRfcFactory(IndividualDraftFactory): - alias2 = factory.RelatedFactory('ietf.doc.factories.DocAliasFactory','document',name=factory.Sequence(lambda n: 'rfc%04d'%(n+1000))) +class IndividualDraftFactory(BaseDocumentFactory): + + type_id = 'draft' + group = factory.SubFactory('ietf.group.factories.GroupFactory',acronym='none') @factory.post_generation def states(obj, create, extracted, **kwargs): @@ -148,17 +141,17 @@ def states(obj, create, extracted, **kwargs): if extracted: for (state_type_id,state_slug) in extracted: obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug)) + if not obj.get_state('draft-iesg'): + obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) else: - obj.set_state(State.objects.get(type_id='draft',slug='rfc')) + obj.set_state(State.objects.get(type_id='draft',slug='active')) + obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) - @factory.post_generation - def reset_canonical_name(obj, create, extracted, **kwargs): - if hasattr(obj, '_canonical_name'): - del obj._canonical_name - return None +class IndividualRfcFactory(RfcFactory): + group = factory.SubFactory('ietf.group.factories.GroupFactory',acronym='none') -class WgDraftFactory(BaseDocumentFactory): +class WgDraftFactory(BaseDocumentFactory): type_id = 'draft' group = factory.SubFactory('ietf.group.factories.GroupFactory',type_id='wg') stream_id = 'ietf' @@ -177,30 +170,12 @@ def states(obj, create, extracted, **kwargs): obj.set_state(State.objects.get(type_id='draft-stream-ietf',slug='wg-doc')) obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) -class WgRfcFactory(WgDraftFactory): - - alias2 = factory.RelatedFactory('ietf.doc.factories.DocAliasFactory','document',name=factory.Sequence(lambda n: 'rfc%04d'%(n+1000))) +class WgRfcFactory(RfcFactory): + group = factory.SubFactory('ietf.group.factories.GroupFactory',type_id='wg') + stream_id = 'ietf' std_level_id = 'ps' - @factory.post_generation - def states(obj, create, extracted, **kwargs): - if not create: - return - if extracted: - for (state_type_id,state_slug) in extracted: - obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug)) - if not obj.get_state('draft-iesg'): - obj.set_state(State.objects.get(type_id='draft-iesg', slug='pub')) - else: - obj.set_state(State.objects.get(type_id='draft',slug='rfc')) - obj.set_state(State.objects.get(type_id='draft-iesg', slug='pub')) - - @factory.post_generation - def reset_canonical_name(obj, create, extracted, **kwargs): - if hasattr(obj, '_canonical_name'): - del obj._canonical_name - return None class RgDraftFactory(BaseDocumentFactory): @@ -223,34 +198,11 @@ def states(obj, create, extracted, **kwargs): obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) -class RgRfcFactory(RgDraftFactory): - - alias2 = factory.RelatedFactory('ietf.doc.factories.DocAliasFactory','document',name=factory.Sequence(lambda n: 'rfc%04d'%(n+1000))) - +class RgRfcFactory(RfcFactory): + group = factory.SubFactory('ietf.group.factories.GroupFactory',type_id='rg') + stream_id = 'irtf' std_level_id = 'inf' - @factory.post_generation - def states(obj, create, extracted, **kwargs): - if not create: - return - if extracted: - for (state_type_id,state_slug) in extracted: - obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug)) - if not obj.get_state('draft-stream-irtf'): - obj.set_state(State.objects.get(type_id='draft-stream-irtf', slug='pub')) - if not obj.get_state('draft-iesg'): - obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) - else: - obj.set_state(State.objects.get(type_id='draft',slug='rfc')) - obj.set_state(State.objects.get(type_id='draft-stream-irtf', slug='pub')) - obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) - - @factory.post_generation - def reset_canonical_name(obj, create, extracted, **kwargs): - if hasattr(obj, '_canonical_name'): - del obj._canonical_name - return None - class CharterFactory(BaseDocumentFactory): @@ -279,7 +231,7 @@ def changes_status_of(obj, create, extracted, **kwargs): for (rel, target) in extracted: obj.relateddocument_set.create(relationship_id=rel,target=target) else: - obj.relateddocument_set.create(relationship_id='tobcp', target=WgRfcFactory().docalias.first()) + obj.relateddocument_set.create(relationship_id='tobcp', target=WgRfcFactory()) @factory.post_generation def states(obj, create, extracted, **kwargs): @@ -306,9 +258,9 @@ def review_of(obj, create, extracted, **kwargs): if not create: return if extracted: - obj.relateddocument_set.create(relationship_id='conflrev',target=extracted.docalias.first()) + obj.relateddocument_set.create(relationship_id='conflrev',target=extracted) else: - obj.relateddocument_set.create(relationship_id='conflrev',target=DocumentFactory(name=obj.name.replace('conflict-review-','draft-'),type_id='draft',group=Group.objects.get(type_id='individ')).docalias.first()) + obj.relateddocument_set.create(relationship_id='conflrev',target=DocumentFactory(name=obj.name.replace('conflict-review-','draft-'),type_id='draft',group=Group.objects.get(type_id='individ'))) @factory.post_generation @@ -327,30 +279,13 @@ class ReviewFactory(BaseDocumentFactory): name = factory.LazyAttribute(lambda o: 'review-doesnotexist-00-%s-%s'%(o.group.acronym,date_today().isoformat())) group = factory.SubFactory('ietf.group.factories.GroupFactory',type_id='review') -class DocAliasFactory(factory.django.DjangoModelFactory): - class Meta: - model = DocAlias - - @factory.post_generation - def document(self, create, extracted, **kwargs): - if create and extracted: - self.docs.add(extracted) - - @factory.post_generation - def docs(self, create, extracted, **kwargs): - if create and extracted: - for doc in extracted: - if not doc in self.docs.all(): - self.docs.add(doc) - - class DocEventFactory(factory.django.DjangoModelFactory): class Meta: model = DocEvent type = 'added_comment' by = factory.SubFactory('ietf.person.factories.PersonFactory') - doc = factory.SubFactory(DocumentFactory) + doc: Any = factory.SubFactory(DocumentFactory) # `Any` to appease mypy when a subclass overrides doc desc = factory.Faker('sentence',nb_words=6) @factory.lazy_attribute @@ -379,6 +314,7 @@ def desc(self): class StateDocEventFactory(DocEventFactory): class Meta: model = StateDocEvent + skip_postgeneration_save = True type = 'changed_state' state_type_id = 'draft-iesg' @@ -452,6 +388,7 @@ class WgDocumentAuthorFactory(DocumentAuthorFactory): class BofreqEditorDocEventFactory(DocEventFactory): class Meta: model = BofreqEditorDocEvent + skip_postgeneration_save = True type = "changed_editors" doc = factory.SubFactory('ietf.doc.factories.BofreqFactory') @@ -466,10 +403,12 @@ def editors(obj, create, extracted, **kwargs): else: obj.editors.set(PersonFactory.create_batch(3)) obj.desc = f'Changed editors to {", ".join(obj.editors.values_list("name",flat=True)) or "(None)"}' + obj.save() class BofreqResponsibleDocEventFactory(DocEventFactory): class Meta: model = BofreqResponsibleDocEvent + skip_postgeneration_save = True type = "changed_responsible" doc = factory.SubFactory('ietf.doc.factories.BofreqFactory') @@ -484,7 +423,8 @@ def responsible(obj, create, extracted, **kwargs): else: ad = RoleFactory(group__type_id='area',name_id='ad').person obj.responsible.set([ad]) - obj.desc = f'Changed responsible leadership to {", ".join(obj.responsible.values_list("name",flat=True)) or "(None)"}' + obj.desc = f'Changed responsible leadership to {", ".join(obj.responsible.values_list("name",flat=True)) or "(None)"}' + obj.save() class BofreqFactory(BaseDocumentFactory): type_id = 'bofreq' @@ -551,30 +491,60 @@ def states(obj, create, extracted, **kwargs): obj.set_state(State.objects.get(type_id='draft-stream-editorial',slug='active')) obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) -class EditorialRfcFactory(RgDraftFactory): - - alias2 = factory.RelatedFactory('ietf.doc.factories.DocAliasFactory','document',name=factory.Sequence(lambda n: 'rfc%04d'%(n+1000))) - - std_level_id = 'inf' +class EditorialRfcFactory(RgRfcFactory): + pass + +class StatementFactory(BaseDocumentFactory): + type_id = "statement" + title = factory.Faker("sentence") + group = factory.SubFactory("ietf.group.factories.GroupFactory", acronym="iab") + + name = factory.LazyAttribute( + lambda o: "statement-%s-%s" % (xslugify(o.group.acronym), xslugify(o.title)) + ) + uploaded_filename = factory.LazyAttribute(lambda o: f"{o.name}-{o.rev}.md") + + published_statement_event = factory.RelatedFactory( + "ietf.doc.factories.DocEventFactory", + "doc", + type="published_statement", + time=timezone.now() - datetime.timedelta(days=1), + ) @factory.post_generation def states(obj, create, extracted, **kwargs): if not create: return if extracted: - for (state_type_id,state_slug) in extracted: - obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug)) - if not obj.get_state('draft-stream-editorial'): - obj.set_state(State.objects.get(type_id='draft-stream-editorial', slug='pub')) - if not obj.get_state('draft-iesg'): - obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) + for state_type_id, state_slug in extracted: + obj.set_state(State.objects.get(type_id=state_type_id, slug=state_slug)) else: - obj.set_state(State.objects.get(type_id='draft',slug='rfc')) - obj.set_state(State.objects.get(type_id='draft-stream-editorial', slug='pub')) - obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) + obj.set_state(State.objects.get(type_id="statement", slug="active")) + +class SubseriesFactory(factory.django.DjangoModelFactory): + class Meta: + model = Document + skip_postgeneration_save = True + @factory.lazy_attribute_sequence + def name(self, n): + return f"{self.type_id}{n}" + @factory.post_generation - def reset_canonical_name(obj, create, extracted, **kwargs): - if hasattr(obj, '_canonical_name'): - del obj._canonical_name - return None + def contains(obj, create, extracted, **kwargs): + if not create: + return + if extracted: + for doc in extracted: + obj.relateddocument_set.create(relationship_id="contains",target=doc) + else: + obj.relateddocument_set.create(relationship_id="contains", target=RfcFactory()) + +class BcpFactory(SubseriesFactory): + type_id="bcp" + +class StdFactory(SubseriesFactory): + type_id="std" + +class FyiFactory(SubseriesFactory): + type_id="fyi" diff --git a/ietf/doc/feeds.py b/ietf/doc/feeds.py index 7885e75e31e..500ed3cb182 100644 --- a/ietf/doc/feeds.py +++ b/ietf/doc/feeds.py @@ -1,6 +1,7 @@ # Copyright The IETF Trust 2007-2020, All Rights Reserved # -*- coding: utf-8 -*- +import debug # pyflakes:ignore import datetime import unicodedata @@ -8,8 +9,12 @@ from django.contrib.syndication.views import Feed, FeedDoesNotExist from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed from django.urls import reverse as urlreverse -from django.template.defaultfilters import truncatewords, truncatewords_html, date as datefilter -from django.template.defaultfilters import linebreaks # type: ignore +from django.template.defaultfilters import ( + truncatewords, + truncatewords_html, + date as datefilter, +) +from django.template.defaultfilters import linebreaks # type: ignore from django.utils import timezone from django.utils.html import strip_tags @@ -21,17 +26,17 @@ def strip_control_characters(s): """Remove Unicode control / non-printing characters from a string""" - replacement_char = unicodedata.lookup('REPLACEMENT CHARACTER') - return ''.join( - replacement_char if unicodedata.category(c)[0] == 'C' else c - for c in s + replacement_char = unicodedata.lookup("REPLACEMENT CHARACTER") + return "".join( + replacement_char if unicodedata.category(c)[0] == "C" else c for c in s ) + class DocumentChangesFeed(Feed): feed_type = Atom1Feed def get_object(self, request, name): - return Document.objects.get(docalias__name=name) + return Document.objects.get(name=name) def title(self, obj): return "Changes for %s" % obj.display_name() @@ -39,25 +44,37 @@ def title(self, obj): def link(self, obj): if obj is None: raise FeedDoesNotExist - return urlreverse('ietf.doc.views_doc.document_history', kwargs=dict(name=obj.canonical_name())) + return urlreverse( + "ietf.doc.views_doc.document_history", + kwargs=dict(name=obj.name), + ) def subtitle(self, obj): return "History of change entries for %s." % obj.display_name() def items(self, obj): - events = obj.docevent_set.all().order_by("-time","-id") + events = ( + obj.docevent_set.all() + .order_by("-time", "-id") + .select_related("by", "newrevisiondocevent", "submissiondocevent") + ) augment_events_with_revision(obj, events) return events def item_title(self, item): - return strip_control_characters("[%s] %s [rev. %s]" % ( - item.by, - truncatewords(strip_tags(item.desc), 15), - item.rev, - )) + return strip_control_characters( + "[%s] %s [rev. %s]" + % ( + item.by, + truncatewords(strip_tags(item.desc), 15), + item.rev, + ) + ) def item_description(self, item): - return strip_control_characters(truncatewords_html(format_textarea(item.desc), 20)) + return strip_control_characters( + truncatewords_html(format_textarea(item.desc), 20) + ) def item_pubdate(self, item): return item.time @@ -66,17 +83,28 @@ def item_author_name(self, item): return str(item.by) def item_link(self, item): - return urlreverse('ietf.doc.views_doc.document_history', kwargs=dict(name=item.doc.canonical_name())) + "#history-%s" % item.pk + return ( + urlreverse( + "ietf.doc.views_doc.document_history", + kwargs=dict(name=item.doc.name), + ) + + "#history-%s" % item.pk + ) + class InLastCallFeed(Feed): title = "Documents in Last Call" subtitle = "Announcements for documents in last call." feed_type = Atom1Feed - author_name = 'IESG Secretary' + author_name = "IESG Secretary" link = "/doc/iesg/last-call/" def items(self): - docs = list(Document.objects.filter(type="draft", states=State.objects.get(type="draft-iesg", slug="lc"))) + docs = list( + Document.objects.filter( + type="draft", states=State.objects.get(type="draft-iesg", slug="lc") + ) + ) for d in docs: d.lc_event = d.latest_event(LastCallDocEvent, type="sent_last_call") @@ -86,9 +114,11 @@ def items(self): return docs def item_title(self, item): - return "%s (%s - %s)" % (item.name, - datefilter(item.lc_event.time, "F j"), - datefilter(item.lc_event.expires, "F j, Y")) + return "%s (%s - %s)" % ( + item.name, + datefilter(item.lc_event.time, "F j"), + datefilter(item.lc_event.expires, "F j, Y"), + ) def item_description(self, item): return strip_control_characters(linebreaks(item.lc_event.desc)) @@ -96,33 +126,55 @@ def item_description(self, item): def item_pubdate(self, item): return item.lc_event.time + class Rss201WithNamespacesFeed(Rss201rev2Feed): def root_attributes(self): attrs = super(Rss201WithNamespacesFeed, self).root_attributes() - attrs['xmlns:dcterms'] = 'http://purl.org/dc/terms/' - attrs['xmlns:media'] = 'http://search.yahoo.com/mrss/' - attrs['xmlns:xsi'] = 'http://www.w3.org/2001/XMLSchema-instance' + attrs["xmlns:dcterms"] = "http://purl.org/dc/terms/" + attrs["xmlns:media"] = "http://search.yahoo.com/mrss/" + attrs["xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance" return attrs def add_item_elements(self, handler, item): super(Rss201WithNamespacesFeed, self).add_item_elements(handler, item) - for element_name in ['abstract','accessRights', 'format', 'publisher',]: - dc_item_name = 'dcterms_%s' % element_name - dc_element_name = 'dcterms:%s' % element_name - attrs= {'xsi:type':'dcterms:local'} if element_name == 'publisher' else {} + for element_name in [ + "abstract", + "accessRights", + "format", + "publisher", + ]: + dc_item_name = "dcterms_%s" % element_name + dc_element_name = "dcterms:%s" % element_name + attrs = {"xsi:type": "dcterms:local"} if element_name == "publisher" else {} if dc_item_name in item and item[dc_item_name] is not None: - handler.addQuickElement(dc_element_name,item[dc_item_name],attrs) + handler.addQuickElement(dc_element_name, item[dc_item_name], attrs) + + if "doi" in item and item["doi"] is not None: + handler.addQuickElement( + "dcterms:identifier", item["doi"], {"xsi:type": "dcterms:doi"} + ) + if "doiuri" in item and item["doiuri"] is not None: + handler.addQuickElement( + "dcterms:identifier", item["doiuri"], {"xsi:type": "dcterms:uri"} + ) + + # TODO: consider using media:group + if "media_contents" in item and item["media_contents"] is not None: + for media_content in item["media_contents"]: + handler.startElement( + "media:content", + { + "url": media_content["url"], + "type": media_content["media_type"], + }, + ) + if "is_format_of" in media_content: + handler.addQuickElement( + "dcterms:isFormatOf", media_content["is_format_of"] + ) + handler.endElement("media:content") - if 'doi' in item and item['doi'] is not None: - handler.addQuickElement('dcterms:identifier',item['doi'],{'xsi:type':'dcterms:doi'}) - if 'doiuri' in item and item['doiuri'] is not None: - handler.addQuickElement('dcterms:identifier',item['doiuri'],{'xsi:type':'dcterms:uri'}) - - if 'media_content' in item and item['media_content'] is not None: - handler.startElement('media:content',{'url':item['media_content']['url'],'type':'text/plain'}) - handler.addQuickElement('dcterms:isFormatOf',item['media_content']['link_url']) - handler.endElement('media:content') class RfcFeed(Feed): feed_type = Rss201WithNamespacesFeed @@ -130,55 +182,96 @@ class RfcFeed(Feed): author_name = "RFC Editor" link = "https://www.rfc-editor.org/rfc-index2.html" - def get_object(self,request,year=None): + def get_object(self, request, year=None): self.year = year - + def items(self): if self.year: # Find published RFCs based on their official publication year start_of_year = datetime.datetime(int(self.year), 1, 1, tzinfo=RPC_TZINFO) - start_of_next_year = datetime.datetime(int(self.year) + 1, 1, 1, tzinfo=RPC_TZINFO) + start_of_next_year = datetime.datetime( + int(self.year) + 1, 1, 1, tzinfo=RPC_TZINFO + ) rfc_events = DocEvent.objects.filter( - type='published_rfc', + type="published_rfc", time__gte=start_of_year, time__lt=start_of_next_year, - ).order_by('-time') + ).order_by("-time") else: cutoff = timezone.now() - datetime.timedelta(days=8) - rfc_events = DocEvent.objects.filter(type='published_rfc',time__gte=cutoff).order_by('-time') + rfc_events = DocEvent.objects.filter( + type="published_rfc", time__gte=cutoff + ).order_by("-time") results = [(e.doc, e.time) for e in rfc_events] - for doc,time in results: + for doc, time in results: doc.publication_time = time - return [doc for doc,time in results] - + return [doc for doc, time in results] + def item_title(self, item): - return "%s : %s" % (item.canonical_name(),item.title) + return "%s : %s" % (item.name, item.title) def item_description(self, item): return item.abstract def item_link(self, item): - return "https://rfc-editor.org/info/%s"%item.canonical_name() + return "https://rfc-editor.org/info/%s" % item.name def item_pubdate(self, item): return item.publication_time def item_extra_kwargs(self, item): extra = super(RfcFeed, self).item_extra_kwargs(item) - extra.update({'dcterms_accessRights': 'gratis'}) - extra.update({'dcterms_format': 'text/html'}) - extra.update({'media_content': {'url': 'https://rfc-editor.org/rfc/%s.txt' % item.canonical_name(), - 'link_url': self.item_link(item) - } - }) - extra.update({'doi':'10.17487/%s' % item.canonical_name().upper()}) - extra.update({'doiuri':'http://dx.doi.org/10.17487/%s' % item.canonical_name().upper()}) - - #TODO + extra.update({"dcterms_accessRights": "gratis"}) + extra.update({"dcterms_format": "text/html"}) + media_contents = [] + if item.rfc_number < 8650: + if item.rfc_number not in [8, 9, 51, 418, 500, 530, 589]: + for fmt, media_type in [("txt", "text/plain"), ("html", "text/html")]: + media_contents.append( + { + "url": f"https://rfc-editor.org/rfc/{item.name}.{fmt}", + "media_type": media_type, + "is_format_of": self.item_link(item), + } + ) + if item.rfc_number not in [571, 587]: + media_contents.append( + { + "url": f"https://www.rfc-editor.org/rfc/pdfrfc/{item.name}.txt.pdf", + "media_type": "application/pdf", + "is_format_of": self.item_link(item), + } + ) + else: + media_contents.append( + { + "url": f"https://www.rfc-editor.org/rfc/{item.name}.xml", + "media_type": "application/rfc+xml", + } + ) + for fmt, media_type in [ + ("txt", "text/plain"), + ("html", "text/html"), + ("pdf", "application/pdf"), + ]: + media_contents.append( + { + "url": f"https://rfc-editor.org/rfc/{item.name}.{fmt}", + "media_type": media_type, + "is_format_of": f"https://www.rfc-editor.org/rfc/{item.name}.xml", + } + ) + extra.update({"media_contents": media_contents}) + + extra.update({"doi": "10.17487/%s" % item.name.upper()}) + extra.update( + {"doiuri": "http://dx.doi.org/10.17487/%s" % item.name.upper()} + ) + # R104 Publisher (Mandatory - but we need a string from them first) - extra.update({'dcterms_publisher':'rfc-editor.org'}) + extra.update({"dcterms_publisher": "rfc-editor.org"}) - #TODO MAYBE (Optional stuff) + # TODO MAYBE (Optional stuff) # R108 License # R115 Creator/Contributor (which would we use?) # F305 Checksum (do they use it?) (or should we put the our digital signature in here somewhere?) @@ -188,4 +281,3 @@ def item_extra_kwargs(self, item): # R118 Keyword return extra - diff --git a/ietf/doc/fields.py b/ietf/doc/fields.py index fde51995094..4a6922bf345 100644 --- a/ietf/doc/fields.py +++ b/ietf/doc/fields.py @@ -13,7 +13,7 @@ import debug # pyflakes:ignore -from ietf.doc.models import Document, DocAlias +from ietf.doc.models import Document from ietf.doc.utils import uppercase_std_abbreviated_name from ietf.utils.fields import SearchableField @@ -69,19 +69,3 @@ def ajax_url(self): class SearchableDocumentField(SearchableDocumentsField): """Specialized to only return one Document""" max_entries = 1 - - -class SearchableDocAliasesField(SearchableDocumentsField): - """Search DocAliases instead of Documents""" - model = DocAlias # type: Type[models.Model] - - def doc_type_filter(self, queryset): - """Filter to include only desired doc type - - For DocAlias, pass through to the docs to check type. - """ - return queryset.filter(docs__type=self.doc_type) - -class SearchableDocAliasField(SearchableDocAliasesField): - """Specialized to only return one DocAlias""" - max_entries = 1 \ No newline at end of file diff --git a/ietf/doc/forms.py b/ietf/doc/forms.py index c0c52571c2f..768d6f96af2 100644 --- a/ietf/doc/forms.py +++ b/ietf/doc/forms.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2013-2020, All Rights Reserved +# Copyright The IETF Trust 2013-2025, All Rights Reserved # -*- coding: utf-8 -*- @@ -8,8 +8,8 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.validators import validate_email -from ietf.doc.fields import SearchableDocAliasesField, SearchableDocAliasField -from ietf.doc.models import RelatedDocument, DocExtResource +from ietf.doc.fields import SearchableDocumentField, SearchableDocumentsField +from ietf.doc.models import RelatedDocument, DocExtResource, State from ietf.iesg.models import TelechatDate from ietf.iesg.utils import telechat_page_count from ietf.person.fields import SearchablePersonField, SearchablePersonsField @@ -61,7 +61,7 @@ class DocAuthorChangeBasisForm(forms.Form): basis = forms.CharField(max_length=255, label='Reason for change', help_text='What is the source or reasoning for the changes to the author list?') - + class AdForm(forms.Form): ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active", role__group__type='area').order_by('name'), label="Shepherding AD", empty_label="(None)", required=True) @@ -134,11 +134,12 @@ class ActionHoldersForm(forms.Form): IESG_APPROVED_STATE_LIST = ("ann", "rfcqueue", "pub") class AddDownrefForm(forms.Form): - rfc = SearchableDocAliasField( + rfc = SearchableDocumentField( label="Referenced RFC", help_text="The RFC that is approved for downref", - required=True) - drafts = SearchableDocAliasesField( + required=True, + doc_type="rfc") + drafts = SearchableDocumentsField( label="Internet-Drafts that makes the reference", help_text="The Internet-Drafts that approve the downref in their Last Call", required=True) @@ -148,7 +149,7 @@ def clean_rfc(self): raise forms.ValidationError("Please provide a referenced RFC and a referencing Internet-Draft") rfc = self.cleaned_data['rfc'] - if not rfc.document.is_rfc(): + if rfc.type_id != "rfc": raise forms.ValidationError("Cannot find the RFC: " + rfc.name) return rfc @@ -158,10 +159,10 @@ def clean_drafts(self): v_err_names = [] drafts = self.cleaned_data['drafts'] - for da in drafts: - state = da.document.get_state("draft-iesg") + for d in drafts: + state = d.get_state("draft-iesg") if not state or state.slug not in IESG_APPROVED_STATE_LIST: - v_err_names.append(da.name) + v_err_names.append(d.name) if v_err_names: raise forms.ValidationError("Internet-Draft is not yet approved: " + ", ".join(v_err_names)) return drafts @@ -173,23 +174,23 @@ def clean(self): v_err_pairs = [] rfc = self.cleaned_data['rfc'] drafts = self.cleaned_data['drafts'] - for da in drafts: - if RelatedDocument.objects.filter(source=da.document, target=rfc, relationship_id='downref-approval'): - v_err_pairs.append(da.name + " --> RFC " + rfc.document.rfc_number()) + for d in drafts: + if RelatedDocument.objects.filter(source=d, target=rfc, relationship_id='downref-approval'): + v_err_pairs.append(f"{d.name} --> RFC {rfc.rfc_number}") if v_err_pairs: raise forms.ValidationError("Downref is already in the registry: " + ", ".join(v_err_pairs)) if 'save_downref_anyway' not in self.data: # this check is skipped if the save_downref_anyway button is used v_err_refnorm = "" - for da in drafts: - if not RelatedDocument.objects.filter(source=da.document, target=rfc, relationship_id='refnorm'): + for d in drafts: + if not RelatedDocument.objects.filter(source=d, target=rfc, relationship_id='refnorm'): if v_err_refnorm: - v_err_refnorm = v_err_refnorm + " or " + da.name + v_err_refnorm = v_err_refnorm + " or " + d.name else: - v_err_refnorm = da.name + v_err_refnorm = d.name if v_err_refnorm: - v_err_refnorm_prefix = "There does not seem to be a normative reference to RFC " + rfc.document.rfc_number() + " by " + v_err_refnorm_prefix = f"There does not seem to be a normative reference to RFC {rfc.rfc_number} by " raise forms.ValidationError(v_err_refnorm_prefix + v_err_refnorm) @@ -265,3 +266,32 @@ def clean(self): @staticmethod def valid_resource_tags(): return ExtResourceName.objects.all().order_by('slug').values_list('slug', flat=True) + +class InvestigateForm(forms.Form): + name_fragment = forms.CharField( + label="File name or fragment to investigate", + required=True, + help_text=( + "Enter a filename such as draft-ietf-some-draft-00.txt or a fragment like draft-ietf-some-draft using at least 8 characters. The search will also work for files that are not necessarily drafts." + ), + min_length=8, + ) + task_id = forms.CharField(required=False, widget=forms.HiddenInput) + + def clean_name_fragment(self): + disallowed_characters = ["%", "/", "\\", "*"] + name_fragment = self.cleaned_data["name_fragment"] + # Manual inspection of the directories at the time of this writing shows + # looking for files with less than 8 characters in the name is not useful + # Requiring this will help protect against the secretariat unintentionally + # matching every draft. + if any(c in name_fragment for c in disallowed_characters): + raise ValidationError(f"The following characters are disallowed: {', '.join(disallowed_characters)}") + return name_fragment + + +class ChangeStatementStateForm(forms.Form): + state = forms.ModelChoiceField( + State.objects.filter(used=True, type="statement"), + empty_label=None, + ) diff --git a/ietf/doc/mails.py b/ietf/doc/mails.py index ddb2843cca8..f20d398c3cb 100644 --- a/ietf/doc/mails.py +++ b/ietf/doc/mails.py @@ -11,7 +11,7 @@ from django.conf import settings from django.urls import reverse as urlreverse from django.utils import timezone -from django.utils.encoding import force_text +from django.utils.encoding import force_str import debug # pyflakes:ignore from ietf.doc.templatetags.mail_filters import std_level_prompt @@ -19,7 +19,7 @@ from ietf.utils import log from ietf.utils.mail import send_mail, send_mail_text from ietf.ipr.utils import iprs_from_docs, related_docs -from ietf.doc.models import WriteupDocEvent, LastCallDocEvent, DocAlias, ConsensusDocEvent +from ietf.doc.models import WriteupDocEvent, LastCallDocEvent, ConsensusDocEvent from ietf.doc.utils import needed_ballot_positions from ietf.doc.utils_bofreq import bofreq_editors, bofreq_responsible from ietf.group.models import Role @@ -54,7 +54,7 @@ def email_ad_approved_doc(request, doc, text): def email_ad_approved_conflict_review(request, review, ok_to_publish): """Email notification when AD approves a conflict review""" - conflictdoc = review.relateddocument_set.get(relationship__slug='conflrev').target.document + conflictdoc = review.relateddocument_set.get(relationship__slug='conflrev').target (to, cc) = gather_address_lists("ad_approved_conflict_review") frm = request.user.person.formatted_email() send_mail(request, @@ -103,6 +103,61 @@ def email_stream_changed(request, doc, old_stream, new_stream, text=""): dict(text=text, url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url()), cc=cc) + +def email_wg_call_for_adoption_issued(request, doc, cfa_duration_weeks=None): + if cfa_duration_weeks is None: + cfa_duration_weeks=2 + (to, cc) = gather_address_lists("doc_wg_call_for_adoption_issued", doc=doc) + frm = request.user.person.formatted_email() + + end_date = date_today(DEADLINE_TZINFO) + datetime.timedelta(days=7 * cfa_duration_weeks) + + subject = f"Call for adoption: {doc.name}-{doc.rev} (Ends {end_date})" + + send_mail( + request, + to, + frm, + subject, + "doc/mail/wg_call_for_adoption_issued.txt", + dict( + doc=doc, + subject=subject, + url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url(), + end_date=end_date, + cfa_duration_weeks=cfa_duration_weeks, + wg_list=doc.group.list_email, + ), + cc=cc, + ) + + +def email_wg_last_call_issued(request, doc, wglc_duration_weeks=None): + if wglc_duration_weeks is None: + wglc_duration_weeks = 2 + (to, cc) = gather_address_lists("doc_wg_last_call_issued", doc=doc) + frm = request.user.person.formatted_email() + + + end_date = date_today(DEADLINE_TZINFO) + datetime.timedelta(days=7 * wglc_duration_weeks) + subject = f"WG Last Call: {doc.name}-{doc.rev} (Ends {end_date})" + + send_mail( + request, + to, + frm, + subject, + "doc/mail/wg_last_call_issued.txt", + dict( + doc=doc, + subject=subject, + url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url(), + end_date=end_date, + wglc_duration_weeks=wglc_duration_weeks, + wg_list=doc.group.list_email, + ), + cc=cc, + ) def email_pulled_from_rfc_queue(request, doc, comment, prev_state, next_state): extra=extra_automation_headers(doc) @@ -175,7 +230,7 @@ def generate_ballot_writeup(request, doc): e.doc = doc e.rev = doc.rev e.desc = "Ballot writeup was generated" - e.text = force_text(render_to_string("doc/mail/ballot_writeup.txt", {'iana': iana, 'doc': doc })) + e.text = force_str(render_to_string("doc/mail/ballot_writeup.txt", {'iana': iana, 'doc': doc })) # caller is responsible for saving, if necessary return e @@ -187,7 +242,7 @@ def generate_ballot_rfceditornote(request, doc): e.doc = doc e.rev = doc.rev e.desc = "RFC Editor Note for ballot was generated" - e.text = force_text(render_to_string("doc/mail/ballot_rfceditornote.txt")) + e.text = force_str(render_to_string("doc/mail/ballot_rfceditornote.txt")) e.save() return e @@ -202,7 +257,7 @@ def generate_last_call_announcement(request, doc): doc.filled_title = textwrap.fill(doc.title, width=70, subsequent_indent=" " * 3) - iprs = iprs_from_docs(related_docs(DocAlias.objects.get(name=doc.canonical_name()))) + iprs = iprs_from_docs(related_docs(Document.objects.get(name=doc.name))) if iprs: ipr_links = [ urlreverse("ietf.ipr.views.show", kwargs=dict(id=i.id)) for i in iprs] ipr_links = [ settings.IDTRACKER_BASE_URL+url if not url.startswith("http") else url for url in ipr_links ] @@ -232,7 +287,7 @@ def generate_last_call_announcement(request, doc): e.doc = doc e.rev = doc.rev e.desc = "Last call announcement was generated" - e.text = force_text(mail) + e.text = force_str(mail) # caller is responsible for saving, if necessary return e @@ -252,7 +307,7 @@ def generate_approval_mail(request, doc): e.doc = doc e.rev = doc.rev e.desc = "Ballot approval text was generated" - e.text = force_text(mail) + e.text = force_str(mail) # caller is responsible for saving, if necessary return e @@ -568,7 +623,7 @@ def email_last_call_expired(doc): send_mail(None, addrs.to, "DraftTracker Mail System ", - "Last Call Expired: %s" % doc.file_tag(), + "IETF Last Call Expired: %s" % doc.file_tag(), "doc/mail/change_notice.txt", dict(text=text, doc=doc, @@ -670,7 +725,7 @@ def send_review_possibly_replaces_request(request, doc, submitter_info): to = set(addrs.to) cc = set(addrs.cc) - possibly_replaces = Document.objects.filter(name__in=[alias.name for alias in doc.related_that_doc("possibly-replaces")]) + possibly_replaces = Document.objects.filter(name__in=[related.name for related in doc.related_that_doc("possibly-replaces")]) for other_doc in possibly_replaces: (other_to, other_cc) = gather_address_lists('doc_replacement_suggested',doc=other_doc) to.update(other_to) diff --git a/ietf/doc/management/commands/find_github_backup_info.py b/ietf/doc/management/commands/find_github_backup_info.py deleted file mode 100644 index f1f71452df2..00000000000 --- a/ietf/doc/management/commands/find_github_backup_info.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright The IETF Trust 2020, All Rights Reserved - - -import github3 - -from collections import Counter -from urllib.parse import urlparse - -from django.conf import settings -from django.core.management.base import BaseCommand, CommandError - -from ietf.doc.models import DocExtResource -from ietf.group.models import GroupExtResource -from ietf.person.models import PersonExtResource - -# TODO: Think more about submodules. This currently will only take top level repos, with the assumption that the clone will include arguments to grab all the submodules. -# As a consequence, we might end up pulling more than we need (or that the org or user expected) -# Make sure this is what we want. - -class Command(BaseCommand): - help = ('Locate information about github repositories to backup') - - def add_arguments(self, parser): - parser.add_argument('--verbose', dest='verbose', action='store_true', help='Show counts of types of repositories') - - def handle(self, *args, **options): - - if not (hasattr(settings,'GITHUB_BACKUP_API_KEY') and settings.GITHUB_BACKUP_API_KEY): - raise CommandError("ERROR: can't find GITHUB_BACKUP_API_KEY") # TODO: at >= py3.1, use returncode - - github = github3.login(token = settings.GITHUB_BACKUP_API_KEY) - owners = dict() - repos = set() - - for cls in (DocExtResource, GroupExtResource, PersonExtResource): - for res in cls.objects.filter(name_id__in=('github_repo','github_org')): - path_parts = urlparse(res.value).path.strip('/').split('/') - if not path_parts or not path_parts[0]: - continue - - owner = path_parts[0] - - if owner not in owners: - try: - gh_owner = github.user(username=owner) - owners[owner] = gh_owner - except github3.exceptions.NotFoundError: - continue - - if gh_owner.type in ('User', 'Organization'): - if len(path_parts) > 1: - repo = path_parts[1] - if (owner, repo) not in repos: - try: - github.repository(owner,repo) - repos.add( (owner, repo) ) - except github3.exceptions.NotFoundError: - continue - else: - for repo in github.repositories_by(owner): - repos.add( (owner, repo.name) ) - - owner_types = Counter([owners[owner].type for owner in owners]) - if options['verbose']: - self.stdout.write("Owners:") - for key in owner_types: - self.stdout.write(" %s: %s"%(key,owner_types[key])) - self.stdout.write("Repositories: %d" % len(repos)) - for repo in sorted(repos): - self.stdout.write(" https://github.com/%s/%s" % repo ) - else: - for repo in sorted(repos): - self.stdout.write("%s/%s" % repo ) - diff --git a/ietf/doc/management/commands/fix_105_slides.py b/ietf/doc/management/commands/fix_105_slides.py deleted file mode 100644 index 377298ea3c7..00000000000 --- a/ietf/doc/management/commands/fix_105_slides.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright The IETF Trust 2019-2020, All Rights Reserved -# -*- coding: utf-8 -*- - - -import os - -from collections import Counter - -from django.core.management.base import BaseCommand - -from ietf.doc.models import DocEvent -from ietf.meeting.models import Meeting, SessionPresentation -from ietf.person.models import Person - -from ietf.meeting.utils import is_powerpoint, post_process - -class Command(BaseCommand): - help = ('Fix uploaded_filename and generate pdf from pptx') - - def add_arguments(self, parser): - parser.add_argument('--dry-run', action='store_true', dest='dry-run', default=False, help='Report on changes that would be made without making them') - - def handle(self, *args, **options): - ietf105 = Meeting.objects.get(number=105) - slides_path = os.path.join(ietf105.get_materials_path(),'slides') - system_person = Person.objects.get(name="(System)") - counts = Counter() - - for sp in SessionPresentation.objects.filter(session__meeting__number=105,document__type='slides'): #.filter(document__name='slides-105-manet-dlep-multicast-support-discussion'): - slides = sp.document - if not os.path.exists(os.path.join(slides_path,slides.uploaded_filename)): - name, ext = os.path.splitext(slides.uploaded_filename) - target_filename = '%s-%s%s' % (name[:name.rfind('-ss')], slides.rev,ext) - if os.path.exists(os.path.join(slides_path,target_filename)): - slides.uploaded_filename = target_filename - if not options['dry-run']: - e = DocEvent.objects.create(doc=slides, rev=slides.rev, by=system_person, type='changed_document', desc='Corrected uploaded_filename') - slides.save_with_history([e]) - counts['uploaded_filename repair succeeded'] += 1 - - else: - self.stderr.write("Unable to repair %s" % slides) - counts['uploaded_filename repair failed'] += 1 - continue - else: - counts['uploaded_filename already ok'] += 1 - - if is_powerpoint(slides): - base, _ = os.path.splitext(slides.uploaded_filename) - if os.path.exists(os.path.join(slides_path,base+'.pdf')): - self.stderr.write("PDF already exists for %s " % slides) - counts['PDF already exists for a repaired file'] += 1 - else: - if not options['dry-run']: - post_process(slides) - counts['PDF conversions'] += 1 - - if options['dry-run']: - self.stdout.write("This is a dry-run. Nothing has actually changed. In a normal run, the output would say the following:") - - for label,count in counts.iteritems(): - self.stdout.write("%s : %d" % (label,count) ) - - diff --git a/ietf/doc/management/commands/generate_draft_aliases.py b/ietf/doc/management/commands/generate_draft_aliases.py deleted file mode 100755 index 88f4aa98cb6..00000000000 --- a/ietf/doc/management/commands/generate_draft_aliases.py +++ /dev/null @@ -1,180 +0,0 @@ -# Copyright The IETF Trust 2012-2021, All Rights Reserved -# -*- coding: utf-8 -*- - -# This was written as a script by Markus Stenberg . -# It was turned into a management command by Russ Housley . - -import datetime -import io -import os -import re -import shutil -import stat -import time - -from tempfile import mkstemp - -from django.conf import settings -from django.core.management.base import BaseCommand -from django.utils import timezone - -import debug # pyflakes:ignore - -from ietf.doc.models import Document -from ietf.group.utils import get_group_role_emails, get_group_ad_emails -from ietf.utils.aliases import dump_sublist -from utils.mail import parseaddr - -DEFAULT_YEARS = 2 - - -def get_draft_ad_emails(doc): - """Get AD email addresses for the given draft, if any.""" - ad_emails = set() - # If working group document, return current WG ADs - if doc.group and doc.group.acronym != 'none': - ad_emails.update(get_group_ad_emails(doc.group)) - # Document may have an explicit AD set - if doc.ad: - ad_emails.add(doc.ad.email_address()) - return ad_emails - - -def get_draft_chair_emails(doc): - """Get chair email addresses for the given draft, if any.""" - chair_emails = set() - if doc.group: - chair_emails.update(get_group_role_emails(doc.group, ['chair', 'secr'])) - return chair_emails - - -def get_draft_shepherd_email(doc): - """Get shepherd email addresses for the given draft, if any.""" - shepherd_email = set() - if doc.shepherd: - shepherd_email.add(doc.shepherd.email_address()) - return shepherd_email - - -def get_draft_authors_emails(doc): - """Get list of authors for the given draft.""" - author_emails = set() - for author in doc.documentauthor_set.all(): - if author.email and author.email.email_address(): - author_emails.add(author.email.email_address()) - return author_emails - - -def get_draft_notify_emails(doc): - """Get list of email addresses to notify for the given draft.""" - ad_email_alias_regex = r"^%s.ad@(%s|%s)$" % (doc.name, settings.DRAFT_ALIAS_DOMAIN, settings.TOOLS_SERVER) - all_email_alias_regex = r"^%s.all@(%s|%s)$" % (doc.name, settings.DRAFT_ALIAS_DOMAIN, settings.TOOLS_SERVER) - author_email_alias_regex = r"^%s@(%s|%s)$" % (doc.name, settings.DRAFT_ALIAS_DOMAIN, settings.TOOLS_SERVER) - notify_email_alias_regex = r"^%s.notify@(%s|%s)$" % (doc.name, settings.DRAFT_ALIAS_DOMAIN, settings.TOOLS_SERVER) - shepherd_email_alias_regex = r"^%s.shepherd@(%s|%s)$" % (doc.name, settings.DRAFT_ALIAS_DOMAIN, settings.TOOLS_SERVER) - notify_emails = set() - if doc.notify: - for e in doc.notify.split(','): - e = e.strip() - if re.search(ad_email_alias_regex, e): - notify_emails.update(get_draft_ad_emails(doc)) - elif re.search(author_email_alias_regex, e): - notify_emails.update(get_draft_authors_emails(doc)) - elif re.search(shepherd_email_alias_regex, e): - notify_emails.update(get_draft_shepherd_email(doc)) - elif re.search(all_email_alias_regex, e): - notify_emails.update(get_draft_ad_emails(doc)) - notify_emails.update(get_draft_authors_emails(doc)) - notify_emails.update(get_draft_shepherd_email(doc)) - elif re.search(notify_email_alias_regex, e): - pass - else: - (name, email) = parseaddr(e) - notify_emails.add(email) - return notify_emails - - -class Command(BaseCommand): - help = ('Generate the draft-aliases and draft-virtual files for Internet-Draft ' - 'mail aliases, placing them in the files configured in ' - 'settings.DRAFT_ALIASES_PATH and settings.DRAFT_VIRTUAL_PATH, ' - 'respectively. The generation includes aliases for Internet-Drafts ' - 'that have seen activity in the last %s years.' % (DEFAULT_YEARS)) - - def handle(self, *args, **options): - show_since = timezone.now() - datetime.timedelta(DEFAULT_YEARS*365) - - date = time.strftime("%Y-%m-%d_%H:%M:%S") - signature = '# Generated by %s at %s\n' % (os.path.abspath(__file__), date) - - ahandle, aname = mkstemp() - os.close(ahandle) - afile = io.open(aname,"w") - - vhandle, vname = mkstemp() - os.close(vhandle) - vfile = io.open(vname,"w") - - afile.write(signature) - vfile.write(signature) - vfile.write("%s anything\n" % settings.DRAFT_VIRTUAL_DOMAIN) - - # Internet-Drafts with active status or expired within DEFAULT_YEARS - drafts = Document.objects.filter(name__startswith='draft-') - active_drafts = drafts.filter(states__slug='active') - inactive_recent_drafts = drafts.exclude(states__slug='active').filter(expires__gte=show_since) - interesting_drafts = active_drafts | inactive_recent_drafts - - alias_domains = ['ietf.org', ] - for draft in interesting_drafts.distinct().iterator(): - # Omit RFCs, unless they were published in the last DEFAULT_YEARS - if draft.docalias.filter(name__startswith='rfc'): - if draft.latest_event(type='published_rfc').time < show_since: - continue - - alias = draft.name - all = set() - - # no suffix and .authors are the same list - emails = get_draft_authors_emails(draft) - all.update(emails) - dump_sublist(afile, vfile, alias, alias_domains, settings.DRAFT_VIRTUAL_DOMAIN, emails) - dump_sublist(afile, vfile, alias+'.authors', alias_domains, settings.DRAFT_VIRTUAL_DOMAIN, emails) - - # .chairs = group chairs - emails = get_draft_chair_emails(draft) - if emails: - all.update(emails) - dump_sublist(afile, vfile, alias+'.chairs', alias_domains, settings.DRAFT_VIRTUAL_DOMAIN, emails) - - # .ad = sponsoring AD / WG AD (WG document) - emails = get_draft_ad_emails(draft) - if emails: - all.update(emails) - dump_sublist(afile, vfile, alias+'.ad', alias_domains, settings.DRAFT_VIRTUAL_DOMAIN, emails) - - # .notify = notify email list from the Document - emails = get_draft_notify_emails(draft) - if emails: - all.update(emails) - dump_sublist(afile, vfile, alias+'.notify', alias_domains, settings.DRAFT_VIRTUAL_DOMAIN, emails) - - # .shepherd = shepherd email from the Document - emails = get_draft_shepherd_email(draft) - if emails: - all.update(emails) - dump_sublist(afile, vfile, alias+'.shepherd', alias_domains, settings.DRAFT_VIRTUAL_DOMAIN, emails) - - # .all = everything from above - dump_sublist(afile, vfile, alias+'.all', alias_domains, settings.DRAFT_VIRTUAL_DOMAIN, all) - - afile.close() - vfile.close() - - os.chmod(aname, stat.S_IWUSR|stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH) - os.chmod(vname, stat.S_IWUSR|stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH) - - shutil.move(aname, settings.DRAFT_ALIASES_PATH) - shutil.move(vname, settings.DRAFT_VIRTUAL_PATH) - - \ No newline at end of file diff --git a/ietf/doc/management/commands/generate_draft_bibxml_files.py b/ietf/doc/management/commands/generate_draft_bibxml_files.py deleted file mode 100644 index eda67c401bb..00000000000 --- a/ietf/doc/management/commands/generate_draft_bibxml_files.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright The IETF Trust 2012-2020, All Rights Reserved -# -*- coding: utf-8 -*- - - -import datetime -import io -import os -import re -import sys - -from django.conf import settings -from django.core.management.base import BaseCommand -from django.utils import timezone - -import debug # pyflakes:ignore - -from ietf.doc.models import NewRevisionDocEvent -from ietf.doc.utils import bibxml_for_draft - -DEFAULT_DAYS = 7 - -class Command(BaseCommand): - help = ('Generate draft bibxml files for xml2rfc references, placing them in the ' - 'directory configured in settings.BIBXML_BASE_PATH: %s. ' - 'By default, generate files as needed for new Internet-Draft revisions from the ' - 'last %s days.' % (settings.BIBXML_BASE_PATH, DEFAULT_DAYS)) - - def add_arguments(self, parser): - parser.add_argument('--all', action='store_true', default=False, help="Process all documents, not only recent submissions") - parser.add_argument('--days', type=int, default=DEFAULT_DAYS, help="Look submissions from the last DAYS days, instead of %s" % DEFAULT_DAYS) - - def say(self, msg): - if self.verbosity > 0: - sys.stdout.write(msg) - sys.stdout.write('\n') - - def note(self, msg): - if self.verbosity > 1: - sys.stdout.write(msg) - sys.stdout.write('\n') - - def mutter(self, msg): - if self.verbosity > 2: - sys.stdout.write(msg) - sys.stdout.write('\n') - - def write(self, fn, new): - # normalize new - new = re.sub(r'\r\n?', r'\n', new) - try: - with io.open(fn, encoding='utf-8') as f: - old = f.read() - except IOError: - old = "" - if old.strip() != new.strip(): - self.note('Writing %s' % os.path.basename(fn)) - with io.open(fn, "w", encoding='utf-8') as f: - f.write(new) - - def handle(self, *args, **options): - self.verbosity = options.get("verbosity", 1) - process_all = options.get("all") - days = options.get("days") - # - bibxmldir = os.path.join(settings.BIBXML_BASE_PATH, 'bibxml-ids') - if not os.path.exists(bibxmldir): - os.makedirs(bibxmldir) - # - if process_all: - doc_events = NewRevisionDocEvent.objects.filter(type='new_revision', doc__type_id='draft') - else: - start = timezone.now() - datetime.timedelta(days=days) - doc_events = NewRevisionDocEvent.objects.filter(type='new_revision', doc__type_id='draft', time__gte=start) - doc_events = doc_events.order_by('time') - - for e in doc_events: - self.mutter('%s %s' % (e.time, e.doc.name)) - try: - doc = e.doc - bibxml = bibxml_for_draft(doc, e.rev) - ref_rev_file_name = os.path.join(bibxmldir, 'reference.I-D.%s-%s.xml' % (doc.name, e.rev)) - self.write(ref_rev_file_name, bibxml) - except Exception as ee: - sys.stderr.write('\n%s-%s: %s\n' % (doc.name, doc.rev, ee)) diff --git a/ietf/doc/management/commands/generate_idnits2_rfc_status.py b/ietf/doc/management/commands/generate_idnits2_rfc_status.py deleted file mode 100644 index 45be1880181..00000000000 --- a/ietf/doc/management/commands/generate_idnits2_rfc_status.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright The IETF Trust 2021 All Rights Reserved - -import os - -from django.conf import settings -from django.core.management.base import BaseCommand - -from ietf.doc.utils import generate_idnits2_rfc_status -from ietf.utils.log import log - -class Command(BaseCommand): - help = ('Generate the rfc_status blob used by idnits2') - - def handle(self, *args, **options): - filename=os.path.join(settings.DERIVED_DIR,'idnits2-rfc-status') - blob = generate_idnits2_rfc_status() - try: - bytes = blob.encode('utf-8') - with open(filename,'wb') as f: - f.write(bytes) - except Exception as e: - log('failed to write idnits2-rfc-status: '+str(e)) - raise e diff --git a/ietf/doc/management/commands/generate_idnits2_rfcs_obsoleted.py b/ietf/doc/management/commands/generate_idnits2_rfcs_obsoleted.py deleted file mode 100644 index 8bd122e87ef..00000000000 --- a/ietf/doc/management/commands/generate_idnits2_rfcs_obsoleted.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright The IETF Trust 2021 All Rights Reserved - -import os - -from django.conf import settings -from django.core.management.base import BaseCommand - -from ietf.doc.utils import generate_idnits2_rfcs_obsoleted -from ietf.utils.log import log - -class Command(BaseCommand): - help = ('Generate the rfcs-obsoleted file used by idnits2') - - def handle(self, *args, **options): - filename=os.path.join(settings.DERIVED_DIR,'idnits2-rfcs-obsoleted') - blob = generate_idnits2_rfcs_obsoleted() - try: - bytes = blob.encode('utf-8') - with open(filename,'wb') as f: - f.write(bytes) - except Exception as e: - log('failed to write idnits2-rfcs-obsoleted: '+str(e)) - raise e diff --git a/ietf/doc/management/commands/reset_rfc_authors.py b/ietf/doc/management/commands/reset_rfc_authors.py new file mode 100644 index 00000000000..e2ab5f12081 --- /dev/null +++ b/ietf/doc/management/commands/reset_rfc_authors.py @@ -0,0 +1,69 @@ +# Copyright The IETF Trust 2024, All Rights Reserved + +# Reset an RFC's authors to those of the draft it came from +from django.core.management.base import BaseCommand, CommandError + +from ietf.doc.models import Document, DocEvent +from ietf.person.models import Person + + +class Command(BaseCommand): + def add_arguments(self, parser): + parser.add_argument("rfcnum", type=int, help="RFC number to modify") + parser.add_argument( + "--force", + action="store_true", + help="reset even if RFC already has authors", + ) + + def handle(self, *args, **options): + try: + rfc = Document.objects.get(type="rfc", rfc_number=options["rfcnum"]) + except Document.DoesNotExist: + raise CommandError( + f"rfc{options['rfcnum']} does not exist in the Datatracker." + ) + + draft = rfc.came_from_draft() + if draft is None: + raise CommandError(f"{rfc.name} did not come from a draft. Can't reset.") + + orig_authors = rfc.documentauthor_set.all() + if orig_authors.exists(): + # Potentially dangerous, so refuse unless "--force" is specified + if not options["force"]: + raise CommandError( + f"{rfc.name} already has authors. Not resetting. Use '--force' to reset anyway." + ) + removed_auth_names = list(orig_authors.values_list("person__name", flat=True)) + rfc.documentauthor_set.all().delete() + DocEvent.objects.create( + doc=rfc, + by=Person.objects.get(name="(System)"), + type="edited_authors", + desc=f"Removed all authors: {', '.join(removed_auth_names)}", + ) + self.stdout.write( + self.style.SUCCESS( + f"Removed author(s): {', '.join(removed_auth_names)}" + ) + ) + + for author in draft.documentauthor_set.all(): + # Copy the author but point at the new doc. + # See https://docs.djangoproject.com/en/4.2/topics/db/queries/#copying-model-instances + author.pk = None + author.id = None + author._state.adding = True + author.document = rfc + author.save() + self.stdout.write( + self.style.SUCCESS(f"Added author {author.person.name} <{author.email}>") + ) + auth_names = draft.documentauthor_set.values_list("person__name", flat=True) + DocEvent.objects.create( + doc=rfc, + by=Person.objects.get(name="(System)"), + type="edited_authors", + desc=f"Set authors from rev {draft.rev} of {draft.name}: {', '.join(auth_names)}", + ) diff --git a/ietf/doc/management/commands/tests.py b/ietf/doc/management/commands/tests.py new file mode 100644 index 00000000000..8244d872663 --- /dev/null +++ b/ietf/doc/management/commands/tests.py @@ -0,0 +1,72 @@ +# Copyright The IETF Trust 2024, All Rights Reserved +# -*- coding: utf-8 -*- + +from io import StringIO + +from django.core.management import call_command, CommandError + +from ietf.doc.factories import DocumentAuthorFactory, WgDraftFactory, WgRfcFactory +from ietf.doc.models import Document, DocumentAuthor +from ietf.utils.test_utils import TestCase + + +class CommandTests(TestCase): + @staticmethod + def _call_command(command_name, *args, **options): + """Call command, capturing (and suppressing) output""" + out = StringIO() + err = StringIO() + options["stdout"] = out + options["stderr"] = err + call_command(command_name, *args, **options) + return out.getvalue(), err.getvalue() + + def test_reset_rfc_authors(self): + command_name = "reset_rfc_authors" + + draft = WgDraftFactory() + DocumentAuthorFactory.create_batch(3, document=draft) + rfc = WgRfcFactory() # rfc does not yet have a draft + DocumentAuthorFactory.create_batch(3, document=rfc) + bad_rfc_num = ( + 1 + + Document.objects.filter(rfc_number__isnull=False) + .order_by("-rfc_number") + .first() + .rfc_number + ) + docauthor_fields = [ + field.name + for field in DocumentAuthor._meta.get_fields() + if field.name not in ["document", "id"] + ] + + with self.assertRaises(CommandError, msg="Cannot reset a bad RFC number"): + self._call_command(command_name, bad_rfc_num) + + with self.assertRaises(CommandError, msg="Cannot reset an RFC with no draft"): + self._call_command(command_name, rfc.rfc_number) + + with self.assertRaises(CommandError, msg="Cannot force-reset an RFC with no draft"): + self._call_command(command_name, rfc.rfc_number, "--force") + + # Link the draft to the rfc + rfc.targets_related.create(relationship_id="became_rfc", source=draft) + + with self.assertRaises(CommandError, msg="Cannot reset an RFC with authors"): + self._call_command(command_name, rfc.rfc_number) + + # Calling with force should work + self._call_command(command_name, rfc.rfc_number, "--force") + self.assertCountEqual( + draft.documentauthor_set.values(*docauthor_fields), + rfc.documentauthor_set.values(*docauthor_fields), + ) + + # Calling on an RFC with no authors should also work + rfc.documentauthor_set.all().delete() + self._call_command(command_name, rfc.rfc_number) + self.assertCountEqual( + draft.documentauthor_set.values(*docauthor_fields), + rfc.documentauthor_set.values(*docauthor_fields), + ) diff --git a/ietf/doc/migrations/0004_alter_dochistory_ad_alter_dochistory_shepherd_and_more.py b/ietf/doc/migrations/0004_alter_dochistory_ad_alter_dochistory_shepherd_and_more.py new file mode 100644 index 00000000000..adc0e696272 --- /dev/null +++ b/ietf/doc/migrations/0004_alter_dochistory_ad_alter_dochistory_shepherd_and_more.py @@ -0,0 +1,36 @@ +# Generated by Django 4.0.10 on 2023-05-16 20:36 + +from django.db import migrations +import django.db.models.deletion +import ietf.utils.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('person', '0001_initial'), + ('doc', '0003_remove_document_info_order'), + ] + + operations = [ + migrations.AlterField( + model_name='dochistory', + name='ad', + field=ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ad_%(class)s_set', to='person.person', verbose_name='area director'), + ), + migrations.AlterField( + model_name='dochistory', + name='shepherd', + field=ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='shepherd_%(class)s_set', to='person.email'), + ), + migrations.AlterField( + model_name='document', + name='ad', + field=ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ad_%(class)s_set', to='person.person', verbose_name='area director'), + ), + migrations.AlterField( + model_name='document', + name='shepherd', + field=ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='shepherd_%(class)s_set', to='person.email'), + ), + ] diff --git a/ietf/doc/migrations/0005_alter_docevent_type.py b/ietf/doc/migrations/0005_alter_docevent_type.py new file mode 100644 index 00000000000..f8a3cfc7959 --- /dev/null +++ b/ietf/doc/migrations/0005_alter_docevent_type.py @@ -0,0 +1,86 @@ +# Copyright The IETF Trust 2023, All Rights Reserved + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0004_alter_dochistory_ad_alter_dochistory_shepherd_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="docevent", + name="type", + field=models.CharField( + choices=[ + ("new_revision", "Added new revision"), + ("new_submission", "Uploaded new revision"), + ("changed_document", "Changed document metadata"), + ("added_comment", "Added comment"), + ("added_message", "Added message"), + ("edited_authors", "Edited the documents author list"), + ("deleted", "Deleted document"), + ("changed_state", "Changed state"), + ("changed_stream", "Changed document stream"), + ("expired_document", "Expired document"), + ("extended_expiry", "Extended expiry of document"), + ("requested_resurrect", "Requested resurrect"), + ("completed_resurrect", "Completed resurrect"), + ("changed_consensus", "Changed consensus"), + ("published_rfc", "Published RFC"), + ( + "added_suggested_replaces", + "Added suggested replacement relationships", + ), + ( + "reviewed_suggested_replaces", + "Reviewed suggested replacement relationships", + ), + ("changed_action_holders", "Changed action holders for document"), + ("changed_group", "Changed group"), + ("changed_protocol_writeup", "Changed protocol writeup"), + ("changed_charter_milestone", "Changed charter milestone"), + ("initial_review", "Set initial review time"), + ("changed_review_announcement", "Changed WG Review text"), + ("changed_action_announcement", "Changed WG Action text"), + ("started_iesg_process", "Started IESG process on document"), + ("created_ballot", "Created ballot"), + ("closed_ballot", "Closed ballot"), + ("sent_ballot_announcement", "Sent ballot announcement"), + ("changed_ballot_position", "Changed ballot position"), + ("changed_ballot_approval_text", "Changed ballot approval text"), + ("changed_ballot_writeup_text", "Changed ballot writeup text"), + ("changed_rfc_editor_note_text", "Changed RFC Editor Note text"), + ("changed_last_call_text", "Changed last call text"), + ("requested_last_call", "Requested last call"), + ("sent_last_call", "Sent last call"), + ("scheduled_for_telechat", "Scheduled for telechat"), + ("iesg_approved", "IESG approved document (no problem)"), + ("iesg_disapproved", "IESG disapproved document (do not publish)"), + ("approved_in_minute", "Approved in minute"), + ("iana_review", "IANA review comment"), + ("rfc_in_iana_registry", "RFC is in IANA registry"), + ( + "rfc_editor_received_announcement", + "Announcement was received by RFC Editor", + ), + ("requested_publication", "Publication at RFC Editor requested"), + ( + "sync_from_rfc_editor", + "Received updated information from RFC Editor", + ), + ("requested_review", "Requested review"), + ("assigned_review_request", "Assigned review request"), + ("closed_review_request", "Closed review request"), + ("closed_review_assignment", "Closed review assignment"), + ("downref_approved", "Downref approved"), + ("posted_related_ipr", "Posted related IPR"), + ("removed_related_ipr", "Removed related IPR"), + ("changed_editors", "Changed BOF Request editors"), + ("published_statement", "Published statement"), + ], + max_length=50, + ), + ), + ] diff --git a/ietf/doc/migrations/0006_statements.py b/ietf/doc/migrations/0006_statements.py new file mode 100644 index 00000000000..9a074292e5c --- /dev/null +++ b/ietf/doc/migrations/0006_statements.py @@ -0,0 +1,43 @@ +# Copyright The IETF Trust 2023, All Rights Reserved + +from django.db import migrations + + +def forward(apps, schema_editor): + StateType = apps.get_model("doc", "StateType") + State = apps.get_model("doc", "State") + + StateType.objects.create(slug="statement", label="Statement State") + State.objects.create( + slug="active", + type_id="statement", + name="Active", + order=0, + desc="The statement is active", + ) + State.objects.create( + slug="replaced", + type_id="statement", + name="Replaced", + order=0, + desc="The statement has been replaced", + ) + + +def reverse(apps, schema_editor): + StateType = apps.get_model("doc", "StateType") + State = apps.get_model("doc", "State") + + State.objects.filter(type_id="statement").delete() + StateType.objects.filter(slug="statement").delete() + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0005_alter_docevent_type"), + ("name", "0004_statements"), + ] + + operations = [ + migrations.RunPython(forward, reverse), + ] diff --git a/ietf/doc/migrations/0007_alter_docevent_type.py b/ietf/doc/migrations/0007_alter_docevent_type.py new file mode 100644 index 00000000000..c98144d70fe --- /dev/null +++ b/ietf/doc/migrations/0007_alter_docevent_type.py @@ -0,0 +1,90 @@ +# Generated by Django 4.2.4 on 2023-08-23 21:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0006_statements"), + ] + + operations = [ + migrations.AlterField( + model_name="docevent", + name="type", + field=models.CharField( + choices=[ + ("new_revision", "Added new revision"), + ("new_submission", "Uploaded new revision"), + ("changed_document", "Changed document metadata"), + ("added_comment", "Added comment"), + ("added_message", "Added message"), + ("edited_authors", "Edited the documents author list"), + ("deleted", "Deleted document"), + ("changed_state", "Changed state"), + ("changed_stream", "Changed document stream"), + ("expired_document", "Expired document"), + ("extended_expiry", "Extended expiry of document"), + ("requested_resurrect", "Requested resurrect"), + ("completed_resurrect", "Completed resurrect"), + ("changed_consensus", "Changed consensus"), + ("published_rfc", "Published RFC"), + ( + "added_suggested_replaces", + "Added suggested replacement relationships", + ), + ( + "reviewed_suggested_replaces", + "Reviewed suggested replacement relationships", + ), + ("changed_action_holders", "Changed action holders for document"), + ("changed_group", "Changed group"), + ("changed_protocol_writeup", "Changed protocol writeup"), + ("changed_charter_milestone", "Changed charter milestone"), + ("initial_review", "Set initial review time"), + ("changed_review_announcement", "Changed WG Review text"), + ("changed_action_announcement", "Changed WG Action text"), + ("started_iesg_process", "Started IESG process on document"), + ("created_ballot", "Created ballot"), + ("closed_ballot", "Closed ballot"), + ("sent_ballot_announcement", "Sent ballot announcement"), + ("changed_ballot_position", "Changed ballot position"), + ("changed_ballot_approval_text", "Changed ballot approval text"), + ("changed_ballot_writeup_text", "Changed ballot writeup text"), + ("changed_rfc_editor_note_text", "Changed RFC Editor Note text"), + ("changed_last_call_text", "Changed last call text"), + ("requested_last_call", "Requested last call"), + ("sent_last_call", "Sent last call"), + ("scheduled_for_telechat", "Scheduled for telechat"), + ("iesg_approved", "IESG approved document (no problem)"), + ("iesg_disapproved", "IESG disapproved document (do not publish)"), + ("approved_in_minute", "Approved in minute"), + ("iana_review", "IANA review comment"), + ("rfc_in_iana_registry", "RFC is in IANA registry"), + ( + "rfc_editor_received_announcement", + "Announcement was received by RFC Editor", + ), + ("requested_publication", "Publication at RFC Editor requested"), + ( + "sync_from_rfc_editor", + "Received updated information from RFC Editor", + ), + ("requested_review", "Requested review"), + ("assigned_review_request", "Assigned review request"), + ("closed_review_request", "Closed review request"), + ("closed_review_assignment", "Closed review assignment"), + ("downref_approved", "Downref approved"), + ("posted_related_ipr", "Posted related IPR"), + ("removed_related_ipr", "Removed related IPR"), + ( + "removed_objfalse_related_ipr", + "Removed Objectively False related IPR", + ), + ("changed_editors", "Changed BOF Request editors"), + ("published_statement", "Published statement"), + ], + max_length=50, + ), + ), + ] diff --git a/ietf/doc/migrations/0008_alter_docevent_type.py b/ietf/doc/migrations/0008_alter_docevent_type.py new file mode 100644 index 00000000000..52a75f074b3 --- /dev/null +++ b/ietf/doc/migrations/0008_alter_docevent_type.py @@ -0,0 +1,91 @@ +# Generated by Django 4.2.7 on 2023-11-04 13:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0007_alter_docevent_type"), + ] + + operations = [ + migrations.AlterField( + model_name="docevent", + name="type", + field=models.CharField( + choices=[ + ("new_revision", "Added new revision"), + ("new_submission", "Uploaded new revision"), + ("changed_document", "Changed document metadata"), + ("added_comment", "Added comment"), + ("added_message", "Added message"), + ("edited_authors", "Edited the documents author list"), + ("deleted", "Deleted document"), + ("changed_state", "Changed state"), + ("changed_stream", "Changed document stream"), + ("expired_document", "Expired document"), + ("extended_expiry", "Extended expiry of document"), + ("requested_resurrect", "Requested resurrect"), + ("completed_resurrect", "Completed resurrect"), + ("changed_consensus", "Changed consensus"), + ("published_rfc", "Published RFC"), + ( + "added_suggested_replaces", + "Added suggested replacement relationships", + ), + ( + "reviewed_suggested_replaces", + "Reviewed suggested replacement relationships", + ), + ("changed_action_holders", "Changed action holders for document"), + ("changed_group", "Changed group"), + ("changed_protocol_writeup", "Changed protocol writeup"), + ("changed_charter_milestone", "Changed charter milestone"), + ("initial_review", "Set initial review time"), + ("changed_review_announcement", "Changed WG Review text"), + ("changed_action_announcement", "Changed WG Action text"), + ("started_iesg_process", "Started IESG process on document"), + ("created_ballot", "Created ballot"), + ("closed_ballot", "Closed ballot"), + ("sent_ballot_announcement", "Sent ballot announcement"), + ("changed_ballot_position", "Changed ballot position"), + ("changed_ballot_approval_text", "Changed ballot approval text"), + ("changed_ballot_writeup_text", "Changed ballot writeup text"), + ("changed_rfc_editor_note_text", "Changed RFC Editor Note text"), + ("changed_last_call_text", "Changed last call text"), + ("requested_last_call", "Requested last call"), + ("sent_last_call", "Sent last call"), + ("scheduled_for_telechat", "Scheduled for telechat"), + ("iesg_approved", "IESG approved document (no problem)"), + ("iesg_disapproved", "IESG disapproved document (do not publish)"), + ("approved_in_minute", "Approved in minute"), + ("iana_review", "IANA review comment"), + ("rfc_in_iana_registry", "RFC is in IANA registry"), + ( + "rfc_editor_received_announcement", + "Announcement was received by RFC Editor", + ), + ("requested_publication", "Publication at RFC Editor requested"), + ( + "sync_from_rfc_editor", + "Received updated information from RFC Editor", + ), + ("requested_review", "Requested review"), + ("assigned_review_request", "Assigned review request"), + ("closed_review_request", "Closed review request"), + ("closed_review_assignment", "Closed review assignment"), + ("downref_approved", "Downref approved"), + ("posted_related_ipr", "Posted related IPR"), + ("removed_related_ipr", "Removed related IPR"), + ( + "removed_objfalse_related_ipr", + "Removed Objectively False related IPR", + ), + ("changed_editors", "Changed BOF Request editors"), + ("published_statement", "Published statement"), + ("approved_slides", "Slides approved"), + ], + max_length=50, + ), + ), + ] diff --git a/ietf/doc/migrations/0009_add_rfc_states.py b/ietf/doc/migrations/0009_add_rfc_states.py new file mode 100644 index 00000000000..07a6ac0205f --- /dev/null +++ b/ietf/doc/migrations/0009_add_rfc_states.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.2 on 2023-06-14 20:57 + +from django.db import migrations + + +def forward(apps, schema_editor): + StateType = apps.get_model("doc", "StateType") + rfc_statetype, _ = StateType.objects.get_or_create(slug="rfc", label="State") + + State = apps.get_model("doc", "State") + State.objects.get_or_create( + type=rfc_statetype, slug="published", name="Published", used=True, order=1 + ) + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0008_alter_docevent_type"), + ] + + operations = [ + migrations.RunPython(forward), + ] diff --git a/ietf/doc/migrations/0010_dochistory_rfc_number_document_rfc_number.py b/ietf/doc/migrations/0010_dochistory_rfc_number_document_rfc_number.py new file mode 100644 index 00000000000..26b2a85c622 --- /dev/null +++ b/ietf/doc/migrations/0010_dochistory_rfc_number_document_rfc_number.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.2 on 2023-06-14 22:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0009_add_rfc_states"), + ] + + operations = [ + migrations.AddField( + model_name="dochistory", + name="rfc_number", + field=models.PositiveIntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name="document", + name="rfc_number", + field=models.PositiveIntegerField(blank=True, null=True), + ), + ] diff --git a/ietf/doc/migrations/0011_create_rfc_documents.py b/ietf/doc/migrations/0011_create_rfc_documents.py new file mode 100644 index 00000000000..466ff81bb0f --- /dev/null +++ b/ietf/doc/migrations/0011_create_rfc_documents.py @@ -0,0 +1,76 @@ +# Generated by Django 4.2.2 on 2023-06-15 15:27 + +from django.db import migrations + + +def forward(apps, schema_editor): + Document = apps.get_model("doc", "Document") + DocAlias = apps.get_model("doc", "DocAlias") + DocumentAuthor = apps.get_model("doc", "DocumentAuthor") + + State = apps.get_model("doc", "State") + draft_rfc_state = State.objects.get(type_id="draft", slug="rfc") + rfc_published_state = State.objects.get(type_id="rfc", slug="published") + + # Find draft Documents in the "rfc" state + found_by_state = Document.objects.filter(states=draft_rfc_state).distinct() + + # Find Documents with an "rfc..." alias and confirm they're the same set + rfc_docaliases = DocAlias.objects.filter(name__startswith="rfc") + found_by_name = Document.objects.filter(docalias__in=rfc_docaliases).distinct() + assert set(found_by_name) == set(found_by_state), "mismatch between rfcs identified by state and docalias" + + # As of 2023-06-15, there is one Document with two rfc aliases: rfc6312 and rfc6342 are the same Document. This + # was due to a publication error. Because we go alias-by-alias, no special handling is needed in this migration. + + for rfc_alias in rfc_docaliases.order_by("name"): + assert rfc_alias.docs.count() == 1, f"DocAlias {rfc_alias} is linked to more than 1 Document" + draft = rfc_alias.docs.first() + if draft.name.startswith("rfc"): + rfc = draft + rfc.type_id = "rfc" + rfc.rfc_number = int(draft.name[3:]) + rfc.save() + rfc.states.set([rfc_published_state]) + else: + rfc = Document.objects.create( + type_id="rfc", + name=rfc_alias.name, + rfc_number=int(rfc_alias.name[3:]), + time=draft.time, + title=draft.title, + stream=draft.stream, + group=draft.group, + abstract=draft.abstract, + pages=draft.pages, + words=draft.words, + std_level=draft.std_level, + ad=draft.ad, + external_url=draft.external_url, + uploaded_filename=draft.uploaded_filename, + note=draft.note, + ) + rfc.states.set([rfc_published_state]) + rfc.formal_languages.set(draft.formal_languages.all()) + + # Copy Authors + for da in draft.documentauthor_set.all(): + DocumentAuthor.objects.create( + document=rfc, + person=da.person, + email=da.email, + affiliation=da.affiliation, + country=da.country, + order=da.order, + ) + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0010_dochistory_rfc_number_document_rfc_number"), + ("name", "0010_rfc_doctype_names"), + ] + + operations = [ + migrations.RunPython(forward), + ] diff --git a/ietf/doc/migrations/0012_move_rfc_docevents.py b/ietf/doc/migrations/0012_move_rfc_docevents.py new file mode 100644 index 00000000000..9969a8f0add --- /dev/null +++ b/ietf/doc/migrations/0012_move_rfc_docevents.py @@ -0,0 +1,88 @@ +# Generated by Django 4.2.2 on 2023-06-20 18:36 + +from django.db import migrations +from django.db.models import Q + + +def forward(apps, schema_editor): + """Move RFC events from the draft to the rfc Document""" + DocAlias = apps.get_model("doc", "DocAlias") + DocEvent = apps.get_model("doc", "DocEvent") + Document = apps.get_model("doc", "Document") + + # queryset with events migrated regardless of whether before or after the "published_rfc" event + events_always_migrated = DocEvent.objects.filter( + Q( + type__in=[ + "published_rfc", # do not remove this one! + ] + ) + ) + + # queryset with events migrated only after the "published_rfc" event + events_migrated_after_pub = DocEvent.objects.exclude( + type__in=[ + "created_ballot", + "closed_ballot", + "sent_ballot_announcement", + "changed_ballot_position", + "changed_ballot_approval_text", + "changed_ballot_writeup_text", + ] + ).exclude( + type="added_comment", + desc__contains="ballot set", # excludes 311 comments that all apply to drafts + ) + + # special case for rfc 6312/6342 draft, which has two published_rfc events + ignore = ["rfc6312", "rfc6342"] # do not reprocess these later + rfc6312 = Document.objects.get(name="rfc6312") + rfc6342 = Document.objects.get(name="rfc6342") + draft = DocAlias.objects.get(name="rfc6312").docs.first() + assert draft == DocAlias.objects.get(name="rfc6342").docs.first() + published_events = list( + DocEvent.objects.filter(doc=draft, type="published_rfc").order_by("time") + ) + assert len(published_events) == 2 + ( + pub_event_6312, + pub_event_6342, + ) = published_events # order matches pub dates at rfc-editor.org + + pub_event_6312.doc = rfc6312 + pub_event_6312.save() + events_migrated_after_pub.filter( + doc=draft, + time__gte=pub_event_6312.time, + time__lt=pub_event_6342.time, + ).update(doc=rfc6312) + + pub_event_6342.doc = rfc6342 + pub_event_6342.save() + events_migrated_after_pub.filter( + doc=draft, + time__gte=pub_event_6342.time, + ).update(doc=rfc6342) + + # Now handle all the rest + for rfc in Document.objects.filter(type_id="rfc").exclude(name__in=ignore): + draft = DocAlias.objects.get(name=rfc.name).docs.first() + assert draft is not None + published_event = DocEvent.objects.get(doc=draft, type="published_rfc") + events_always_migrated.filter( + doc=draft, + ).update(doc=rfc) + events_migrated_after_pub.filter( + doc=draft, + time__gte=published_event.time, + ).update(doc=rfc) + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0011_create_rfc_documents"), + ] + + operations = [ + migrations.RunPython(forward), + ] diff --git a/ietf/doc/migrations/0013_rfc_relateddocuments.py b/ietf/doc/migrations/0013_rfc_relateddocuments.py new file mode 100644 index 00000000000..9baddaebdb5 --- /dev/null +++ b/ietf/doc/migrations/0013_rfc_relateddocuments.py @@ -0,0 +1,45 @@ +# Generated by Django 4.2.3 on 2023-07-05 22:40 + +from django.db import migrations + + +def forward(apps, schema_editor): + DocAlias = apps.get_model("doc", "DocAlias") + Document = apps.get_model("doc", "Document") + RelatedDocument = apps.get_model("doc", "RelatedDocument") + for rfc_alias in DocAlias.objects.filter(name__startswith="rfc").exclude( + docs__type_id="rfc" + ): + # Move these over to the RFC + RelatedDocument.objects.filter( + relationship__slug__in=( + "tobcp", + "toexp", + "tohist", + "toinf", + "tois", + "tops", + "obs", + "updates", + ), + source__docalias=rfc_alias, + ).update(source=Document.objects.get(name=rfc_alias.name)) + # Duplicate references on the RFC but keep the ones on the draft as well + originals = list( + RelatedDocument.objects.filter( + relationship__slug__in=("refinfo", "refnorm", "refold", "refunk"), + source__docalias=rfc_alias, + ) + ) + for o in originals: + o.pk = None + o.source = Document.objects.get(name=rfc_alias.name) + RelatedDocument.objects.bulk_create(originals) + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0012_move_rfc_docevents"), + ] + + operations = [migrations.RunPython(forward)] diff --git a/ietf/doc/migrations/0014_move_rfc_docaliases.py b/ietf/doc/migrations/0014_move_rfc_docaliases.py new file mode 100644 index 00000000000..c82a98e0526 --- /dev/null +++ b/ietf/doc/migrations/0014_move_rfc_docaliases.py @@ -0,0 +1,38 @@ +# Generated by Django 4.2.2 on 2023-06-20 18:36 + +from django.db import migrations + + +def forward(apps, schema_editor): + """Point "rfc..." DocAliases at the rfc-type Document + + Creates a became_rfc RelatedDocument to preserve the connection between the draft and the rfc. + """ + DocAlias = apps.get_model("doc", "DocAlias") + Document = apps.get_model("doc", "Document") + RelatedDocument = apps.get_model("doc", "RelatedDocument") + + for rfc_alias in DocAlias.objects.filter(name__startswith="rfc"): + rfc = Document.objects.get(name=rfc_alias.name) + aliased_doc = rfc_alias.docs.get() # implicitly confirms only one value in rfc_alias.docs + if aliased_doc != rfc: + # If the DocAlias was not already pointing at the rfc, it was pointing at the draft + # it came from. Create the relationship between draft and rfc Documents. + assert aliased_doc.type_id == "draft", f"Alias for {rfc.name} should be pointing at a draft" + RelatedDocument.objects.create( + source=aliased_doc, + target=rfc_alias, + relationship_id="became_rfc", + ) + # Now move the alias from the draft to the rfc + rfc_alias.docs.set([rfc]) + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0013_rfc_relateddocuments"), + ] + + operations = [ + migrations.RunPython(forward), + ] diff --git a/ietf/doc/migrations/0015_relate_no_aliases.py b/ietf/doc/migrations/0015_relate_no_aliases.py new file mode 100644 index 00000000000..4ba3dd96070 --- /dev/null +++ b/ietf/doc/migrations/0015_relate_no_aliases.py @@ -0,0 +1,84 @@ +# Generated by Django 4.2.2 on 2023-06-16 13:40 + +from django.db import migrations +import django.db.models.deletion +from django.db.models import F, Subquery, OuterRef, CharField +import ietf.utils.models + +def forward(apps, schema_editor): + RelatedDocument = apps.get_model("doc", "RelatedDocument") + DocAlias = apps.get_model("doc", "DocAlias") + target_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1]) + name_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("name")[:1]) + RelatedDocument.objects.annotate(firstdoc=target_subquery).annotate(aliasname=name_subquery).update(target=F("firstdoc"),originaltargetaliasname=F("aliasname")) + +def reverse(apps, schema_editor): + pass + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0014_move_rfc_docaliases"), + ] + + operations = [ + migrations.AlterField( + model_name='relateddocument', + name='target', + field=ietf.utils.models.ForeignKey( + db_index=False, + on_delete=django.db.models.deletion.CASCADE, + to='doc.docalias', + ), + ), + migrations.RenameField( + model_name="relateddocument", + old_name="target", + new_name="deprecated_target" + ), + migrations.AlterField( + model_name='relateddocument', + name='deprecated_target', + field=ietf.utils.models.ForeignKey( + db_index=True, + on_delete=django.db.models.deletion.CASCADE, + to='doc.docalias', + ), + ), + migrations.AddField( + model_name="relateddocument", + name="target", + field=ietf.utils.models.ForeignKey( + default=1, # A lie, but a convenient one - no relations point here. + on_delete=django.db.models.deletion.CASCADE, + related_name="targets_related", + to="doc.document", + db_index=False, + ), + preserve_default=False, + ), + migrations.AddField( + model_name="relateddocument", + name="originaltargetaliasname", + field=CharField(max_length=255,null=True,blank=True), + preserve_default=True, + ), + migrations.RunPython(forward, reverse), + migrations.AlterField( + model_name="relateddocument", + name="target", + field=ietf.utils.models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="targets_related", + to="doc.document", + db_index=True, + ), + ), + migrations.RemoveField( + model_name="relateddocument", + name="deprecated_target", + field=ietf.utils.models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='doc.DocAlias', + ), + ), + ] diff --git a/ietf/doc/migrations/0016_relate_hist_no_aliases.py b/ietf/doc/migrations/0016_relate_hist_no_aliases.py new file mode 100644 index 00000000000..df5fb3c3259 --- /dev/null +++ b/ietf/doc/migrations/0016_relate_hist_no_aliases.py @@ -0,0 +1,87 @@ +# Generated by Django 4.2.2 on 2023-06-16 13:40 + +from django.db import migrations +import django.db.models.deletion +from django.db.models import F, Subquery, OuterRef, CharField +import ietf.utils.models + +def forward(apps, schema_editor): + RelatedDocHistory = apps.get_model("doc", "RelatedDocHistory") + DocAlias = apps.get_model("doc", "DocAlias") + target_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1]) + name_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("name")[:1]) + RelatedDocHistory.objects.annotate(firstdoc=target_subquery).annotate(aliasname=name_subquery).update(target=F("firstdoc"),originaltargetaliasname=F("aliasname")) + +def reverse(apps, schema_editor): + pass + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0015_relate_no_aliases"), + ] + + operations = [ + migrations.AlterField( + model_name='relateddochistory', + name='target', + field=ietf.utils.models.ForeignKey( + db_index=False, + on_delete=django.db.models.deletion.CASCADE, + to='doc.docalias', + related_name='reversely_related_document_history_set', + ), + ), + migrations.RenameField( + model_name="relateddochistory", + old_name="target", + new_name="deprecated_target" + ), + migrations.AlterField( + model_name='relateddochistory', + name='deprecated_target', + field=ietf.utils.models.ForeignKey( + db_index=True, + on_delete=django.db.models.deletion.CASCADE, + to='doc.docalias', + related_name='deprecated_reversely_related_document_history_set', + ), + ), + migrations.AddField( + model_name="relateddochistory", + name="target", + field=ietf.utils.models.ForeignKey( + default=1, # A lie, but a convenient one - no relations point here. + on_delete=django.db.models.deletion.CASCADE, + to="doc.document", + db_index=False, + related_name='reversely_related_document_history_set', + ), + preserve_default=False, + ), + migrations.AddField( + model_name="relateddochistory", + name="originaltargetaliasname", + field=CharField(max_length=255,null=True,blank=True), + preserve_default=True, + ), + migrations.RunPython(forward, reverse), + migrations.AlterField( + model_name="relateddochistory", + name="target", + field=ietf.utils.models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="doc.document", + db_index=True, + related_name='reversely_related_document_history_set', + ), + ), + migrations.RemoveField( + model_name="relateddochistory", + name="deprecated_target", + field=ietf.utils.models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='doc.DocAlias', + related_name='deprecated_reversely_related_document_history_set', + ), + ), + ] diff --git a/ietf/doc/migrations/0017_delete_docalias.py b/ietf/doc/migrations/0017_delete_docalias.py new file mode 100644 index 00000000000..207ca81e155 --- /dev/null +++ b/ietf/doc/migrations/0017_delete_docalias.py @@ -0,0 +1,16 @@ +# Copyright The IETF Trust 2023, All Rights Reserved + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("ipr", "0002_iprdocrel_no_aliases"), + ("doc", "0016_relate_hist_no_aliases"), + ] + + operations = [ + migrations.DeleteModel( + name="DocAlias", + ), + ] diff --git a/ietf/doc/migrations/0018_move_dochistory.py b/ietf/doc/migrations/0018_move_dochistory.py new file mode 100644 index 00000000000..0bc29b0bc45 --- /dev/null +++ b/ietf/doc/migrations/0018_move_dochistory.py @@ -0,0 +1,45 @@ +# Generated by Django 4.2.5 on 2023-09-11 17:52 + +from django.db import migrations + +from django.db.models import Subquery, OuterRef, F + + +def forward(apps, schema_editor): + DocHistory = apps.get_model("doc", "DocHistory") + RelatedDocument = apps.get_model("doc", "RelatedDocument") + Document = apps.get_model("doc", "Document") + DocHistory.objects.filter(type_id="draft", doc__type_id="rfc").update(type_id="rfc") + DocHistory.objects.filter( + type_id="draft", doc__type_id="draft", name__startswith="rfc" + ).annotate( + rfc_id=Subquery( + RelatedDocument.objects.filter( + source_id=OuterRef("doc_id"), relationship_id="became_rfc" + ).values_list("target_id", flat=True)[:1] + ) + ).update( + doc_id=F("rfc_id"), type_id="rfc" + ) + DocHistory.objects.filter(type_id="rfc").annotate( + rfcno=Subquery( + Document.objects.filter(pk=OuterRef("doc_id")).values_list( + "rfc_number", flat=True + )[:1] + ) + ).update(rfc_number=F("rfcno")) + assert not DocHistory.objects.filter( + name__startswith="rfc", type_id="draft" + ).exists() + assert not DocHistory.objects.filter( + type_id="rfc", rfc_number__isnull=True + ).exists() + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0017_delete_docalias"), + ] + + # There is no going back + operations = [migrations.RunPython(forward)] diff --git a/ietf/doc/migrations/0019_subseries.py b/ietf/doc/migrations/0019_subseries.py new file mode 100644 index 00000000000..be2c612ac0e --- /dev/null +++ b/ietf/doc/migrations/0019_subseries.py @@ -0,0 +1,21 @@ +# Copyright The IETF Trust 2023, All Rights Reserved +from django.db import migrations + + +def forward(apps, schema_editor): + StateType = apps.get_model("doc", "StateType") + for slug in ["bcp", "std", "fyi"]: + StateType.objects.create(slug=slug, label=f"{slug} state") + + +def reverse(apps, schema_editor): + StateType = apps.get_model("doc", "StateType") + StateType.objects.filter(slug__in=["bcp", "std", "fyi"]).delete() + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0018_move_dochistory"), + ] + + operations = [migrations.RunPython(forward, reverse)] diff --git a/ietf/doc/migrations/0020_move_errata_tags.py b/ietf/doc/migrations/0020_move_errata_tags.py new file mode 100644 index 00000000000..897b88f4678 --- /dev/null +++ b/ietf/doc/migrations/0020_move_errata_tags.py @@ -0,0 +1,29 @@ +# Copyright The IETF Trust 2023, All Rights Reserved + +from django.db import migrations + +from django.db.models import Subquery, OuterRef, F + + +def forward(apps, schema_editor): + Document = apps.get_model("doc", "Document") + RelatedDocument = apps.get_model("doc", "RelatedDocument") + Document.tags.through.objects.filter( + doctagname_id__in=["errata", "verified-errata"], document__type_id="draft" + ).annotate( + rfcdoc=Subquery( + RelatedDocument.objects.filter( + relationship_id="became_rfc", source_id=OuterRef("document__pk") + ).values_list("target__pk", flat=True)[:1] + ) + ).update( + document_id=F("rfcdoc") + ) + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0019_subseries"), + ] + + operations = [migrations.RunPython(forward)] diff --git a/ietf/doc/migrations/0021_narrativeminutes.py b/ietf/doc/migrations/0021_narrativeminutes.py new file mode 100644 index 00000000000..0f330bd0530 --- /dev/null +++ b/ietf/doc/migrations/0021_narrativeminutes.py @@ -0,0 +1,39 @@ +# Copyright The IETF Trust 2023, All Rights Reserved + +from django.db import migrations + + +def forward(apps, schema_editor): + StateType = apps.get_model("doc", "StateType") + State = apps.get_model("doc", "State") + + StateType.objects.create( + slug="narrativeminutes", + label="State", + ) + for order, slug in enumerate(["active", "deleted"]): + State.objects.create( + slug=slug, + type_id="narrativeminutes", + name=slug.capitalize(), + order=order, + desc="", + used=True, + ) + + +def reverse(apps, schema_editor): + StateType = apps.get_model("doc", "StateType") + State = apps.get_model("doc", "State") + + State.objects.filter(type_id="narrativeminutes").delete() + StateType.objects.filter(slug="narrativeminutes").delete() + + +class Migration(migrations.Migration): + dependencies = [ + ("doc", "0020_move_errata_tags"), + ("name", "0013_narrativeminutes"), + ] + + operations = [migrations.RunPython(forward, reverse)] diff --git a/ietf/doc/migrations/0022_remove_dochistory_internal_comments_and_more.py b/ietf/doc/migrations/0022_remove_dochistory_internal_comments_and_more.py new file mode 100644 index 00000000000..ad27793a833 --- /dev/null +++ b/ietf/doc/migrations/0022_remove_dochistory_internal_comments_and_more.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.15 on 2024-08-16 16:43 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("doc", "0021_narrativeminutes"), + ] + + operations = [ + migrations.RemoveField( + model_name="dochistory", + name="internal_comments", + ), + migrations.RemoveField( + model_name="document", + name="internal_comments", + ), + ] diff --git a/ietf/doc/migrations/0023_bofreqspamstate.py b/ietf/doc/migrations/0023_bofreqspamstate.py new file mode 100644 index 00000000000..dbbaf996e9b --- /dev/null +++ b/ietf/doc/migrations/0023_bofreqspamstate.py @@ -0,0 +1,30 @@ +# Copyright The IETF Trust 2024, All Rights Reserved + +from django.db import migrations + + +def forward(apps, schema_editor): + State = apps.get_model("doc", "State") + State.objects.get_or_create( + type_id="bofreq", + slug="spam", + defaults={"name": "Spam", "desc": "The BOF request is spam", "order": 5}, + ) + + +def reverse(apps, schema_editor): + State = apps.get_model("doc", "State") + Document = apps.get_model("doc", "Document") + assert not Document.objects.filter( + states__type="bofreq", states__slug="spam" + ).exists() + State.objects.filter(type_id="bofreq", slug="spam").delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ("doc", "0022_remove_dochistory_internal_comments_and_more"), + ] + + operations = [migrations.RunPython(forward, reverse)] diff --git a/ietf/doc/migrations/0024_remove_ad_is_watching_states.py b/ietf/doc/migrations/0024_remove_ad_is_watching_states.py new file mode 100644 index 00000000000..0c0fb0ad25c --- /dev/null +++ b/ietf/doc/migrations/0024_remove_ad_is_watching_states.py @@ -0,0 +1,121 @@ +# Copyright The IETF Trust 2024, All Rights Reserved + +from django.db import migrations + + +def get_helper(DocHistory, RelatedDocument, RelatedDocHistory, DocumentAuthor, DocHistoryAuthor): + """Dependency injection wrapper""" + + def save_document_in_history(doc): + """Save a snapshot of document and related objects in the database. + + Local copy of ietf.doc.utils.save_document_in_history() to avoid depending on the + code base in a migration. + """ + + def get_model_fields_as_dict(obj): + return dict((field.name, getattr(obj, field.name)) + for field in obj._meta.fields + if field is not obj._meta.pk) + + # copy fields + fields = get_model_fields_as_dict(doc) + fields["doc"] = doc + fields["name"] = doc.name + + dochist = DocHistory(**fields) + dochist.save() + + # copy many to many + for field in doc._meta.many_to_many: + if field.remote_field.through and field.remote_field.through._meta.auto_created: + hist_field = getattr(dochist, field.name) + hist_field.clear() + hist_field.set(getattr(doc, field.name).all()) + + # copy remaining tricky many to many + def transfer_fields(obj, HistModel): + mfields = get_model_fields_as_dict(item) + # map doc -> dochist + for k, v in mfields.items(): + if v == doc: + mfields[k] = dochist + HistModel.objects.create(**mfields) + + for item in RelatedDocument.objects.filter(source=doc): + transfer_fields(item, RelatedDocHistory) + + for item in DocumentAuthor.objects.filter(document=doc): + transfer_fields(item, DocHistoryAuthor) + + return dochist + + return save_document_in_history + + +def forward(apps, schema_editor): + """Mark watching draft-iesg state unused after removing it from Documents""" + StateDocEvent = apps.get_model("doc", "StateDocEvent") + Document = apps.get_model("doc", "Document") + State = apps.get_model("doc", "State") + StateType = apps.get_model("doc", "StateType") + Person = apps.get_model("person", "Person") + + save_document_in_history = get_helper( + DocHistory=apps.get_model("doc", "DocHistory"), + RelatedDocument=apps.get_model("doc", "RelatedDocument"), + RelatedDocHistory=apps.get_model("doc", "RelatedDocHistory"), + DocumentAuthor=apps.get_model("doc", "DocumentAuthor"), + DocHistoryAuthor=apps.get_model("doc", "DocHistoryAuthor"), + ) + + draft_iesg_state_type = StateType.objects.get(slug="draft-iesg") + idexists_state = State.objects.get(type=draft_iesg_state_type, slug="idexists") + watching_state = State.objects.get(type=draft_iesg_state_type, slug="watching") + system_person = Person.objects.get(name="(System)") + + # Remove state from documents that currently have it + for doc in Document.objects.filter(states=watching_state): + assert doc.type_id == "draft" + doc.states.remove(watching_state) + doc.states.add(idexists_state) + e = StateDocEvent.objects.create( + type="changed_state", + by=system_person, + doc=doc, + rev=doc.rev, + desc=f"{draft_iesg_state_type.label} changed to {idexists_state.name} from {watching_state.name}", + state_type=draft_iesg_state_type, + state=idexists_state, + ) + doc.time = e.time + doc.save() + save_document_in_history(doc) + assert not Document.objects.filter(states=watching_state).exists() + + # Mark state as unused + watching_state.used = False + watching_state.save() + + +def reverse(apps, schema_editor): + """Mark watching draft-iesg state as used + + Does not try to re-apply the state to Documents modified by the forward migration. This + could be done in theory, but would either require dangerous history rewriting or add a + lot of history junk. + """ + State = apps.get_model("doc", "State") + StateType = apps.get_model("doc", "StateType") + State.objects.filter( + type=StateType.objects.get(slug="draft-iesg"), slug="watching" + ).update(used=True) + + +class Migration(migrations.Migration): + + dependencies = [ + ("doc", "0023_bofreqspamstate"), + ] + + operations = [migrations.RunPython(forward, reverse)] diff --git a/ietf/doc/migrations/0025_storedobject_storedobject_unique_name_per_store.py b/ietf/doc/migrations/0025_storedobject_storedobject_unique_name_per_store.py new file mode 100644 index 00000000000..e948ca30113 --- /dev/null +++ b/ietf/doc/migrations/0025_storedobject_storedobject_unique_name_per_store.py @@ -0,0 +1,66 @@ +# Copyright The IETF Trust 2025, All Rights Reserved + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("doc", "0024_remove_ad_is_watching_states"), + ] + + operations = [ + migrations.CreateModel( + name="StoredObject", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("store", models.CharField(max_length=256)), + ("name", models.CharField(max_length=1024)), + ("sha384", models.CharField(max_length=96)), + ("len", models.PositiveBigIntegerField()), + ( + "store_created", + models.DateTimeField( + help_text="The instant the object ws first placed in the store" + ), + ), + ( + "created", + models.DateTimeField( + help_text="Instant object became known. May not be the same as the storage's created value for the instance. It will hold ctime for objects imported from older disk storage" + ), + ), + ( + "modified", + models.DateTimeField( + help_text="Last instant object was modified. May not be the same as the storage's modified value for the instance. It will hold mtime for objects imported from older disk storage unless they've actually been overwritten more recently" + ), + ), + ("doc_name", models.CharField(blank=True, max_length=255, null=True)), + ("doc_rev", models.CharField(blank=True, max_length=16, null=True)), + ("deleted", models.DateTimeField(null=True)), + ], + options={ + "indexes": [ + models.Index( + fields=["doc_name", "doc_rev"], + name="doc_storedo_doc_nam_d04465_idx", + ) + ], + }, + ), + migrations.AddConstraint( + model_name="storedobject", + constraint=models.UniqueConstraint( + fields=("store", "name"), name="unique_name_per_store" + ), + ), + ] diff --git a/ietf/doc/migrations/0026_change_wg_state_descriptions.py b/ietf/doc/migrations/0026_change_wg_state_descriptions.py new file mode 100644 index 00000000000..b02b12c97e4 --- /dev/null +++ b/ietf/doc/migrations/0026_change_wg_state_descriptions.py @@ -0,0 +1,117 @@ +# Copyright The IETF Trust 2025, All Rights Reserved + +from django.db import migrations + +def forward(apps, schema_editor): + State = apps.get_model("doc","State") + for name, desc in [ + ("WG Document","The document has been adopted by the Working Group (WG) and is under development. A document can only be adopted by one WG at a time. However, a document may be transferred between WGs."), + ("Parked WG Document","The Working Group (WG) document is in a temporary state where it will not be actively developed. The reason for the pause is explained via a datatracker comments section."), + ("Dead WG Document","The Working Group (WG) document has been abandoned by the WG. No further development is planned in this WG. A decision to resume work on this document and move it out of this state is possible."), + ("In WG Last Call","The Working Group (WG) document is currently subject to an active WG Last Call (WGLC) review per Section 7.4 of RFC2418."), + ("Waiting for Implementation","The progression of this Working Group (WG) document towards publication is paused as it awaits implementation. The process governing the approach to implementations is WG-specific."), + ("Held by WG","Held by Working Group (WG) chairs for administrative reasons. See document history for details."), + ("Waiting for WG Chair Go-Ahead","The Working Group (WG) document has completed Working Group Last Call (WGLC), but the WG chair(s) are not yet ready to call consensus on the document. The reasons for this may include comments from the WGLC need to be responded to, or a revision to the document is needed"), + ("WG Consensus: Waiting for Write-Up","The Working Group (WG) document has consensus to proceed to publication. However, the document is waiting for a document shepherd write-up per RFC4858."), + ("Submitted to IESG for Publication","The Working Group (WG) document has left the WG and been submitted to the Internet Engineering Steering Group (IESG) for evaluation and publication. See the “IESG State” or “RFC Editor State” for further details on the state of the document."), + ("Candidate for WG Adoption","The individual submission document has been marked by the Working Group (WG) chairs as a candidate for adoption by the WG, but no adoption call has been started."), + ("Call For Adoption By WG Issued","A call for adoption of the individual submission document has been issued by the Working Group (WG) chairs. This call is still running but the WG has not yet reached consensus for adoption."), + ("Adopted by a WG","The individual submission document has been adopted by the Working Group (WG), but a WG document replacing this document with the typical naming convention of 'draft- ietf-wgname-topic-nn' has not yet been submitted."), + ("Adopted for WG Info Only","The document is adopted by the Working Group (WG) for its internal use. The WG has decided that it will not pursue publication of it as an RFC."), + ]: + State.objects.filter(name=name).update(desc=desc) + +def reverse(apps, schema_editor): + State = apps.get_model("doc","State") + for name, desc in [ + ("WG Document","""4.2.4. WG Document + + The "WG Document" state describes an I-D that has been adopted by an IETF WG and is being actively developed. + + A WG Chair may transition an I-D into the "WG Document" state at any time as long as the I-D is not being considered or developed in any other WG. + + Alternatively, WG Chairs may rely upon new functionality to be added to the Datatracker to automatically move version-00 drafts into the "WG Document" state as described in Section 4.1. + + Under normal conditions, it should not be possible for an I-D to be in the "WG Document" state in more than one WG at a time. This said, I-Ds may be transferred from one WG to another with the consent of the WG Chairs and the responsible ADs."""), + ("Parked WG Document","""4.2.5. Parked WG Document + + A "Parked WG Document" is an I-D that has lost its author or editor, is waiting for another document to be written or for a review to be completed, or cannot be progressed by the working group for some other reason. + + Some of the annotation tags described in Section 4.3 may be used in conjunction with this state to indicate why an I-D has been parked, and/or what may need to happen for the I-D to be un-parked. + + Parking a WG draft will not prevent it from expiring; however, this state can be used to indicate why the I-D has stopped progressing in the WG. + + A "Parked WG Document" that is not expired may be transferred from one WG to another with the consent of the WG Chairs and the responsible ADs."""), + ("Dead WG Document","""4.2.6. Dead WG Document + + A "Dead WG Document" is an I-D that has been abandoned. Note that 'Dead' is not always a final state for a WG I-D. If consensus is subsequently achieved, a "Dead WG Document" may be resurrected. A "Dead WG Document" that is not resurrected will eventually expire. + + Note that an I-D that is declared to be "Dead" in one WG and that is not expired may be transferred to a non-dead state in another WG with the consent of the WG Chairs and the responsible ADs."""), + ("In WG Last Call","""4.2.7. In WG Last Call + + A document "In WG Last Call" is an I-D for which a WG Last Call (WGLC) has been issued and is in progress. + + Note that conducting a WGLC is an optional part of the IETF WG process, per Section 7.4 of RFC 2418 [RFC2418]. + + If a WG Chair decides to conduct a WGLC on an I-D, the "In WG Last Call" state can be used to track the progress of the WGLC. The Chair may configure the Datatracker to send a WGLC message to one or more mailing lists when the Chair moves the I-D into this state. The WG Chair may also be able to select a different set of mailing lists for a different document undergoing a WGLC; some documents may deserve coordination with other WGs. + + A WG I-D in this state should remain "In WG Last Call" until the WG Chair moves it to another state. The WG Chair may configure the Datatracker to send an e-mail after a specified period of time to remind or 'nudge' the Chair to conclude the WGLC and to determine the next state for the document. + + It is possible for one WGLC to lead into another WGLC for the same document. For example, an I-D that completed a WGLC as an "Informational" document may need another WGLC if a decision is taken to convert the I-D into a Standards Track document."""), + ("Waiting for Implementation","""In some areas, it can be desirable to wait for multiple interoperable implementations before progressing a draft to be an RFC, and in some WGs this is required. This state should be entered after WG Last Call has completed."""), + ("Held by WG","""Held by WG, see document history for details."""), + ("Waiting for WG Chair Go-Ahead","""4.2.8. Waiting for WG Chair Go-Ahead + + A WG Chair may wish to place an I-D that receives a lot of comments during a WGLC into the "Waiting for WG Chair Go-Ahead" state. This state describes an I-D that has undergone a WGLC; however, the Chair is not yet ready to call consensus on the document. + + If comments from the WGLC need to be responded to, or a revision to the I-D is needed, the Chair may place an I-D into this state until all of the WGLC comments are adequately addressed and the (possibly revised) document is in the I-D repository."""), + ("WG Consensus: Waiting for Write-Up","""4.2.9. WG Consensus: Waiting for Writeup + + A document in the "WG Consensus: Waiting for Writeup" state has essentially completed its development within the working group, and is nearly ready to be sent to the IESG for publication. The last thing to be done is the preparation of a protocol writeup by a Document Shepherd. The IESG requires that a document shepherd writeup be completed before publication of the I-D is requested. The IETF document shepherding process and the role of a WG Document Shepherd is described in RFC 4858 [RFC4858] + + A WG Chair may call consensus on an I-D without a formal WGLC and transition an I-D that was in the "WG Document" state directly into this state. + + The name of this state includes the words "Waiting for Writeup" because a good document shepherd writeup takes time to prepare."""), + ("Submitted to IESG for Publication","""4.2.10. Submitted to IESG for Publication + + This state describes a WG document that has been submitted to the IESG for publication and that has not been sent back to the working group for revision. + + An I-D in this state may be under review by the IESG, it may have been approved and be in the RFC Editor's queue, or it may have been published as an RFC. Other possibilities exist too. The document may be "Dead" (in the IESG state machine) or in a "Do Not Publish" state."""), + ("Candidate for WG Adoption","""The document has been marked as a candidate for WG adoption by the WG Chair. This state can be used before a call for adoption is issued (and the document is put in the "Call For Adoption By WG Issued" state), to indicate that the document is in the queue for a call for adoption, even if none has been issued yet."""), + ("Call For Adoption By WG Issued","""4.2.1. Call for Adoption by WG Issued + + The "Call for Adoption by WG Issued" state should be used to indicate when an I-D is being considered for adoption by an IETF WG. An I-D that is in this state is actively being considered for adoption and has not yet achieved consensus, preference, or selection in the WG. + + This state may be used to describe an I-D that someone has asked a WG to consider for adoption, if the WG Chair has agreed with the request. This state may also be used to identify an I-D that a WG Chair asked an author to write specifically for consideration as a candidate WG item [WGDTSPEC], and/or an I-D that is listed as a 'candidate draft' in the WG's charter. + + Under normal conditions, it should not be possible for an I-D to be in the "Call for Adoption by WG Issued" state in more than one working group at the same time. This said, it is not uncommon for authors to "shop" their I-Ds to more than one WG at a time, with the hope of getting their documents adopted somewhere. + + After this state is implemented in the Datatracker, an I-D that is in the "Call for Adoption by WG Issued" state will not be able to be "shopped" to any other WG without the consent of the WG Chairs and the responsible ADs impacted by the shopping. + + Note that Figure 1 includes an arc leading from this state to outside of the WG state machine. This illustrates that some I-Ds that are considered do not get adopted as WG drafts. An I-D that is not adopted as a WG draft will transition out of the WG state machine and revert back to having no stream-specific state; however, the status change history log of the I-D will record that the I-D was previously in the "Call for Adoption by WG Issued" state."""), + ("Adopted by a WG","""4.2.2. Adopted by a WG + + The "Adopted by a WG" state describes an individual submission I-D that an IETF WG has agreed to adopt as one of its WG drafts. + + WG Chairs who use this state will be able to clearly indicate when their WGs adopt individual submission I-Ds. This will facilitate the Datatracker's ability to correctly capture "Replaces" information for WG drafts and correct "Replaced by" information for individual submission I-Ds that have been replaced by WG drafts. + + This state is needed because the Datatracker uses the filename of an I-D as a key to search its database for status information about the I-D, and because the filename of a WG I-D is supposed to be different from the filename of an individual submission I-D. The filename of an individual submission I-D will typically be formatted as 'draft-author-wgname-topic-nn'. + + The filename of a WG document is supposed to be formatted as 'draft- ietf-wgname-topic-nn'. + + An individual I-D that is adopted by a WG may take weeks or months to be resubmitted by the author as a new (version-00) WG draft. If the "Adopted by a WG" state is not used, the Datatracker has no way to determine that an I-D has been adopted until a new version of the I-D is submitted to the WG by the author and until the I-D is approved for posting by a WG Chair."""), + ("Adopted for WG Info Only","""4.2.3. Adopted for WG Info Only + + The "Adopted for WG Info Only" state describes a document that contains useful information for the WG that adopted it, but the document is not intended to be published as an RFC. The WG will not actively develop the contents of the I-D or progress it for publication as an RFC. The only purpose of the I-D is to provide information for internal use by the WG."""), + ]: + State.objects.filter(name=name).update(desc=desc) + +class Migration(migrations.Migration): + + dependencies = [ + ("doc", "0025_storedobject_storedobject_unique_name_per_store"), + ] + + operations = [ + migrations.RunPython(forward, reverse) + ] diff --git a/ietf/doc/models.py b/ietf/doc/models.py index 2e6db02a62e..8bb79b64ed3 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -1,42 +1,48 @@ -# Copyright The IETF Trust 2010-2020, All Rights Reserved +# Copyright The IETF Trust 2010-2025, All Rights Reserved # -*- coding: utf-8 -*- import datetime import logging -import io import os import django.db import rfc2html +from io import BufferedReader from pathlib import Path from lxml import etree -from typing import Optional, TYPE_CHECKING +from typing import Optional, Protocol, TYPE_CHECKING, Union from weasyprint import HTML as wpHTML +from weasyprint.text.fonts import FontConfiguration from django.db import models from django.core import checks +from django.core.files.base import File from django.core.cache import caches from django.core.validators import URLValidator, RegexValidator from django.urls import reverse as urlreverse from django.contrib.contenttypes.models import ContentType from django.conf import settings from django.utils import timezone -from django.utils.encoding import force_text +from django.utils.encoding import force_str from django.utils.html import mark_safe # type:ignore from django.contrib.staticfiles import finders import debug # pyflakes:ignore from ietf.group.models import Group +from ietf.doc.storage_utils import ( + store_str as utils_store_str, + store_bytes as utils_store_bytes, + store_file as utils_store_file +) from ietf.name.models import ( DocTypeName, DocTagName, StreamName, IntendedStdLevelName, StdLevelName, DocRelationshipName, DocReminderTypeName, BallotPositionName, ReviewRequestStateName, ReviewAssignmentStateName, FormalLanguageName, DocUrlTagName, ExtResourceName) from ietf.person.models import Email, Person from ietf.person.utils import get_active_balloters from ietf.utils import log -from ietf.utils.admin import admin_link from ietf.utils.decorators import memoize from ietf.utils.validators import validate_no_control_chars from ietf.utils.mail import formataddr @@ -83,7 +89,7 @@ class State(models.Model): desc = models.TextField(blank=True) order = models.IntegerField(default=0) - next_states = models.ManyToManyField('State', related_name="previous_states", blank=True) + next_states = models.ManyToManyField('doc.State', related_name="previous_states", blank=True) def __str__(self): return self.name @@ -122,7 +128,7 @@ class DocumentInfo(models.Model): external_url = models.URLField(blank=True) uploaded_filename = models.TextField(blank=True) note = models.TextField(blank=True) - internal_comments = models.TextField(blank=True) + rfc_number = models.PositiveIntegerField(blank=True, null=True) # only valid for type="rfc" def file_extension(self): if not hasattr(self, '_cached_extension'): @@ -135,20 +141,20 @@ def file_extension(self): def get_file_path(self): if not hasattr(self, '_cached_file_path'): - if self.type_id == "draft": + if self.type_id == "rfc": + self._cached_file_path = settings.RFC_PATH + elif self.type_id == "draft": if self.is_dochistory(): self._cached_file_path = settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR else: - if self.get_state_slug() == "rfc": - self._cached_file_path = settings.RFC_PATH + # This could be simplified since anything in INTERNET_DRAFT_PATH is also already in INTERNET_ALL_DRAFTS_ARCHIVE_DIR + draft_state = self.get_state('draft') + if draft_state and draft_state.slug == 'active': + self._cached_file_path = settings.INTERNET_DRAFT_PATH else: - draft_state = self.get_state('draft') - if draft_state and draft_state.slug == 'active': - self._cached_file_path = settings.INTERNET_DRAFT_PATH - else: - self._cached_file_path = settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR + self._cached_file_path = settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR elif self.meeting_related() and self.type_id in ( - "agenda", "minutes", "slides", "bluesheets", "procmaterials", "chatlog", "polls" + "agenda", "minutes", "narrativeminutes", "slides", "bluesheets", "procmaterials", "chatlog", "polls" ): meeting = self.get_related_meeting() if meeting is not None: @@ -161,7 +167,7 @@ def get_file_path(self): self._cached_file_path = settings.CONFLICT_REVIEW_PATH elif self.type_id == "statchg": self._cached_file_path = settings.STATUS_CHANGE_PATH - elif self.type_id == "bofreq": + elif self.type_id == "bofreq": # TODO: This is probably unneeded, as is the separate path setting self._cached_file_path = settings.BOFREQ_PATH else: self._cached_file_path = settings.DOCUMENT_PATH_PATTERN.format(doc=self) @@ -171,27 +177,26 @@ def get_base_name(self): if not hasattr(self, '_cached_base_name'): if self.uploaded_filename: self._cached_base_name = self.uploaded_filename + elif self.type_id == 'rfc': + self._cached_base_name = "%s.txt" % self.name elif self.type_id == 'draft': if self.is_dochistory(): self._cached_base_name = "%s-%s.txt" % (self.doc.name, self.rev) else: - if self.get_state_slug() == 'rfc': - self._cached_base_name = "%s.txt" % self.canonical_name() - else: - self._cached_base_name = "%s-%s.txt" % (self.name, self.rev) + self._cached_base_name = "%s-%s.txt" % (self.name, self.rev) elif self.type_id in ["slides", "agenda", "minutes", "bluesheets", "procmaterials", ] and self.meeting_related(): ext = 'pdf' if self.type_id == 'procmaterials' else 'txt' - self._cached_base_name = f'{self.canonical_name()}-{self.rev}.{ext}' + self._cached_base_name = f'{self.name}-{self.rev}.{ext}' elif self.type_id == 'review': # TODO: This will be wrong if a review is updated on the same day it was created (or updated more than once on the same day) self._cached_base_name = "%s.txt" % self.name - elif self.type_id == 'bofreq': + elif self.type_id in ['bofreq', 'statement']: self._cached_base_name = "%s-%s.md" % (self.name, self.rev) else: if self.rev: - self._cached_base_name = "%s-%s.txt" % (self.canonical_name(), self.rev) + self._cached_base_name = "%s-%s.txt" % (self.name, self.rev) else: - self._cached_base_name = "%s.txt" % (self.canonical_name(), ) + self._cached_base_name = "%s.txt" % (self.name, ) return self._cached_base_name def get_file_name(self): @@ -199,17 +204,28 @@ def get_file_name(self): self._cached_file_name = os.path.join(self.get_file_path(), self.get_base_name()) return self._cached_file_name - def revisions(self): + + def revisions_by_dochistory(self): revisions = [] - doc = self.doc if isinstance(self, DocHistory) else self - for e in doc.docevent_set.filter(type='new_revision').distinct(): - if e.rev and not e.rev in revisions: - revisions.append(e.rev) - if not doc.rev in revisions: - revisions.append(doc.rev) - revisions.sort() + if self.type_id != "rfc": + for h in self.history_set.order_by("time", "id"): + if h.rev and not h.rev in revisions: + revisions.append(h.rev) + if not self.rev in revisions: + revisions.append(self.rev) return revisions + def revisions_by_newrevisionevent(self): + revisions = [] + if self.type_id != "rfc": + doc = self.doc if isinstance(self, DocHistory) else self + for e in doc.docevent_set.filter(type='new_revision').distinct(): + if e.rev and not e.rev in revisions: + revisions.append(e.rev) + if not doc.rev in revisions: + revisions.append(doc.rev) + revisions.sort() + return revisions def get_href(self, meeting=None): return self._get_ref(meeting=meeting,meeting_doc_refs=settings.MEETING_DOC_HREFS) @@ -243,7 +259,7 @@ def _get_ref(self, meeting=None, meeting_doc_refs=settings.MEETING_DOC_HREFS): format = settings.DOC_HREFS[self.type_id] elif self.type_id in settings.DOC_HREFS: self.is_meeting_related = False - if self.is_rfc(): + if self.type_id == "rfc": format = settings.DOC_HREFS['rfc'] else: format = settings.DOC_HREFS[self.type_id] @@ -270,6 +286,19 @@ def _get_ref(self, meeting=None, meeting_doc_refs=settings.MEETING_DOC_HREFS): info = dict(doc=self) href = format.format(**info) + + # For slides that are not meeting-related, we need to know the file extension. + # Assume we have access to the same files as settings.DOC_HREFS["slides"] and + # see what extension is available + if self.type_id == "slides" and not self.meeting_related() and not href.endswith("/"): + filepath = Path(self.get_file_path()) / self.get_base_name() # start with this + if not filepath.exists(): + # Look for other extensions - grab the first one, sorted for stability + for existing in sorted(filepath.parent.glob(f"{filepath.stem}.*")): + filepath = filepath.with_suffix(existing.suffix) + break + href += filepath.suffix # tack on the extension + if href.startswith('/'): href = settings.IDTRACKER_BASE_URL + href self._cached_href = href @@ -333,7 +362,9 @@ def friendly_state(self): if not state: return "Unknown state" - if self.type_id == 'draft': + if self.type_id == "rfc": + return f"RFC {self.rfc_number} ({self.std_level})" + elif self.type_id == 'draft': iesg_state = self.get_state("draft-iesg") iesg_state_summary = None if iesg_state: @@ -342,13 +373,15 @@ def friendly_state(self): iesg_state_summary = iesg_state.name if iesg_substate: iesg_state_summary = iesg_state_summary + "::"+"::".join(tag.name for tag in iesg_substate) - - if state.slug == "rfc": - return "RFC %s (%s)" % (self.rfc_number(), self.std_level) + + rfc = self.became_rfc() + if rfc: + return f"Became RFC {rfc.rfc_number} ({rfc.std_level})" + elif state.slug == "repl": rs = self.related_that("replaces") if rs: - return mark_safe("Replaced by " + ", ".join("%s" % (urlreverse('ietf.doc.views_doc.document_main', kwargs=dict(name=alias.document.name)), alias.document) for alias in rs)) + return mark_safe("Replaced by " + ", ".join("%s" % (urlreverse('ietf.doc.views_doc.document_main', kwargs=dict(name=related.name)), related) for related in rs)) else: return "Replaced" elif state.slug == "active": @@ -374,27 +407,6 @@ def friendly_state(self): else: return state.name - def is_rfc(self): - if not hasattr(self, '_cached_is_rfc'): - self._cached_is_rfc = self.pk and self.type_id == 'draft' and self.states.filter(type='draft',slug='rfc').exists() - return self._cached_is_rfc - - def rfc_number(self): - if not hasattr(self, '_cached_rfc_number'): - self._cached_rfc_number = None - if self.is_rfc(): - n = self.canonical_name() - if n.startswith("rfc"): - self._cached_rfc_number = n[3:] - else: - if isinstance(self,Document): - logger.error("Document self.is_rfc() is True but self.canonical_name() is %s" % n) - return self._cached_rfc_number - - @property - def rfcnum(self): - return self.rfc_number() - def author_list(self): best_addresses = [] for author in self.documentauthor_set.all(): @@ -432,7 +444,7 @@ def has_rfc_editor_note(self): return e != None and (e.text != "") def meeting_related(self): - if self.type_id in ("agenda","minutes","bluesheets","slides","recording","procmaterials","chatlog","polls"): + if self.type_id in ("agenda","minutes", "narrativeminutes", "bluesheets","slides","recording","procmaterials","chatlog","polls"): return self.type_id != "slides" or self.get_state_slug('reuse_policy')=='single' return False @@ -467,9 +479,9 @@ def relations_that(self, relationship): if not isinstance(relationship, tuple): raise TypeError("Expected a string or tuple, received %s" % type(relationship)) if isinstance(self, Document): - return RelatedDocument.objects.filter(target__docs=self, relationship__in=relationship).select_related('source') + return RelatedDocument.objects.filter(target=self, relationship__in=relationship).select_related('source') elif isinstance(self, DocHistory): - return RelatedDocHistory.objects.filter(target__docs=self.doc, relationship__in=relationship).select_related('source') + return RelatedDocHistory.objects.filter(target=self.doc, relationship__in=relationship).select_related('source') else: raise TypeError("Expected method called on Document or DocHistory") @@ -503,15 +515,14 @@ def all_relations_that_doc(self, relationship, related=None): for r in rels: if not r in related: related += ( r, ) - for doc in r.target.docs.all(): - related = doc.all_relations_that_doc(relationship, related) + related = r.target.all_relations_that_doc(relationship, related) return related def related_that(self, relationship): - return list(set([x.source.docalias.get(name=x.source.name) for x in self.relations_that(relationship)])) + return list(set([x.source for x in self.relations_that(relationship)])) def all_related_that(self, relationship, related=None): - return list(set([x.source.docalias.get(name=x.source.name) for x in self.all_relations_that(relationship)])) + return list(set([x.source for x in self.all_relations_that(relationship)])) def related_that_doc(self, relationship): return list(set([x.target for x in self.relations_that_doc(relationship)])) @@ -520,42 +531,55 @@ def all_related_that_doc(self, relationship, related=None): return list(set([x.target for x in self.all_relations_that_doc(relationship)])) def replaces(self): - return set([ d for r in self.related_that_doc("replaces") for d in r.docs.all() ]) - - def replaces_canonical_name(self): - s = set([ r.document for r in self.related_that_doc("replaces")]) - first = list(s)[0] if s else None - return None if first is None else first.filename_with_rev() + return self.related_that_doc("replaces") def replaced_by(self): return set([ r.document for r in self.related_that("replaces") ]) - def text(self): + def _text_path(self): path = self.get_file_name() root, ext = os.path.splitext(path) txtpath = root+'.txt' if ext != '.txt' and os.path.exists(txtpath): path = txtpath + return path + + def text_exists(self): + path = Path(self._text_path()) + return path.exists() + + def text(self, size = -1): + path = Path(self._text_path()) + if not path.exists(): + return None try: - with io.open(path, 'rb') as file: - raw = file.read() - except IOError: + with path.open('rb') as file: + raw = file.read(size) + except IOError as e: + log.log(f"Error reading text for {path}: {e}") return None + text = None try: text = raw.decode('utf-8') except UnicodeDecodeError: - text = raw.decode('latin-1') - # + for back in range(1,4): + try: + text = raw[:-back].decode('utf-8') + break + except UnicodeDecodeError: + pass + if text is None: + text = raw.decode('latin-1') return text def text_or_error(self): return self.text() or "Error; cannot read '%s'"%self.get_base_name() def html_body(self, classes=""): - if self.get_state_slug() == "rfc": + if self.type_id == "rfc": try: html = Path( - os.path.join(settings.RFC_PATH, self.canonical_name() + ".html") + os.path.join(settings.RFC_PATH, self.name + ".html") ).read_text() except (IOError, UnicodeDecodeError): return None @@ -626,6 +650,7 @@ def pdfized(self): stylesheets.append(finders.find("ietf/css/document_html_txt.css")) else: text = self.htmlized() + stylesheets.append(f'{settings.STATIC_IETF_ORG_INTERNAL}/fonts/noto-sans-mono/import.css') cache = caches["pdfized"] cache_key = name.split(".")[0] @@ -635,15 +660,20 @@ def pdfized(self): pdf = None if not pdf: try: + font_config = FontConfiguration() pdf = wpHTML( string=text, base_url=settings.IDTRACKER_BASE_URL ).write_pdf( stylesheets=stylesheets, + font_config=font_config, presentational_hints=True, - optimize_size=("fonts", "images"), + optimize_images=True, ) except AssertionError: pdf = None + except Exception as e: + log.log('weasyprint failed:'+str(e)) + raise if pdf: cache.set(cache_key, pdf, settings.PDFIZER_CACHE_TIME) return pdf @@ -652,66 +682,165 @@ def references(self): return self.relations_that_doc(('refnorm','refinfo','refunk','refold')) def referenced_by(self): - return self.relations_that(('refnorm','refinfo','refunk','refold')).filter(source__states__type__slug='draft',source__states__slug__in=['rfc','active']) - + return self.relations_that(("refnorm", "refinfo", "refunk", "refold")).filter( + models.Q( + source__type__slug="draft", + source__states__type__slug="draft", + source__states__slug="active", + ) + | models.Q(source__type__slug="rfc") + ).distinct() + def referenced_by_rfcs(self): - return self.relations_that(('refnorm','refinfo','refunk','refold')).filter(source__states__type__slug='draft',source__states__slug='rfc') + """Get refs to this doc from RFCs""" + return self.relations_that(("refnorm", "refinfo", "refunk", "refold")).filter( + source__type__slug="rfc" + ) + def became_rfc(self): + if not hasattr(self, "_cached_became_rfc"): + doc = self if isinstance(self, Document) else self.doc + self._cached_became_rfc = next(iter(doc.related_that_doc("became_rfc")), None) + return self._cached_became_rfc + + def came_from_draft(self): + if not hasattr(self, "_cached_came_from_draft"): + doc = self if isinstance(self, Document) else self.doc + self._cached_came_from_draft = next(iter(doc.related_that("became_rfc")), None) + return self._cached_came_from_draft + + def contains(self): + return self.related_that_doc("contains") + + def part_of(self): + return self.related_that("contains") + + def referenced_by_rfcs_as_rfc_or_draft(self): + """Get refs to this doc, or a draft/rfc it came from, from an RFC""" + refs_to = self.referenced_by_rfcs() + if self.type_id == "rfc" and self.came_from_draft(): + refs_to |= self.came_from_draft().referenced_by_rfcs() + return refs_to + class Meta: abstract = True + +class HasNameRevAndTypeIdProtocol(Protocol): + """Typing Protocol describing a class that has name, rev, and type_id properties""" + @property + def name(self) -> str: ... + @property + def rev(self) -> str: ... + @property + def type_id(self) -> str: ... + + +class StorableMixin: + """Mixin that adds storage helpers to a DocumentInfo subclass""" + def store_str( + self: HasNameRevAndTypeIdProtocol, + name: str, + content: str, + allow_overwrite: bool = False + ) -> None: + return utils_store_str(self.type_id, name, content, allow_overwrite, self.name, self.rev) + + def store_bytes( + self: HasNameRevAndTypeIdProtocol, + name: str, + content: bytes, + allow_overwrite: bool = False, + doc_name: Optional[str] = None, + doc_rev: Optional[str] = None + ) -> None: + return utils_store_bytes(self.type_id, name, content, allow_overwrite, self.name, self.rev) + + def store_file( + self: HasNameRevAndTypeIdProtocol, + name: str, + file: Union[File, BufferedReader], + allow_overwrite: bool = False, + doc_name: Optional[str] = None, + doc_rev: Optional[str] = None + ) -> None: + return utils_store_file(self.type_id, name, file, allow_overwrite, self.name, self.rev) + + STATUSCHANGE_RELATIONS = ('tops','tois','tohist','toinf','tobcp','toexp') class RelatedDocument(models.Model): source = ForeignKey('Document') - target = ForeignKey('DocAlias') + target = ForeignKey('Document', related_name='targets_related') relationship = ForeignKey(DocRelationshipName) + originaltargetaliasname = models.CharField(max_length=255, null=True, blank=True) def action(self): return self.relationship.name def __str__(self): return u"%s %s %s" % (self.source.name, self.relationship.name.lower(), self.target.name) def is_downref(self): - - if self.source.type.slug!='draft' or self.relationship.slug not in ['refnorm','refold','refunk']: + if self.source.type_id not in ["draft","rfc"] or self.relationship.slug not in [ + "refnorm", + "refold", + "refunk", + ]: return None - state = self.source.get_state() - if state and state.slug == 'rfc': - source_lvl = self.source.std_level.slug if self.source.std_level else None - elif self.source.intended_std_level: - source_lvl = self.source.intended_std_level.slug + if self.source.type_id == "rfc": + source_lvl = self.source.std_level_id + elif self.source.type_id in ["bcp","std"]: + source_lvl = self.source.type_id else: - source_lvl = None + source_lvl = self.source.intended_std_level_id - if source_lvl not in ['bcp','ps','ds','std']: + if source_lvl not in ["bcp", "ps", "ds", "std", "unkn"]: return None - if self.target.document.get_state().slug == 'rfc': - if not self.target.document.std_level: + if self.target.type_id == 'rfc': + if not self.target.std_level: target_lvl = 'unkn' else: - target_lvl = self.target.document.std_level.slug + target_lvl = self.target.std_level_id + elif self.target.type_id in ["bcp", "std"]: + target_lvl = self.target.type_id else: - if not self.target.document.intended_std_level: + if not self.target.intended_std_level: target_lvl = 'unkn' else: - target_lvl = self.target.document.intended_std_level.slug + target_lvl = self.target.intended_std_level_id - rank = { 'ps':1, 'ds':2, 'std':3, 'bcp':3 } + if self.relationship.slug not in ["refnorm", "refunk"]: + return None - if ( target_lvl not in rank ) or ( rank[target_lvl] < rank[source_lvl] ): - if self.relationship.slug == 'refnorm' and target_lvl!='unkn': - return "Downref" - else: - return "Possible Downref" + if source_lvl in ["inf", "exp"]: + return None + + pos_downref = ( + "Downref" if self.relationship_id != "refunk" else "Possible Downref" + ) + + if source_lvl in ["bcp", "ps", "ds", "std"] and target_lvl in ["inf", "exp"]: + return pos_downref + + if source_lvl == "ds" and target_lvl == "ps": + return pos_downref + + if source_lvl == "std" and target_lvl in ["ps", "ds"]: + return pos_downref + + if source_lvl not in ["inf", "exp"] and target_lvl == "unkn": + return "Possible Downref" + + if source_lvl == "unkn" and target_lvl in ["ps", "ds"]: + return "Possible Downref" return None def is_approved_downref(self): - if self.target.document.get_state().slug == 'rfc': - if RelatedDocument.objects.filter(relationship_id='downref-approval', target=self.target): + if self.target.type_id == 'rfc': + if RelatedDocument.objects.filter(relationship_id='downref-approval', target=self.target).exists(): return "Approved Downref" return False @@ -784,13 +913,14 @@ def role_for_doc(self): roles.append('Action Holder') return ', '.join(roles) +# N.B., at least a couple dozen documents exist that do not satisfy this validator validate_docname = RegexValidator( r'^[-a-z0-9]+$', "Provide a valid document name consisting of lowercase letters, numbers and hyphens.", 'invalid' ) -class Document(DocumentInfo): +class Document(StorableMixin, DocumentInfo): name = models.CharField(max_length=255, validators=[validate_docname,], unique=True) # immutable action_holders = models.ManyToManyField(Person, through=DocumentActionHolder, blank=True) @@ -807,7 +937,7 @@ def get_absolute_url(self): name = self.name url = None if self.type_id == "draft" and self.get_state_slug() == "rfc": - name = self.canonical_name() + name = self.name url = urlreverse('ietf.doc.views_doc.document_main', kwargs={ 'name': name }, urlconf="ietf.urls") elif self.type_id in ('slides','bluesheets','recording'): session = self.session_set.first() @@ -845,28 +975,8 @@ def latest_event(self, *args, **filter_args): e = model.objects.filter(doc=self).filter(**filter_args).order_by('-time', '-id').first() return e - def canonical_name(self): - if not hasattr(self, '_canonical_name'): - name = self.name - if self.type_id == "draft" and self.get_state_slug() == "rfc": - a = self.docalias.filter(name__startswith="rfc").order_by('-name').first() - if a: - name = a.name - elif self.type_id == "charter": - from ietf.doc.utils_charter import charter_name_for_group # Imported locally to avoid circular imports - try: - name = charter_name_for_group(self.chartered_group) - except Group.DoesNotExist: - pass - self._canonical_name = name - return self._canonical_name - - - def canonical_docalias(self): - return self.docalias.get(name=self.name) - def display_name(self): - name = self.canonical_name() + name = self.name if name.startswith('rfc'): name = name.upper() return name @@ -959,23 +1069,33 @@ def most_recent_ietflc(self): def displayname_with_link(self): return mark_safe('%s-%s' % (self.get_absolute_url(), self.name , self.rev)) - def ipr(self,states=('posted','removed')): + def ipr(self,states=settings.PUBLISH_IPR_STATES): """Returns the IPR disclosures against this document (as a queryset over IprDocRel).""" - from ietf.ipr.models import IprDocRel - return IprDocRel.objects.filter(document__docs=self, disclosure__state__in=states) + # from ietf.ipr.models import IprDocRel + # return IprDocRel.objects.filter(document__docs=self, disclosure__state__in=states) # TODO - clear these comments away + return self.iprdocrel_set.filter(disclosure__state__in=states) def related_ipr(self): """Returns the IPR disclosures against this document and those documents this document directly or indirectly obsoletes or replaces """ from ietf.ipr.models import IprDocRel - iprs = IprDocRel.objects.filter(document__in=list(self.docalias.all())+self.all_related_that_doc(('obs','replaces'))).filter(disclosure__state__in=('posted','removed')).values_list('disclosure', flat=True).distinct() + iprs = ( + IprDocRel.objects.filter( + document__in=[self] + + self.all_related_that_doc(("obs", "replaces")) + ) + .filter(disclosure__state__in=settings.PUBLISH_IPR_STATES) + .values_list("disclosure", flat=True) + .distinct() + ) return iprs + def future_presentations(self): """ returns related SessionPresentation objects for meetings that have not yet ended. This implementation allows for 2 week meetings """ - candidate_presentations = self.sessionpresentation_set.filter( + candidate_presentations = self.presentations.filter( session__meeting__date__gte=date_today() - datetime.timedelta(days=15) ) return sorted( @@ -988,11 +1108,11 @@ def last_presented(self): """ returns related SessionPresentation objects for the most recent meeting in the past""" # Assumes no two meetings have the same start date - if the assumption is violated, one will be chosen arbitrarily today = date_today() - candidate_presentations = self.sessionpresentation_set.filter(session__meeting__date__lte=today) + candidate_presentations = self.presentations.filter(session__meeting__date__lte=today) candidate_meetings = set([p.session.meeting for p in candidate_presentations if p.session.meeting.end_date()%s" % (self.name, ','.join([force_text(d.name) for d in self.docs.all() if isinstance(d, Document) ])) - document_link = admin_link("document") - class Meta: - verbose_name = "document alias" - verbose_name_plural = "document aliases" class DocReminder(models.Model): event = ForeignKey('DocEvent') @@ -1284,9 +1374,17 @@ class DocReminder(models.Model): # IPR events ("posted_related_ipr", "Posted related IPR"), ("removed_related_ipr", "Removed related IPR"), + ("removed_objfalse_related_ipr", "Removed Objectively False related IPR"), # Bofreq Editor events - ("changed_editors", "Changed BOF Request editors") + ("changed_editors", "Changed BOF Request editors"), + + # Statement events + ("published_statement", "Published statement"), + + # Slide events + ("approved_slides", "Slides approved"), + ] class DocEvent(models.Model): @@ -1490,3 +1588,42 @@ class BofreqEditorDocEvent(DocEvent): class BofreqResponsibleDocEvent(DocEvent): """ Capture the responsible leadership (IAB and IESG members) for a BOF Request """ responsible = models.ManyToManyField('person.Person', blank=True) + + +class StoredObjectQuerySet(models.QuerySet): + def exclude_deleted(self): + return self.filter(deleted__isnull=True) + + +class StoredObject(models.Model): + """Hold metadata about objects placed in object storage""" + + objects = StoredObjectQuerySet.as_manager() + + store = models.CharField(max_length=256) + name = models.CharField(max_length=1024, null=False, blank=False) # N.B. the 1024 limit on name comes from S3 + sha384 = models.CharField(max_length=96) + len = models.PositiveBigIntegerField() + store_created = models.DateTimeField(help_text="The instant the object ws first placed in the store") + created = models.DateTimeField( + null=False, + help_text="Instant object became known. May not be the same as the storage's created value for the instance. It will hold ctime for objects imported from older disk storage" + ) + modified = models.DateTimeField( + null=False, + help_text="Last instant object was modified. May not be the same as the storage's modified value for the instance. It will hold mtime for objects imported from older disk storage unless they've actually been overwritten more recently" + ) + doc_name = models.CharField(max_length=255, null=True, blank=True) + doc_rev = models.CharField(max_length=16, null=True, blank=True) + deleted = models.DateTimeField(null=True) + + class Meta: + constraints = [ + models.UniqueConstraint(fields=['store', 'name'], name='unique_name_per_store'), + ] + indexes = [ + models.Index(fields=["doc_name", "doc_rev"]), + ] + + def __str__(self): + return f"{self.store}:{self.name}" diff --git a/ietf/doc/resources.py b/ietf/doc/resources.py index 99e26ac33d8..157a3ad5568 100644 --- a/ietf/doc/resources.py +++ b/ietf/doc/resources.py @@ -12,13 +12,13 @@ from ietf import api from ietf.doc.models import (BallotType, DeletedEvent, StateType, State, Document, - DocumentAuthor, DocEvent, StateDocEvent, DocHistory, ConsensusDocEvent, DocAlias, + DocumentAuthor, DocEvent, StateDocEvent, DocHistory, ConsensusDocEvent, TelechatDocEvent, DocReminder, LastCallDocEvent, NewRevisionDocEvent, WriteupDocEvent, InitialReviewDocEvent, DocHistoryAuthor, BallotDocEvent, RelatedDocument, RelatedDocHistory, BallotPositionDocEvent, AddedMessageEvent, SubmissionDocEvent, ReviewRequestDocEvent, ReviewAssignmentDocEvent, EditedAuthorsDocEvent, DocumentURL, IanaExpertDocEvent, IRSGBallotDocEvent, DocExtResource, DocumentActionHolder, - BofreqEditorDocEvent,BofreqResponsibleDocEvent) + BofreqEditorDocEvent, BofreqResponsibleDocEvent, StoredObject) from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource class BallotTypeResource(ModelResource): @@ -130,7 +130,6 @@ class Meta: "external_url": ALL, "uploaded_filename": ALL, "note": ALL, - "internal_comments": ALL, "name": ALL, "type": ALL_WITH_RELATIONS, "stream": ALL_WITH_RELATIONS, @@ -247,7 +246,6 @@ class Meta: "external_url": ALL, "uploaded_filename": ALL, "note": ALL, - "internal_comments": ALL, "name": ALL, "type": ALL_WITH_RELATIONS, "stream": ALL_WITH_RELATIONS, @@ -286,21 +284,6 @@ class Meta: } api.doc.register(ConsensusDocEventResource()) -class DocAliasResource(ModelResource): - document = ToOneField(DocumentResource, 'document') - class Meta: - cache = SimpleCache() - queryset = DocAlias.objects.all() - serializer = api.Serializer() - detail_uri_name = 'name' - #resource_name = 'docalias' - ordering = ['id', ] - filtering = { - "name": ALL, - "document": ALL_WITH_RELATIONS, - } -api.doc.register(DocAliasResource()) - from ietf.person.resources import PersonResource class TelechatDocEventResource(ModelResource): by = ToOneField(PersonResource, 'by') @@ -490,7 +473,7 @@ class Meta: from ietf.name.resources import DocRelationshipNameResource class RelatedDocumentResource(ModelResource): source = ToOneField(DocumentResource, 'source') - target = ToOneField(DocAliasResource, 'target') + target = ToOneField(DocumentResource, 'target') relationship = ToOneField(DocRelationshipNameResource, 'relationship') class Meta: cache = SimpleCache() @@ -509,7 +492,7 @@ class Meta: from ietf.name.resources import DocRelationshipNameResource class RelatedDocHistoryResource(ModelResource): source = ToOneField(DocHistoryResource, 'source') - target = ToOneField(DocAliasResource, 'target') + target = ToOneField(DocumentResource, 'target') relationship = ToOneField(DocRelationshipNameResource, 'relationship') class Meta: cache = SimpleCache() @@ -859,3 +842,26 @@ class Meta: "responsible": ALL_WITH_RELATIONS, } api.doc.register(BofreqResponsibleDocEventResource()) + + +class StoredObjectResource(ModelResource): + class Meta: + queryset = StoredObject.objects.all() + serializer = api.Serializer() + cache = SimpleCache() + #resource_name = 'storedobject' + ordering = ['id', ] + filtering = { + "id": ALL, + "store": ALL, + "name": ALL, + "sha384": ALL, + "len": ALL, + "store_created": ALL, + "created": ALL, + "modified": ALL, + "doc_name": ALL, + "doc_rev": ALL, + "deleted": ALL, + } +api.doc.register(StoredObjectResource()) diff --git a/ietf/doc/storage.py b/ietf/doc/storage.py new file mode 100644 index 00000000000..375620ccaf3 --- /dev/null +++ b/ietf/doc/storage.py @@ -0,0 +1,182 @@ +# Copyright The IETF Trust 2025, All Rights Reserved +from typing import Optional + +import debug # pyflakes:ignore +import json + +from contextlib import contextmanager +from storages.backends.s3 import S3Storage + +from django.core.files.base import File + +from ietf.blobdb.storage import BlobdbStorage +from ietf.doc.models import StoredObject +from ietf.utils.log import log +from ietf.utils.storage import MetadataFile +from ietf.utils.timezone import timezone + + +class StoredObjectFile(MetadataFile): + """Django storage File object that represents a StoredObject""" + def __init__(self, file, name, mtime=None, content_type="", store=None, doc_name=None, doc_rev=None): + super().__init__( + file=file, + name=name, + mtime=mtime, + content_type=content_type, + ) + self.store = store + self.doc_name = doc_name + self.doc_rev = doc_rev + + @classmethod + def from_storedobject(cls, file, name, store): + """Alternate constructor for objects that already exist in the StoredObject table""" + stored_object = StoredObject.objects.exclude_deleted().filter(store=store, name=name).first() + if stored_object is None: + raise FileNotFoundError(f"StoredObject for {store}:{name} does not exist or was deleted") + file = cls(file, name, store, doc_name=stored_object.doc_name, doc_rev=stored_object.doc_rev) + if int(file.custom_metadata["len"]) != stored_object.len: + raise RuntimeError(f"File length changed unexpectedly for {store}:{name}") + if file.custom_metadata["sha384"] != stored_object.sha384: + raise RuntimeError(f"SHA-384 hash changed unexpectedly for {store}:{name}") + return file + + +@contextmanager +def maybe_log_timing(enabled, op, **kwargs): + """If enabled, log elapsed time and additional data from kwargs + + Emits log even if an exception occurs + """ + before = timezone.now() + exception = None + try: + yield + except Exception as err: + exception = err + raise + finally: + if enabled: + dt = timezone.now() - before + log( + json.dumps( + { + "log": "S3Storage_timing", + "seconds": dt.total_seconds(), + "op": op, + "exception": "" if exception is None else repr(exception), + **kwargs, + } + ) + ) + + +class MetadataS3Storage(S3Storage): + def get_default_settings(self): + # add a default for the ietf_log_blob_timing boolean + return super().get_default_settings() | {"ietf_log_blob_timing": False} + + def _save(self, name, content: File): + with maybe_log_timing( + self.ietf_log_blob_timing, "_save", bucket_name=self.bucket_name, name=name + ): + return super()._save(name, content) + + def _open(self, name, mode="rb"): + with maybe_log_timing( + self.ietf_log_blob_timing, + "_open", + bucket_name=self.bucket_name, + name=name, + mode=mode, + ): + return super()._open(name, mode) + + def delete(self, name): + with maybe_log_timing( + self.ietf_log_blob_timing, "delete", bucket_name=self.bucket_name, name=name + ): + super().delete(name) + + def _get_write_parameters(self, name, content=None): + # debug.show('f"getting write parameters for {name}"') + params = super()._get_write_parameters(name, content) + # If we have a non-empty explicit content type, use it + content_type = getattr(content, "content_type", "").strip() + if content_type != "": + params["ContentType"] = content_type + if "Metadata" not in params: + params["Metadata"] = {} + if hasattr(content, "custom_metadata"): + params["Metadata"].update(content.custom_metadata) + return params + + +class StoredObjectBlobdbStorage(BlobdbStorage): + ietf_log_blob_timing = True + warn_if_missing = True # TODO-BLOBSTORE make this configurable (or remove it) + + def _save_stored_object(self, name, content) -> StoredObject: + now = timezone.now() + record, created = StoredObject.objects.get_or_create( + store=self.bucket_name, + name=name, + defaults=dict( + sha384=content.custom_metadata["sha384"], + len=int(content.custom_metadata["len"]), + store_created=now, + created=now, + modified=now, + doc_name=getattr( + content, + "doc_name", # Note that these are assumed to be invariant + None, # should be blank? + ), + doc_rev=getattr( + content, + "doc_rev", # for a given name + None, # should be blank? + ), + ), + ) + if not created and ( + record.sha384 != content.custom_metadata["sha384"] + or record.len != int(content.custom_metadata["len"]) + or record.deleted is not None + ): + record.sha384 = content.custom_metadata["sha384"] + record.len = int(content.custom_metadata["len"]) + record.modified = now + record.deleted = None + record.save() + return record + + def _delete_stored_object(self, name) -> Optional[StoredObject]: + existing_record = StoredObject.objects.filter(store=self.bucket_name, name=name) + if not existing_record.exists() and self.warn_if_missing: + complaint = ( + f"WARNING: Asked to delete {name} from {self.bucket_name} storage, " + f"but there was no matching StoredObject" + ) + log(complaint) + debug.show("complaint") + else: + now = timezone.now() + # Note that existing_record is a queryset that will have one matching object + existing_record.exclude_deleted().update(deleted=now) + return existing_record.first() + + def _save(self, name, content): + """Perform the save operation + + In principle the name could change on save to the blob store. As of now, BlobdbStorage + will not change it, but allow for that possibility. Callers should be prepared for this. + """ + saved_name = super()._save(name, content) + self._save_stored_object(saved_name, content) + return saved_name + + def delete(self, name): + self._delete_stored_object(name) + super().delete(name) diff --git a/ietf/doc/storage_utils.py b/ietf/doc/storage_utils.py new file mode 100644 index 00000000000..81588c83ec3 --- /dev/null +++ b/ietf/doc/storage_utils.py @@ -0,0 +1,197 @@ +# Copyright The IETF Trust 2025, All Rights Reserved +import datetime +from io import BufferedReader +from typing import Optional, Union + +import debug # pyflakes ignore + +from django.conf import settings +from django.core.files.base import ContentFile, File +from django.core.files.storage import storages, Storage + +from ietf.utils.log import log + + +class StorageUtilsError(Exception): + pass + + +class AlreadyExistsError(StorageUtilsError): + pass + + +def _get_storage(kind: str) -> Storage: + if kind in settings.ARTIFACT_STORAGE_NAMES: + return storages[kind] + else: + debug.say(f"Got into not-implemented looking for {kind}") + raise NotImplementedError(f"Don't know how to store {kind}") + + +def exists_in_storage(kind: str, name: str) -> bool: + if settings.ENABLE_BLOBSTORAGE: + try: + store = _get_storage(kind) + with store.open(name): + return True + except FileNotFoundError: + return False + except Exception as err: + log(f"Blobstore Error: Failed to test existence of {kind}:{name}: {repr(err)}") + if settings.SERVER_MODE == "development": + raise + return False + + +def remove_from_storage(kind: str, name: str, warn_if_missing: bool = True) -> None: + if settings.ENABLE_BLOBSTORAGE: + try: + if exists_in_storage(kind, name): + _get_storage(kind).delete(name) + elif warn_if_missing: + complaint = ( + f"WARNING: Asked to delete non-existent {name} from {kind} storage" + ) + debug.show("complaint") + log(complaint) + except Exception as err: + log(f"Blobstore Error: Failed to remove {kind}:{name}: {repr(err)}") + if settings.SERVER_MODE == "development": + raise + return None + + +def store_file( + kind: str, + name: str, + file: Union[File, BufferedReader], + allow_overwrite: bool = False, + doc_name: Optional[str] = None, + doc_rev: Optional[str] = None, + content_type: str="", + mtime: Optional[datetime.datetime]=None, +) -> None: + from .storage import StoredObjectFile # avoid circular import + if settings.ENABLE_BLOBSTORAGE: + try: + is_new = not exists_in_storage(kind, name) + # debug.show('f"Asked to store {name} in {kind}: is_new={is_new}, allow_overwrite={allow_overwrite}"') + if not allow_overwrite and not is_new: + debug.show('f"Failed to save {kind}:{name} - name already exists in store"') + raise AlreadyExistsError(f"Failed to save {kind}:{name} - name already exists in store") + new_name = _get_storage(kind).save( + name, + StoredObjectFile( + file=file, + name=name, + doc_name=doc_name, + doc_rev=doc_rev, + mtime=mtime, + content_type=content_type, + ), + ) + if new_name != name: + complaint = f"Error encountered saving '{name}' - results stored in '{new_name}' instead." + debug.show("complaint") + raise StorageUtilsError(complaint) + except Exception as err: + log(f"Blobstore Error: Failed to store file {kind}:{name}: {repr(err)}") + if settings.SERVER_MODE == "development": + raise # TODO-BLOBSTORE eventually make this an error for all modes + return None + + +def store_bytes( + kind: str, + name: str, + content: bytes, + allow_overwrite: bool = False, + doc_name: Optional[str] = None, + doc_rev: Optional[str] = None, + content_type: str = "", + mtime: Optional[datetime.datetime] = None, +) -> None: + if settings.ENABLE_BLOBSTORAGE: + try: + store_file( + kind, + name, + ContentFile(content), + allow_overwrite, + doc_name, + doc_rev, + content_type, + mtime, + ) + except Exception as err: + # n.b., not likely to get an exception here because store_file or store_bytes will catch it + log(f"Blobstore Error: Failed to store bytes to {kind}:{name}: {repr(err)}") + if settings.SERVER_MODE == "development": + raise # TODO-BLOBSTORE eventually make this an error for all modes + return None + + +def store_str( + kind: str, + name: str, + content: str, + allow_overwrite: bool = False, + doc_name: Optional[str] = None, + doc_rev: Optional[str] = None, + content_type: str = "", + mtime: Optional[datetime.datetime] = None, +) -> None: + if settings.ENABLE_BLOBSTORAGE: + try: + content_bytes = content.encode("utf-8") + store_bytes( + kind, + name, + content_bytes, + allow_overwrite, + doc_name, + doc_rev, + content_type, + mtime, + ) + except Exception as err: + # n.b., not likely to get an exception here because store_file or store_bytes will catch it + log(f"Blobstore Error: Failed to store string to {kind}:{name}: {repr(err)}") + if settings.SERVER_MODE == "development": + raise # TODO-BLOBSTORE eventually make this an error for all modes + return None + + +def retrieve_bytes(kind: str, name: str) -> bytes: + from ietf.doc.storage import maybe_log_timing + content = b"" + if settings.ENABLE_BLOBSTORAGE: + try: + store = _get_storage(kind) + with store.open(name) as f: + with maybe_log_timing( + hasattr(store, "ietf_log_blob_timing") and store.ietf_log_blob_timing, + "read", + bucket_name=store.bucket_name if hasattr(store, "bucket_name") else "", + name=name, + ): + content = f.read() + except Exception as err: + log(f"Blobstore Error: Failed to read bytes from {kind}:{name}: {repr(err)}") + if settings.SERVER_MODE == "development": + raise + return content + + +def retrieve_str(kind: str, name: str) -> str: + content = "" + if settings.ENABLE_BLOBSTORAGE: + try: + content_bytes = retrieve_bytes(kind, name) + # TODO-BLOBSTORE: try to decode all the different ways doc.text() does + content = content_bytes.decode("utf-8") + except Exception as err: + log(f"Blobstore Error: Failed to read string from {kind}:{name}: {repr(err)}") + if settings.SERVER_MODE == "development": + raise + return content diff --git a/ietf/doc/tasks.py b/ietf/doc/tasks.py new file mode 100644 index 00000000000..4f7fe377823 --- /dev/null +++ b/ietf/doc/tasks.py @@ -0,0 +1,130 @@ +# Copyright The IETF Trust 2024-2025, All Rights Reserved +# +# Celery task definitions +# +import datetime +import debug # pyflakes:ignore + +from celery import shared_task +from pathlib import Path + +from django.conf import settings +from django.utils import timezone + +from ietf.utils import log +from ietf.utils.timezone import datetime_today + +from .expire import ( + in_draft_expire_freeze, + get_expired_drafts, + expirable_drafts, + send_expire_notice_for_draft, + expire_draft, + clean_up_draft_files, + get_soon_to_expire_drafts, + send_expire_warning_for_draft, +) +from .lastcall import get_expired_last_calls, expire_last_call +from .models import Document, NewRevisionDocEvent +from .utils import ( + generate_idnits2_rfc_status, + generate_idnits2_rfcs_obsoleted, + update_or_create_draft_bibxml_file, + ensure_draft_bibxml_path_exists, + investigate_fragment, +) + + +@shared_task +def expire_ids_task(): + try: + if not in_draft_expire_freeze(): + log.log("Expiring drafts ...") + for doc in get_expired_drafts(): + # verify expirability -- it might have changed after get_expired_drafts() was run + # (this whole loop took about 2 minutes on 04 Jan 2018) + # N.B., re-running expirable_drafts() repeatedly is fairly expensive. Where possible, + # it's much faster to run it once on a superset query of the objects you are going + # to test and keep its results. That's not desirable here because it would defeat + # the purpose of double-checking that a document is still expirable when it is actually + # being marked as expired. + if expirable_drafts( + Document.objects.filter(pk=doc.pk) + ).exists() and doc.expires < datetime_today() + datetime.timedelta(1): + send_expire_notice_for_draft(doc) + expire_draft(doc) + log.log(f" Expired draft {doc.name}-{doc.rev}") + + log.log("Cleaning up draft files") + clean_up_draft_files() + except Exception as e: + log.log("Exception in expire-ids: %s" % e) + raise + + +@shared_task +def notify_expirations_task(notify_days=14): + for doc in get_soon_to_expire_drafts(notify_days): + send_expire_warning_for_draft(doc) + + +@shared_task +def expire_last_calls_task(): + for doc in get_expired_last_calls(): + try: + expire_last_call(doc) + except Exception: + log.log(f"ERROR: Failed to expire last call for {doc.file_tag()} (id={doc.pk})") + else: + log.log(f"Expired last call for {doc.file_tag()} (id={doc.pk})") + + +@shared_task +def generate_idnits2_rfc_status_task(): + outpath = Path(settings.DERIVED_DIR) / "idnits2-rfc-status" + blob = generate_idnits2_rfc_status() + try: + outpath.write_text(blob, encoding="utf8") # TODO-BLOBSTORE + except Exception as e: + log.log(f"failed to write idnits2-rfc-status: {e}") + + +@shared_task +def generate_idnits2_rfcs_obsoleted_task(): + outpath = Path(settings.DERIVED_DIR) / "idnits2-rfcs-obsoleted" + blob = generate_idnits2_rfcs_obsoleted() + try: + outpath.write_text(blob, encoding="utf8") # TODO-BLOBSTORE + except Exception as e: + log.log(f"failed to write idnits2-rfcs-obsoleted: {e}") + + +@shared_task +def generate_draft_bibxml_files_task(days=7, process_all=False): + """Generate bibxml files for recently updated docs + + If process_all is False (the default), processes only docs with new revisions + in the last specified number of days. + """ + if not process_all and days < 1: + raise ValueError("Must call with days >= 1 or process_all=True") + ensure_draft_bibxml_path_exists() + doc_events = NewRevisionDocEvent.objects.filter( + type="new_revision", + doc__type_id="draft", + ).order_by("time") + if not process_all: + doc_events = doc_events.filter(time__gte=timezone.now() - datetime.timedelta(days=days)) + for event in doc_events: + try: + update_or_create_draft_bibxml_file(event.doc, event.rev) + except Exception as err: + log.log(f"Error generating bibxml for {event.doc.name}-{event.rev}: {err}") + + +@shared_task(ignore_result=False) +def investigate_fragment_task(name_fragment: str): + return { + "name_fragment": name_fragment, + "results": investigate_fragment(name_fragment), + } diff --git a/ietf/doc/templatetags/active_groups_menu.py b/ietf/doc/templatetags/active_groups_menu.py index af8f268ebd1..c60d6dcd1af 100644 --- a/ietf/doc/templatetags/active_groups_menu.py +++ b/ietf/doc/templatetags/active_groups_menu.py @@ -11,7 +11,7 @@ @register.simple_tag def active_groups_menu(flavor): - parents = GroupTypeName.objects.filter(slug__in=["ag", "area", "rag", "team", "dir", "program"]) + parents = GroupTypeName.objects.filter(slug__in=["ag", "area", "rag", "team", "dir", "program", "iabworkshop"]) others = [] for group in Group.objects.filter(acronym__in=("rsoc",), state_id="active"): group.menu_url = reverse("ietf.group.views.group_home", kwargs=dict(acronym=group.acronym)) # type: ignore @@ -23,4 +23,4 @@ def active_groups_menu(flavor): return render_to_string( "base/menu_active_groups.html", {"parents": parents, "others": others, "flavor": flavor}, - ) \ No newline at end of file + ) diff --git a/ietf/doc/templatetags/ballot_icon.py b/ietf/doc/templatetags/ballot_icon.py index 9ddb3833a15..07a6c7f9265 100644 --- a/ietf/doc/templatetags/ballot_icon.py +++ b/ietf/doc/templatetags/ballot_icon.py @@ -96,9 +96,14 @@ def sort_key(t): positions = list(ballot.active_balloter_positions().items()) positions.sort(key=sort_key) + request = context.get("request") + ballot_edit_return_point_param = f"ballot_edit_return_point={request.path}" + right_click_string = '' if has_role(user, "Area Director"): - right_click_string = 'oncontextmenu="window.location.href=\'%s\';return false;"' % urlreverse('ietf.doc.views_ballot.edit_position', kwargs=dict(name=doc.name, ballot_id=ballot.pk)) + right_click_string = 'oncontextmenu="window.location.href=\'{}?{}\';return false;"'.format( + urlreverse('ietf.doc.views_ballot.edit_position', kwargs=dict(name=doc.name, ballot_id=ballot.pk)), + ballot_edit_return_point_param) my_blocking = False for i, (balloter, pos) in enumerate(positions): @@ -113,10 +118,14 @@ def sort_key(t): typename = "RSAB" else: typename = "IESG" + + modal_url = "{}?{}".format( + urlreverse("ietf.doc.views_doc.ballot_popup", kwargs=dict(name=doc.name, ballot_id=ballot.pk)), + ballot_edit_return_point_param) res = [' goal2: - class_name = "bg-danger" + class_name = "text-bg-danger" elif days > goal1: - class_name = "bg-warning" + class_name = "text-bg-warning" else: # don't show a badge when things are in the green; clutters display # class_name = "text-success" @@ -247,6 +256,6 @@ def auth48_alert_badge(doc): rfced_state = doc.get_state_slug('draft-rfceditor') if rfced_state == 'auth48': - return mark_safe('AUTH48') + return mark_safe('AUTH48') return '' diff --git a/ietf/doc/templatetags/document_type_badge.py b/ietf/doc/templatetags/document_type_badge.py new file mode 100644 index 00000000000..a82c606ff90 --- /dev/null +++ b/ietf/doc/templatetags/document_type_badge.py @@ -0,0 +1,29 @@ +# Copyright The IETF Trust 2015-2020, All Rights Reserved +from django import template +from django.conf import settings +from django.template.loader import render_to_string +from ietf.utils.log import log + +register = template.Library() + + +@register.simple_tag +def document_type_badge(doc, snapshot, submission, resurrected_by): + context = {"doc": doc, "snapshot": snapshot, "submission": submission, "resurrected_by": resurrected_by} + if doc.type_id == "rfc": + return render_to_string( + "doc/badge/doc-badge-rfc.html", + context, + ) + elif doc.type_id == "draft": + return render_to_string( + "doc/badge/doc-badge-draft.html", + context, + ) + else: + error_message = f"Unsupported document type {doc.type_id}." + if settings.SERVER_MODE != 'production': + raise ValueError(error_message) + else: + log(error_message) + return "" diff --git a/ietf/doc/templatetags/ietf_filters.py b/ietf/doc/templatetags/ietf_filters.py index 332e5ca1528..5cabe1728d0 100644 --- a/ietf/doc/templatetags/ietf_filters.py +++ b/ietf/doc/templatetags/ietf_filters.py @@ -1,9 +1,10 @@ -# Copyright The IETF Trust 2007-2020, All Rights Reserved +# Copyright The IETF Trust 2007-2023, All Rights Reserved # -*- coding: utf-8 -*- import datetime import re +from pathlib import Path from urllib.parse import urljoin from zoneinfo import ZoneInfo @@ -13,8 +14,7 @@ from django.template.defaultfilters import truncatewords_html, linebreaksbr, stringfilter, striptags from django.utils.safestring import mark_safe, SafeData from django.utils.html import strip_tags -from django.utils.encoding import force_text -from django.utils.encoding import force_str # pyflakes:ignore force_str is used in the doctests +from django.utils.encoding import force_str from django.urls import reverse as urlreverse from django.core.cache import cache from django.core.exceptions import ValidationError @@ -23,13 +23,14 @@ import debug # pyflakes:ignore -from ietf.doc.models import BallotDocEvent, DocAlias +from ietf.doc.models import BallotDocEvent, Document from ietf.doc.models import ConsensusDocEvent from ietf.ietfauth.utils import can_request_rfc_publication as utils_can_request_rfc_publication -from ietf.utils.html import sanitize_fragment from ietf.utils import log from ietf.doc.utils import prettify_std_name -from ietf.utils.text import wordwrap, fill, wrap_text_if_unwrapped, bleach_linker, bleach_cleaner, validate_url +from ietf.utils.html import clean_html +from ietf.utils.text import wordwrap, fill, wrap_text_if_unwrapped, linkify +from ietf.utils.validators import validate_url register = template.Library() @@ -98,7 +99,7 @@ def sanitize(value): attributes to those deemed acceptable. See ietf/utils/html.py for the details. """ - return mark_safe(sanitize_fragment(value)) + return mark_safe(clean_html(value)) # For use with ballot view @@ -132,7 +133,7 @@ def bracketpos(pos,posslug): @register.filter def prettystdname(string, space=" "): from ietf.doc.utils import prettify_std_name - return prettify_std_name(force_text(string or ""), space) + return prettify_std_name(force_str(string or ""), space) @register.filter def rfceditor_info_url(rfcnum : str): @@ -140,15 +141,16 @@ def rfceditor_info_url(rfcnum : str): return urljoin(settings.RFC_EDITOR_INFO_BASE_URL, f'rfc{rfcnum}') -def doc_canonical_name(name): +def doc_name(name): """Check whether a given document exists, and return its canonical name""" def find_unique(n): key = hash(n) found = cache.get(key) if not found: - exact = DocAlias.objects.filter(name=n).first() + exact = Document.objects.filter(name=n).first() found = exact.name if exact else "_" + # TODO review this cache policy (and the need for these entire function) cache.set(key, found, timeout=60*60*24) # cache for one day return None if found == "_" else found @@ -174,7 +176,7 @@ def find_unique(n): def link_charter_doc_match(match): - if not doc_canonical_name(match[0]): + if not doc_name(match[0]): return match[0] url = urlreverse( "ietf.doc.views_doc.document_main", @@ -187,7 +189,7 @@ def link_non_charter_doc_match(match): name = match[0] # handle "I-D.*"" reference-style matches name = re.sub(r"^i-d\.(.*)", r"draft-\1", name, flags=re.IGNORECASE) - cname = doc_canonical_name(name) + cname = doc_name(name) if not cname: return match[0] if name == cname: @@ -202,7 +204,7 @@ def link_non_charter_doc_match(match): url = urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=cname)) return f'{match[0]}' - cname = doc_canonical_name(name) + cname = doc_name(name) if not cname: return match[0] if name == cname: @@ -222,12 +224,11 @@ def link_non_charter_doc_match(match): def link_other_doc_match(match): doc = match[2].strip().lower() rev = match[3] - if not doc_canonical_name(doc + rev): + if not doc_name(doc + rev): return match[0] url = urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=doc + rev)) return f'{match[1]}' - @register.filter(name="urlize_ietf_docs", is_safe=True, needs_autoescape=True) def urlize_ietf_docs(string, autoescape=None): """ @@ -256,6 +257,7 @@ def urlize_ietf_docs(string, autoescape=None): string, flags=re.IGNORECASE | re.ASCII, ) + return mark_safe(string) @@ -268,7 +270,7 @@ def urlize_related_source_list(related, document_html=False): names = set() titles = set() for rel in related: - name=rel.source.canonical_name() + name=rel.source.name title = rel.source.title if name in names and title in titles: continue @@ -283,14 +285,14 @@ def urlize_related_source_list(related, document_html=False): url=url) )) return links - + @register.filter(name='urlize_related_target_list', is_safe=True, document_html=False) def urlize_related_target_list(related, document_html=False): """Convert a list of RelatedDocuments into list of links using the target document's canonical name""" links = [] for rel in related: - name=rel.target.document.canonical_name() - title = rel.target.document.title + name=rel.target.name + title = rel.target.title url = urlreverse('ietf.doc.views_doc.document_main' if document_html is False else 'ietf.doc.views_doc.document_html', kwargs=dict(name=name)) name = escape(name) title = escape(title) @@ -300,7 +302,7 @@ def urlize_related_target_list(related, document_html=False): url=url) )) return links - + @register.filter(name='dashify') def dashify(string): """ @@ -410,9 +412,9 @@ def startswith(x, y): return str(x).startswith(y) -@register.filter(name='removesuffix', is_safe=False) -def removesuffix(value, suffix): - """Remove an exact-match suffix +@register.filter(name='removeprefix', is_safe=False) +def removeprefix(value, prefix): + """Remove an exact-match prefix The is_safe flag is False because indiscriminate use of this could result in non-safe output. See https://docs.djangoproject.com/en/2.2/howto/custom-template-tags/#filters-and-auto-escaping @@ -420,8 +422,8 @@ def removesuffix(value, suffix): HTML-unsafe output. """ base = str(value) - if base.endswith(suffix): - return base[:-len(suffix)] + if base.startswith(prefix): + return base[len(prefix):] else: return base @@ -445,16 +447,16 @@ def ad_area(user): @register.filter def format_history_text(text, trunc_words=25): """Run history text through some cleaning and add ellipsis if it's too long.""" - full = mark_safe(bleach_cleaner.clean(text)) - full = bleach_linker.linkify(urlize_ietf_docs(full)) + full = mark_safe(clean_html(text)) + full = linkify(urlize_ietf_docs(full)) return format_snippet(full, trunc_words) @register.filter def format_snippet(text, trunc_words=25): # urlize if there aren't already links present - text = bleach_linker.linkify(text) - full = keep_spacing(collapsebr(linebreaksbr(mark_safe(sanitize_fragment(text))))) + text = linkify(text) + full = keep_spacing(collapsebr(linebreaksbr(mark_safe(clean_html(text))))) snippet = truncatewords_html(full, trunc_words) if snippet != full: return mark_safe('
%s
%s
' % (snippet, full)) @@ -478,6 +480,19 @@ def state(doc, slug): slug = "%s-stream-%s" % (doc.type_id, doc.stream_id) return doc.get_state(slug) + +@register.filter +def is_unexpected_wg_state(doc): + """Returns a flag indicating whether the document has an unexpected wg state.""" + if not doc.type_id == "draft": + return False + + draft_iesg_state = doc.get_state("draft-iesg") + draft_stream_state = doc.get_state("draft-stream-ietf") + + return draft_iesg_state.slug != "idexists" and draft_stream_state is not None and draft_stream_state.slug != "sub-pub" + + @register.filter def statehelp(state): "Output help icon with tooltip for state." @@ -506,10 +521,52 @@ def plural(text, seq, arg='s'): else: return text + pluralize(len(seq), arg) + +# Translation table to escape ICS characters. The {} | {} construction builds up a dict +# mapping characters to arbitrary-length strings or None. Values in later dicts override +# earlier ones prior to conversion to a translation table, so excluding a char and then +# mapping it to an escape sequence results in its being escaped, not dropped. +rfc5545_text_escapes = str.maketrans( + # text = *(TSAFE-CHAR / ":" / DQUOTE / ESCAPED-CHAR) + # TSAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-5B / + # %x5D-7E / NON-US-ASCII + {chr(c): None for c in range(0x00, 0x20)} # strip 0x00-0x20 + | { + # ESCAPED-CHAR = ("\\" / "\;" / "\," / "\N" / "\n") + "\n": r"\n", + ";": r"\;", + ",": r"\,", + "\\": r"\\", # rhs is two backslashes! + "\t": "\t", # htab ok (0x09) + " ": " ", # space ok (0x20) + } +) + + @register.filter def ics_esc(text): - text = re.sub(r"([\n,;\\])", r"\\\1", text) - return text + """Escape a string to use in an iCalendar text context + + >>> ics_esc('simple') + 'simple' + + For the next tests, it helps to know: + chr(0x09) = "\t" + chr(0x0a) = "\n" + chr(0x0d) = "\r" + chr(0x5c) = "\\" + + >>> ics_esc(f'strips{chr(0x0d)}out{chr(0x0d)}LFs') + 'stripsoutLFs' + + + >>> ics_esc(f'escapes;and,and{chr(0x5c)}and{chr(0x0a)}') + 'escapes\\\\;and\\\\,and\\\\\\\\and\\\\n' + + >>> ics_esc(f"keeps spaces : and{chr(0x09)}tabs") + 'keeps spaces : and\\ttabs' + """ + return text.translate(rfc5545_text_escapes) @register.simple_tag @@ -531,15 +588,22 @@ def ics_date_time(dt, tzname): >>> ics_date_time(datetime.datetime(2022,1,2,3,4,5), 'UTC') ':20220102T030405Z' + >>> ics_date_time(datetime.datetime(2022,1,2,3,4,5), 'GmT') + ':20220102T030405Z' + >>> ics_date_time(datetime.datetime(2022,1,2,3,4,5), 'America/Los_Angeles') ';TZID=America/Los_Angeles:20220102T030405' """ timestamp = dt.strftime('%Y%m%dT%H%M%S') - if tzname.lower() == 'utc': + if tzname.lower() in ('gmt', 'utc'): return f':{timestamp}Z' else: return f';TZID={ics_esc(tzname)}:{timestamp}' +@register.filter +def next_day(value): + return value + datetime.timedelta(days=1) + @register.filter def consensus(doc): @@ -557,7 +621,7 @@ def consensus(doc): @register.filter def std_level_to_label_format(doc): """Returns valid Bootstrap classes to label a status level badge.""" - if doc.is_rfc(): + if doc.type_id == "rfc": if doc.related_that("obs"): return "obs" else: @@ -654,7 +718,7 @@ def rfcbis(s): @stringfilter def urlize(value): raise RuntimeError("Use linkify from textfilters instead of urlize") - + @register.filter @stringfilter def charter_major_rev(rev): @@ -705,10 +769,10 @@ def action_holder_badge(action_holder): '' >>> action_holder_badge(DocumentActionHolderFactory(time_added=timezone.now() - datetime.timedelta(days=16))) - ' 16' + ' 16' >>> action_holder_badge(DocumentActionHolderFactory(time_added=timezone.now() - datetime.timedelta(days=30))) - ' 30' + ' 30' >>> settings.DOC_ACTION_HOLDER_AGE_LIMIT_DAYS = old_limit """ @@ -716,7 +780,7 @@ def action_holder_badge(action_holder): age = (timezone.now() - action_holder.time_added).days if age > age_limit: return mark_safe( - ' %d' + ' %d' % (age, "s" if age != 1 else "", age_limit, age) ) else: @@ -843,3 +907,113 @@ def is_valid_url(url): except ValidationError: return False return True + + +@register.filter +def badgeify(blob): + """ + Add an appropriate bootstrap badge around "text", based on its contents. + """ + config = [ + (r"rejected|not ready|serious issues", "danger", "x-lg"), + (r"complete|accepted|ready", "success", ""), + (r"has nits|almost ready", "info", "info-lg"), + (r"has issues|on the right track", "warning", "exclamation-lg"), + (r"assigned", "info", "person-plus-fill"), + (r"will not review|overtaken by events|withdrawn", "secondary", "dash-lg"), + (r"no response", "warning", "question-lg"), + ] + text = str(blob) + + for pattern, color, icon in config: + if re.search(pattern, text, flags=re.IGNORECASE): + # Shorten the badge text + text = re.sub(r"with ", "w/", text, flags=re.IGNORECASE) + text = re.sub(r"document", "doc", text, flags=re.IGNORECASE) + text = re.sub(r"will not", "won't", text, flags=re.IGNORECASE) + + return mark_safe( + f""" + + {text.capitalize()} + + """ + ) + + return text + +@register.filter +def simple_history_delta_changes(history): + """Returns diff between given history and previous entry.""" + prev = history.prev_record + if prev: + delta = history.diff_against(prev) + return delta.changes + return [] + +@register.filter +def simple_history_delta_change_cnt(history): + """Returns number of changes between given history and previous entry.""" + prev = history.prev_record + if prev: + delta = history.diff_against(prev) + return len(delta.changes) + return 0 + +@register.filter +def mtime(path): + """Returns a datetime object representing mtime given a pathlib Path object""" + return datetime.datetime.fromtimestamp(path.stat().st_mtime).astimezone(ZoneInfo(settings.TIME_ZONE)) + +@register.filter +def mtime_is_epoch(path): + return path.stat().st_mtime == 0 + +@register.filter +def url_for_path(path): + """Consructs a 'best' URL for web access to the given pathlib Path object. + + Assumes that the path is into the Internet-Draft archive or the proceedings. + """ + if Path(settings.AGENDA_PATH) in path.parents: + return ( + f"https://www.ietf.org/proceedings/{path.relative_to(settings.AGENDA_PATH)}" + ) + elif any( + [ + pathdir in path.parents + for pathdir in [ + Path(settings.INTERNET_DRAFT_PATH), + Path(settings.INTERNET_DRAFT_ARCHIVE_DIR).parent, + Path(settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR), + ] + ] + ): + return f"{settings.IETF_ID_ARCHIVE_URL}{path.name}" + else: + return "#" + + +@register.filter +def is_in_stream(doc): + """ + Check if the doc is in one of the states in it stream that + indicate that is actually adopted, i.e., part of the stream. + (There are various "candidate" states that necessitate this + filter.) + """ + if not doc.stream: + return False + stream = doc.stream.slug + state = doc.get_state_slug(f"draft-stream-{doc.stream.slug}") + if not state: + return True + if stream == "ietf": + return state not in ["wg-cand", "c-adopt"] + elif stream == "irtf": + return state != "candidat" + elif stream == "iab": + return state not in ["candidat", "diff-org"] + elif stream == "editorial": + return True + return False diff --git a/ietf/doc/templatetags/tests_ietf_filters.py b/ietf/doc/templatetags/tests_ietf_filters.py index f791d615301..b5130849ea2 100644 --- a/ietf/doc/templatetags/tests_ietf_filters.py +++ b/ietf/doc/templatetags/tests_ietf_filters.py @@ -3,13 +3,26 @@ from django.conf import settings from ietf.doc.factories import ( - WgDraftFactory, + WgRfcFactory, IndividualDraftFactory, CharterFactory, NewRevisionDocEventFactory, + StatusChangeFactory, + RgDraftFactory, + EditorialDraftFactory, + WgDraftFactory, + ConflictReviewFactory, + BofreqFactory, + StatementFactory, + RfcFactory, +) +from ietf.doc.models import DocEvent +from ietf.doc.templatetags.ietf_filters import ( + urlize_ietf_docs, + is_valid_url, + is_in_stream, + is_unexpected_wg_state, ) -from ietf.doc.models import State, DocEvent, DocAlias -from ietf.doc.templatetags.ietf_filters import urlize_ietf_docs, is_valid_url from ietf.person.models import Person from ietf.utils.test_utils import TestCase @@ -19,29 +32,42 @@ class IetfFiltersTests(TestCase): + def test_is_in_stream(self): + for draft in [ + IndividualDraftFactory(), + CharterFactory(), + StatusChangeFactory(), + ConflictReviewFactory(), + StatementFactory(), + BofreqFactory(), + ]: + self.assertFalse(is_in_stream(draft)) + for draft in [RgDraftFactory(), WgDraftFactory(), EditorialDraftFactory()]: + self.assertTrue(is_in_stream(draft)) + for stream in ["iab", "ietf", "irtf", "ise", "editorial"]: + self.assertTrue(is_in_stream(IndividualDraftFactory(stream_id=stream))) + def test_is_valid_url(self): cases = [(settings.IDTRACKER_BASE_URL, True), ("not valid", False)] for url, result in cases: self.assertEqual(is_valid_url(url), result) def test_urlize_ietf_docs(self): - wg_id = WgDraftFactory() - wg_id.set_state(State.objects.get(type="draft", slug="rfc")) - wg_id.std_level_id = "bcp" - wg_id.save_with_history( + rfc = WgRfcFactory(rfc_number=123456, std_level_id="bcp") + rfc.save_with_history( [ DocEvent.objects.create( - doc=wg_id, - rev=wg_id.rev, + doc=rfc, + rev=rfc.rev, type="published_rfc", by=Person.objects.get(name="(System)"), ) ] ) - DocAlias.objects.create(name="rfc123456").docs.add(wg_id) - DocAlias.objects.create(name="bcp123456").docs.add(wg_id) - DocAlias.objects.create(name="std123456").docs.add(wg_id) - DocAlias.objects.create(name="fyi123456").docs.add(wg_id) + # TODO - bring these into existance when subseries are well modeled + # DocAlias.objects.create(name="bcp123456").docs.add(rfc) + # DocAlias.objects.create(name="std123456").docs.add(rfc) + # DocAlias.objects.create(name="fyi123456").docs.add(rfc) id = IndividualDraftFactory(name="draft-me-rfc123456bis") id_num = IndividualDraftFactory(name="draft-rosen-rfcefdp-update-2026") @@ -59,15 +85,16 @@ def test_urlize_ietf_docs(self): cases = [ ("no change", "no change"), - ("bCp123456", 'bCp123456'), - ("Std 00123456", 'Std 00123456'), - ( - "FyI 0123456 changes std 00123456", - 'FyI 0123456 changes std 00123456', - ), + # TODO: rework subseries when we add them + # ("bCp123456", 'bCp123456'), + # ("Std 00123456", 'Std 00123456'), + # ( + # "FyI 0123456 changes std 00123456", + # 'FyI 0123456 changes std 00123456', + # ), ("rfc123456", 'rfc123456'), ("Rfc 0123456", 'Rfc 0123456'), - (wg_id.name, f'{wg_id.name}'), + (rfc.name, f'{rfc.name}'), ( f"{id.name}-{id.rev}.txt", f'{id.name}-{id.rev}.txt', @@ -149,3 +176,17 @@ def test_urlize_ietf_docs(self): for input, output in cases: # debug.show("(input, urlize_ietf_docs(input), output)") self.assertEqual(urlize_ietf_docs(input), output) + + def test_is_unexpected_wg_state(self): + """ + Test that the unexpected_wg_state function works correctly + """ + # test documents with expected wg states + self.assertFalse(is_unexpected_wg_state(RfcFactory())) + self.assertFalse(is_unexpected_wg_state(WgDraftFactory (states=[('draft-stream-ietf', 'sub-pub')]))) + self.assertFalse(is_unexpected_wg_state(WgDraftFactory (states=[('draft-iesg', 'idexists')]))) + self.assertFalse(is_unexpected_wg_state(WgDraftFactory (states=[('draft-stream-ietf', 'wg-cand'), ('draft-iesg','idexists')]))) + + # test documents with unexpected wg states due to invalid combination of states + self.assertTrue(is_unexpected_wg_state(WgDraftFactory (states=[('draft-stream-ietf', 'wg-cand'), ('draft-iesg','lc-req')]))) + self.assertTrue(is_unexpected_wg_state(WgDraftFactory (states=[('draft-stream-ietf', 'chair-w'), ('draft-iesg','pub-req')]))) diff --git a/ietf/doc/templatetags/wg_menu.py b/ietf/doc/templatetags/wg_menu.py index 76bf7eb4d0c..3e8d209448a 100644 --- a/ietf/doc/templatetags/wg_menu.py +++ b/ietf/doc/templatetags/wg_menu.py @@ -62,8 +62,6 @@ @register.simple_tag def wg_menu(flavor): - global parents - for p in parents: p.short_name = parent_short_names.get(p.acronym) or p.name if p.short_name.endswith(" Area"): diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index 65859bf4be5..16dcfb7754d 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -1,13 +1,16 @@ -# Copyright The IETF Trust 2012-2020, All Rights Reserved +# Copyright The IETF Trust 2012-2024, All Rights Reserved # -*- coding: utf-8 -*- import os import datetime import io +from hashlib import sha384 + +from django.http import HttpRequest import lxml import bibtexparser -import mock +from unittest import mock import json import copy import random @@ -16,11 +19,9 @@ from pathlib import Path from pyquery import PyQuery from urllib.parse import urlparse, parse_qs -from tempfile import NamedTemporaryFile from collections import defaultdict from zoneinfo import ZoneInfo -from django.core.management import call_command from django.urls import reverse as urlreverse from django.conf import settings from django.forms import Form @@ -31,20 +32,30 @@ from tastypie.test import ResourceTestCaseMixin +from weasyprint.urls import URLFetchingError + import debug # pyflakes:ignore -from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State, +from ietf.doc.models import ( Document, DocRelationshipName, RelatedDocument, State, DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, NewRevisionDocEvent, BallotType, - EditedAuthorsDocEvent ) -from ietf.doc.factories import ( DocumentFactory, DocEventFactory, CharterFactory, + EditedAuthorsDocEvent, StateType) +from ietf.doc.factories import ( DocumentFactory, DocEventFactory, CharterFactory, ConflictReviewFactory, WgDraftFactory, IndividualDraftFactory, WgRfcFactory, IndividualRfcFactory, StateDocEventFactory, BallotPositionDocEventFactory, BallotDocEventFactory, DocumentAuthorFactory, NewRevisionDocEventFactory, - StatusChangeFactory, BofreqFactory, DocExtResourceFactory, RgDraftFactory) + StatusChangeFactory, DocExtResourceFactory, RgDraftFactory, BcpFactory) from ietf.doc.forms import NotifyForm from ietf.doc.fields import SearchableDocumentsField -from ietf.doc.utils import create_ballot_if_not_open, uppercase_std_abbreviated_name -from ietf.doc.views_search import ad_dashboard_group, ad_dashboard_group_type, shorten_group_name # TODO: red flag that we're importing from views in tests. Move these to utils. +from ietf.doc.utils import ( + create_ballot_if_not_open, + investigate_fragment, + uppercase_std_abbreviated_name, + DraftAliasGenerator, + generate_idnits2_rfc_status, + generate_idnits2_rfcs_obsoleted, + get_doc_email_aliases, +) +from ietf.doc.views_doc import get_diff_revisions from ietf.group.models import Group, Role from ietf.group.factories import GroupFactory, RoleFactory from ietf.ipr.factories import HolderIprDisclosureFactory @@ -52,20 +63,22 @@ from ietf.meeting.factories import ( MeetingFactory, SessionFactory, SessionPresentationFactory, ProceedingsMaterialFactory ) -from ietf.name.models import SessionStatusName, BallotPositionName, DocTypeName +from ietf.name.models import SessionStatusName, BallotPositionName, DocTypeName, RoleName from ietf.person.models import Person from ietf.person.factories import PersonFactory, EmailFactory -from ietf.utils.mail import outbox, empty_outbox +from ietf.utils.mail import get_payload_text, outbox, empty_outbox from ietf.utils.test_utils import login_testing_unauthorized, unicontent from ietf.utils.test_utils import TestCase from ietf.utils.text import normalize_text from ietf.utils.timezone import date_today, datetime_today, DEADLINE_TZINFO, RPC_TZINFO +from ietf.doc.utils_search import AD_WORKLOAD class SearchTests(TestCase): def test_search(self): draft = WgDraftFactory(name='draft-ietf-mars-test',group=GroupFactory(acronym='mars',parent=Group.objects.get(acronym='farfut')),authors=[PersonFactory()],ad=PersonFactory()) + rfc = WgRfcFactory() draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="pub-req")) old_draft = IndividualDraftFactory(name='draft-foo-mars-test',authors=[PersonFactory()],title="Optimizing Martian Network Topologies") old_draft.set_state(State.objects.get(used=True, type="draft", slug="expired")) @@ -97,11 +110,12 @@ def test_search(self): self.assertEqual(r.status_code, 200) self.assertContains(r, "draft-foo-mars-test") - # find by rfc/active/inactive - draft.set_state(State.objects.get(type="draft", slug="rfc")) - r = self.client.get(base_url + "?rfcs=on&name=%s" % draft.name) + # find by RFC + r = self.client.get(base_url + "?rfcs=on&name=%s" % rfc.name) self.assertEqual(r.status_code, 200) - self.assertContains(r, draft.title) + self.assertContains(r, rfc.title) + + # find by active/inactive draft.set_state(State.objects.get(type="draft", slug="active")) r = self.client.get(base_url + "?activedrafts=on&name=%s" % draft.name) @@ -154,6 +168,23 @@ def test_search(self): self.assertEqual(r.status_code, 200) self.assertContains(r, draft.title) + def test_search_became_rfc(self): + draft = WgDraftFactory() + rfc = WgRfcFactory() + draft.set_state(State.objects.get(type="draft", slug="rfc")) + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) + base_url = urlreverse('ietf.doc.views_search.search') + + # find by RFC + r = self.client.get(base_url + f"?rfcs=on&name={rfc.name}") + self.assertEqual(r.status_code, 200) + self.assertContains(r, rfc.title) + + # find by draft + r = self.client.get(base_url + f"?activedrafts=on&rfcs=on&name={draft.name}") + self.assertEqual(r.status_code, 200) + self.assertContains(r, rfc.title) + def test_search_for_name(self): draft = WgDraftFactory(name='draft-ietf-mars-test',group=GroupFactory(acronym='mars',parent=Group.objects.get(acronym='farfut')),authors=[PersonFactory()],ad=PersonFactory()) draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="pub-req")) @@ -261,6 +292,17 @@ def test_search_for_name(self): parsed = urlparse(r["Location"]) self.assertEqual(parsed.path, urlreverse('ietf.doc.views_search.search')) self.assertEqual(parse_qs(parsed.query)["name"][0], "draft-ietf-doesnotexist-42") + + def test_search_rfc(self): + rfc = WgRfcFactory(name="rfc0000") + + # search for existing RFC should redirect directly to the RFC page + r = self.client.get(urlreverse('ietf.doc.views_search.search_for_name', kwargs=dict(name=rfc.name))) + self.assertRedirects(r, f'/doc/{rfc.name}/', status_code=302, target_status_code=200) + + # search for existing RFC with revision number should redirect to the RFC page + r = self.client.get(urlreverse('ietf.doc.views_search.search_for_name', kwargs=dict(name=rfc.name + "-99")), follow=True) + self.assertRedirects(r, f'/doc/{rfc.name}/', status_code=302, target_status_code=200) def test_frontpage(self): r = self.client.get("/") @@ -268,52 +310,68 @@ def test_frontpage(self): self.assertContains(r, "Document Search") def test_ad_workload(self): - Role.objects.filter(name_id='ad').delete() - ad = RoleFactory(name_id='ad',group__type_id='area',group__state_id='active',person__name='Example Areadirector').person - doc_type_names = ['bofreq', 'charter', 'conflrev', 'draft', 'statchg'] - expected = defaultdict(lambda :0) - for doc_type_name in doc_type_names: - if doc_type_name=='draft': - states = State.objects.filter(type='draft-iesg', used=True).values_list('slug', flat=True) - else: - states = State.objects.filter(type=doc_type_name, used=True).values_list('slug', flat=True) - - for state in states: - target_num = random.randint(0,2) + Role.objects.filter(name_id="ad").delete() + ad = RoleFactory( + name_id="ad", + group__type_id="area", + group__state_id="active", + person__name="Example Areadirector", + ).person + expected = defaultdict(lambda: 0) + for doc_type_slug in AD_WORKLOAD: + for state in AD_WORKLOAD[doc_type_slug]: + target_num = random.randint(0, 2) for _ in range(target_num): - if doc_type_name == 'draft': - doc = IndividualDraftFactory(ad=ad,states=[('draft-iesg', state),('draft','rfc' if state=='pub' else 'active')]) - elif doc_type_name == 'charter': - doc = CharterFactory(ad=ad, states=[(doc_type_name, state)]) - elif doc_type_name == 'bofreq': - # Note that the view currently doesn't handle bofreqs - doc = BofreqFactory(states=[(doc_type_name, state)], bofreqresponsibledocevent__responsible=[ad]) - elif doc_type_name == 'conflrev': - doc = ConflictReviewFactory(ad=ad, states=State.objects.filter(type_id=doc_type_name, slug=state)) - elif doc_type_name == 'statchg': - doc = StatusChangeFactory(ad=ad, states=State.objects.filter(type_id=doc_type_name, slug=state)) - else: - # Currently unreachable - doc = DocumentFactory(type_id=doc_type_name, ad=ad, states=[(doc_type_name, state)]) - - if not slugify(ad_dashboard_group_type(doc)) in ('document', 'none'): - expected[(slugify(ad_dashboard_group_type(doc)), slugify(ad.full_name_as_key()), slugify(shorten_group_name(ad_dashboard_group(doc))))] += 1 - - url = urlreverse('ietf.doc.views_search.ad_workload') + if ( + doc_type_slug == "draft" + or doc_type_slug == "rfc" + and state == "rfcqueue" + ): + IndividualDraftFactory( + ad=ad, + states=[ + ("draft-iesg", state), + ("draft", "rfc" if state == "pub" else "active"), + ], + ) + elif doc_type_slug == "rfc": + WgRfcFactory.create( + states=[("draft", "rfc"), ("draft-iesg", "pub")] + ) + + elif doc_type_slug == "charter": + CharterFactory(ad=ad, states=[(doc_type_slug, state)]) + elif doc_type_slug == "conflrev": + ConflictReviewFactory( + ad=ad, + states=State.objects.filter( + type_id=doc_type_slug, slug=state + ), + ) + elif doc_type_slug == "statchg": + StatusChangeFactory( + ad=ad, + states=State.objects.filter( + type_id=doc_type_slug, slug=state + ), + ) + self.client.login(username="ad", password="ad+password") + url = urlreverse("ietf.doc.views_search.ad_workload") r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) for group_type, ad, group in expected: - self.assertEqual(int(q(f'#{group_type}-{ad}-{group}').text()),expected[(group_type, ad, group)]) + self.assertEqual( + int(q(f"#{group_type}-{ad}-{group}").text()), + expected[(group_type, ad, group)], + ) def test_docs_for_ad(self): ad = RoleFactory(name_id='ad',group__type_id='area',group__state_id='active').person draft = IndividualDraftFactory(ad=ad) draft.action_holders.set([PersonFactory()]) draft.set_state(State.objects.get(type='draft-iesg', slug='lc')) - rfc = IndividualDraftFactory(ad=ad) - rfc.set_state(State.objects.get(type='draft', slug='rfc')) - DocAlias.objects.create(name='rfc6666').docs.add(rfc) + rfc = IndividualRfcFactory(ad=ad) conflrev = DocumentFactory(type_id='conflrev',ad=ad) conflrev.set_state(State.objects.get(type='conflrev', slug='iesgeval')) statchg = DocumentFactory(type_id='statchg',ad=ad) @@ -337,7 +395,7 @@ def test_docs_for_ad(self): self.assertEqual(r.status_code, 200) self.assertContains(r, draft.name) self.assertContains(r, escape(draft.action_holders.first().name)) - self.assertContains(r, rfc.canonical_name()) + self.assertContains(r, rfc.name) self.assertContains(r, conflrev.name) self.assertContains(r, statchg.name) self.assertContains(r, charter.name) @@ -345,6 +403,30 @@ def test_docs_for_ad(self): self.assertContains(r, discuss_other.doc.name) self.assertContains(r, block_other.doc.name) + def test_docs_for_iesg(self): + ad1 = RoleFactory(name_id='ad',group__type_id='area',group__state_id='active').person + ad2 = RoleFactory(name_id='ad',group__type_id='area',group__state_id='active').person + + draft = IndividualDraftFactory(ad=ad1) + draft.action_holders.set([PersonFactory()]) + draft.set_state(State.objects.get(type='draft-iesg', slug='lc')) + rfc = IndividualRfcFactory(ad=ad2) + conflrev = DocumentFactory(type_id='conflrev',ad=ad1) + conflrev.set_state(State.objects.get(type='conflrev', slug='iesgeval')) + statchg = DocumentFactory(type_id='statchg',ad=ad2) + statchg.set_state(State.objects.get(type='statchg', slug='iesgeval')) + charter = CharterFactory(name='charter-ietf-ames',ad=ad1) + charter.set_state(State.objects.get(type='charter', slug='iesgrev')) + + r = self.client.get(urlreverse('ietf.doc.views_search.docs_for_iesg')) + self.assertEqual(r.status_code, 200) + self.assertContains(r, draft.name) + self.assertContains(r, escape(draft.action_holders.first().name)) + self.assertNotContains(r, rfc.name) + self.assertContains(r, conflrev.name) + self.assertContains(r, statchg.name) + self.assertContains(r, charter.name) + def test_auth48_doc_for_ad(self): """Docs in AUTH48 state should have a decoration""" ad = RoleFactory(name_id='ad', group__type_id='area', group__state_id='active').person @@ -367,17 +449,6 @@ def test_drafts_in_last_call(self): self.assertContains(r, draft.title) self.assertContains(r, escape(draft.action_holders.first().name)) - def test_in_iesg_process(self): - doc_in_process = IndividualDraftFactory() - doc_in_process.action_holders.set([PersonFactory()]) - doc_in_process.set_state(State.objects.get(type='draft-iesg', slug='lc')) - doc_not_in_process = IndividualDraftFactory() - r = self.client.get(urlreverse('ietf.doc.views_search.drafts_in_iesg_process')) - self.assertEqual(r.status_code, 200) - self.assertContains(r, doc_in_process.title) - self.assertContains(r, escape(doc_in_process.action_holders.first().name)) - self.assertNotContains(r, doc_not_in_process.title) - def test_indexes(self): draft = IndividualDraftFactory() rfc = WgRfcFactory() @@ -385,16 +456,17 @@ def test_indexes(self): r = self.client.get(urlreverse('ietf.doc.views_search.index_all_drafts')) self.assertEqual(r.status_code, 200) self.assertContains(r, draft.name) - self.assertContains(r, rfc.canonical_name().upper()) + self.assertContains(r, rfc.name.upper()) r = self.client.get(urlreverse('ietf.doc.views_search.index_active_drafts')) self.assertEqual(r.status_code, 200) self.assertContains(r, draft.title) def test_ajax_search_docs(self): - draft = IndividualDraftFactory() + draft = IndividualDraftFactory(name="draft-ietf-rfc1234bis") + rfc = IndividualRfcFactory(rfc_number=1234) + bcp = IndividualRfcFactory(name="bcp12345", type_id="bcp") - # Document url = urlreverse('ietf.doc.views_search.ajax_select2_search_docs', kwargs={ "model_name": "document", "doc_type": "draft", @@ -404,18 +476,27 @@ def test_ajax_search_docs(self): data = r.json() self.assertEqual(data[0]["id"], draft.pk) - # DocAlias - doc_alias = draft.docalias.first() - url = urlreverse('ietf.doc.views_search.ajax_select2_search_docs', kwargs={ - "model_name": "docalias", - "doc_type": "draft", + "model_name": "document", + "doc_type": "rfc", }) + r = self.client.get(url, dict(q=rfc.name)) + self.assertEqual(r.status_code, 200) + data = r.json() + self.assertEqual(data[0]["id"], rfc.pk) - r = self.client.get(url, dict(q=doc_alias.name)) + url = urlreverse('ietf.doc.views_search.ajax_select2_search_docs', kwargs={ + "model_name": "document", + "doc_type": "all", + }) + r = self.client.get(url, dict(q="1234")) self.assertEqual(r.status_code, 200) data = r.json() - self.assertEqual(data[0]["id"], doc_alias.pk) + self.assertEqual(len(data), 3) + pks = set([data[i]["id"] for i in range(3)]) + self.assertEqual(pks, set([bcp.pk, rfc.pk, draft.pk])) + + def test_recent_drafts(self): # Three drafts to show with various warnings @@ -434,8 +515,8 @@ def test_recent_drafts(self): self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertEqual(len(q('td.doc')),3) - self.assertTrue(q('td.status span.bg-warning[title*="%s"]' % "for 15 days")) - self.assertTrue(q('td.status span.bg-danger[title*="%s"]' % "for 29 days")) + self.assertTrue(q('td.status span.text-bg-warning[title*="%s"]' % "for 15 days")) + self.assertTrue(q('td.status span.text-bg-danger[title*="%s"]' % "for 29 days")) for ah in [draft.action_holders.first() for draft in drafts]: self.assertContains(r, escape(ah.name)) @@ -619,23 +700,22 @@ def setUp(self): def test_document_draft(self): draft = WgDraftFactory(name='draft-ietf-mars-test',rev='01', create_revisions=range(0,2)) - HolderIprDisclosureFactory(docs=[draft]) # Docs for testing relationships. Does not test 'possibly-replaces'. The 'replaced_by' direction # is tested separately below. replaced = IndividualDraftFactory() - draft.relateddocument_set.create(relationship_id='replaces',source=draft,target=replaced.docalias.first()) + draft.relateddocument_set.create(relationship_id='replaces',source=draft,target=replaced) obsoleted = IndividualDraftFactory() - draft.relateddocument_set.create(relationship_id='obs',source=draft,target=obsoleted.docalias.first()) + draft.relateddocument_set.create(relationship_id='obs',source=draft,target=obsoleted) obsoleted_by = IndividualDraftFactory() - obsoleted_by.relateddocument_set.create(relationship_id='obs',source=obsoleted_by,target=draft.docalias.first()) + obsoleted_by.relateddocument_set.create(relationship_id='obs',source=obsoleted_by,target=draft) updated = IndividualDraftFactory() - draft.relateddocument_set.create(relationship_id='updates',source=draft,target=updated.docalias.first()) + draft.relateddocument_set.create(relationship_id='updates',source=draft,target=updated) updated_by = IndividualDraftFactory() - updated_by.relateddocument_set.create(relationship_id='updates',source=obsoleted_by,target=draft.docalias.first()) + updated_by.relateddocument_set.create(relationship_id='updates',source=obsoleted_by,target=draft) - external_resource = DocExtResourceFactory(doc=draft) + DocExtResourceFactory(doc=draft) # these tests aren't testing all attributes yet, feel free to # expand them @@ -646,69 +726,32 @@ def test_document_draft(self): if settings.USER_PREFERENCE_DEFAULTS['full_draft'] == 'off': self.assertContains(r, "Show full document") self.assertNotContains(r, "Deimos street") - self.assertContains(r, replaced.canonical_name()) + self.assertContains(r, replaced.name) self.assertContains(r, replaced.title) - # obs/updates not included until draft is RFC - self.assertNotContains(r, obsoleted.canonical_name()) - self.assertNotContains(r, obsoleted.title) - self.assertNotContains(r, obsoleted_by.canonical_name()) - self.assertNotContains(r, obsoleted_by.title) - self.assertNotContains(r, updated.canonical_name()) - self.assertNotContains(r, updated.title) - self.assertNotContains(r, updated_by.canonical_name()) - self.assertNotContains(r, updated_by.title) - self.assertContains(r, external_resource.value) r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name)) + "?include_text=0") self.assertEqual(r.status_code, 200) self.assertContains(r, "Active Internet-Draft") self.assertContains(r, "Show full document") self.assertNotContains(r, "Deimos street") - self.assertContains(r, replaced.canonical_name()) + self.assertContains(r, replaced.name) self.assertContains(r, replaced.title) - # obs/updates not included until draft is RFC - self.assertNotContains(r, obsoleted.canonical_name()) - self.assertNotContains(r, obsoleted.title) - self.assertNotContains(r, obsoleted_by.canonical_name()) - self.assertNotContains(r, obsoleted_by.title) - self.assertNotContains(r, updated.canonical_name()) - self.assertNotContains(r, updated.title) - self.assertNotContains(r, updated_by.canonical_name()) - self.assertNotContains(r, updated_by.title) r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name)) + "?include_text=foo") self.assertEqual(r.status_code, 200) self.assertContains(r, "Active Internet-Draft") self.assertNotContains(r, "Show full document") self.assertContains(r, "Deimos street") - self.assertContains(r, replaced.canonical_name()) + self.assertContains(r, replaced.name) self.assertContains(r, replaced.title) - # obs/updates not included until draft is RFC - self.assertNotContains(r, obsoleted.canonical_name()) - self.assertNotContains(r, obsoleted.title) - self.assertNotContains(r, obsoleted_by.canonical_name()) - self.assertNotContains(r, obsoleted_by.title) - self.assertNotContains(r, updated.canonical_name()) - self.assertNotContains(r, updated.title) - self.assertNotContains(r, updated_by.canonical_name()) - self.assertNotContains(r, updated_by.title) r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name)) + "?include_text=1") self.assertEqual(r.status_code, 200) self.assertContains(r, "Active Internet-Draft") self.assertNotContains(r, "Show full document") self.assertContains(r, "Deimos street") - self.assertContains(r, replaced.canonical_name()) + self.assertContains(r, replaced.name) self.assertContains(r, replaced.title) - # obs/updates not included until draft is RFC - self.assertNotContains(r, obsoleted.canonical_name()) - self.assertNotContains(r, obsoleted.title) - self.assertNotContains(r, obsoleted_by.canonical_name()) - self.assertNotContains(r, obsoleted_by.title) - self.assertNotContains(r, updated.canonical_name()) - self.assertNotContains(r, updated.title) - self.assertNotContains(r, updated_by.canonical_name()) - self.assertNotContains(r, updated_by.title) self.client.cookies = SimpleCookie({str('full_draft'): str('on')}) r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name))) @@ -716,17 +759,8 @@ def test_document_draft(self): self.assertContains(r, "Active Internet-Draft") self.assertNotContains(r, "Show full document") self.assertContains(r, "Deimos street") - self.assertContains(r, replaced.canonical_name()) + self.assertContains(r, replaced.name) self.assertContains(r, replaced.title) - # obs/updates not included until draft is RFC - self.assertNotContains(r, obsoleted.canonical_name()) - self.assertNotContains(r, obsoleted.title) - self.assertNotContains(r, obsoleted_by.canonical_name()) - self.assertNotContains(r, obsoleted_by.title) - self.assertNotContains(r, updated.canonical_name()) - self.assertNotContains(r, updated.title) - self.assertNotContains(r, updated_by.canonical_name()) - self.assertNotContains(r, updated_by.title) self.client.cookies = SimpleCookie({str('full_draft'): str('off')}) r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name))) @@ -734,17 +768,8 @@ def test_document_draft(self): self.assertContains(r, "Active Internet-Draft") self.assertContains(r, "Show full document") self.assertNotContains(r, "Deimos street") - self.assertContains(r, replaced.canonical_name()) + self.assertContains(r, replaced.name) self.assertContains(r, replaced.title) - # obs/updates not included until draft is RFC - self.assertNotContains(r, obsoleted.canonical_name()) - self.assertNotContains(r, obsoleted.title) - self.assertNotContains(r, obsoleted_by.canonical_name()) - self.assertNotContains(r, obsoleted_by.title) - self.assertNotContains(r, updated.canonical_name()) - self.assertNotContains(r, updated.title) - self.assertNotContains(r, updated_by.canonical_name()) - self.assertNotContains(r, updated_by.title) self.client.cookies = SimpleCookie({str('full_draft'): str('foo')}) r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name))) @@ -753,17 +778,8 @@ def test_document_draft(self): if settings.USER_PREFERENCE_DEFAULTS['full_draft'] == 'off': self.assertContains(r, "Show full document") self.assertNotContains(r, "Deimos street") - self.assertContains(r, replaced.canonical_name()) + self.assertContains(r, replaced.name) self.assertContains(r, replaced.title) - # obs/updates not included until draft is RFC - self.assertNotContains(r, obsoleted.canonical_name()) - self.assertNotContains(r, obsoleted.title) - self.assertNotContains(r, obsoleted_by.canonical_name()) - self.assertNotContains(r, obsoleted_by.title) - self.assertNotContains(r, updated.canonical_name()) - self.assertNotContains(r, updated.title) - self.assertNotContains(r, updated_by.canonical_name()) - self.assertNotContains(r, updated_by.title) r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=draft.name))) self.assertEqual(r.status_code, 200) @@ -789,16 +805,16 @@ def test_document_draft(self): rfc = WgRfcFactory() rfc.save_with_history([DocEventFactory(doc=rfc)]) (Path(settings.RFC_PATH) / rfc.get_base_name()).touch() - r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.canonical_name()))) + r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.name))) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) - self.assertEqual(q('title').text(), f'RFC {rfc.rfc_number()} - {rfc.title}') + self.assertEqual(q('title').text(), f'RFC {rfc.rfc_number} - {rfc.title}') # synonyms for the rfc should be redirected to its canonical view - r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.rfc_number()))) - self.assertRedirects(r, urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.canonical_name()))) - r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=f'RFC {rfc.rfc_number()}'))) - self.assertRedirects(r, urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.canonical_name()))) + r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.rfc_number))) + self.assertRedirects(r, urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.name))) + r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=f'RFC {rfc.rfc_number}'))) + self.assertRedirects(r, urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.name))) # expired draft draft.set_state(State.objects.get(type="draft", slug="expired")) @@ -817,48 +833,55 @@ def test_document_draft(self): stream_id=draft.stream_id, group_id=draft.group_id, abstract=draft.abstract,stream=draft.stream, rev=draft.rev, pages=draft.pages, intended_std_level_id=draft.intended_std_level_id, shepherd_id=draft.shepherd_id, ad_id=draft.ad_id, expires=draft.expires, - notify=draft.notify, note=draft.note) + notify=draft.notify) rel = RelatedDocument.objects.create(source=replacement, - target=draft.docalias.get(name__startswith="draft"), + target=draft, relationship_id="replaces") r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name))) self.assertEqual(r.status_code, 200) self.assertContains(r, "Replaced Internet-Draft") - self.assertContains(r, replacement.canonical_name()) + self.assertContains(r, replacement.name) self.assertContains(r, replacement.title) rel.delete() # draft published as RFC draft.set_state(State.objects.get(type="draft", slug="rfc")) - draft.std_level_id = "bcp" - draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="published_rfc", by=Person.objects.get(name="(System)"))]) + draft.std_level_id = "ps" + + rfc = WgRfcFactory(group=draft.group, name="rfc123456") + rfc.save_with_history([DocEvent.objects.create(doc=rfc, rev=None, type="published_rfc", by=Person.objects.get(name="(System)"))]) + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) - rfc_alias = DocAlias.objects.create(name="rfc123456") - rfc_alias.docs.add(draft) - bcp_alias = DocAlias.objects.create(name="bcp123456") - bcp_alias.docs.add(draft) + obsoleted = IndividualRfcFactory() + rfc.relateddocument_set.create(relationship_id='obs',target=obsoleted) + obsoleted_by = IndividualRfcFactory() + obsoleted_by.relateddocument_set.create(relationship_id='obs',target=rfc) + updated = IndividualRfcFactory() + rfc.relateddocument_set.create(relationship_id='updates',target=updated) + updated_by = IndividualRfcFactory() + updated_by.relateddocument_set.create(relationship_id='updates',target=rfc) + + r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name, rev=draft.rev))) + self.assertEqual(r.status_code, 200) + self.assertContains(r, "This is an older version of an Internet-Draft that was ultimately published as") r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name))) self.assertEqual(r.status_code, 302) - r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=bcp_alias.name))) - self.assertEqual(r.status_code, 302) - r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc_alias.name))) + r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc.name))) self.assertEqual(r.status_code, 200) self.assertContains(r, "RFC 123456") self.assertContains(r, draft.name) - self.assertContains(r, replaced.canonical_name()) - self.assertContains(r, replaced.title) # obs/updates included with RFC - self.assertContains(r, obsoleted.canonical_name()) + self.assertContains(r, obsoleted.name) self.assertContains(r, obsoleted.title) - self.assertContains(r, obsoleted_by.canonical_name()) + self.assertContains(r, obsoleted_by.name) self.assertContains(r, obsoleted_by.title) - self.assertContains(r, updated.canonical_name()) + self.assertContains(r, updated.name) self.assertContains(r, updated.title) - self.assertContains(r, updated_by.canonical_name()) + self.assertContains(r, updated_by.name) self.assertContains(r, updated_by.title) # naked RFC - also weird that we test a PS from the ISE @@ -891,7 +914,7 @@ def test_draft_status_changes(self): draft = WgRfcFactory() status_change_doc = StatusChangeFactory( group=draft.group, - changes_status_of=[('tops', draft.docalias.first())], + changes_status_of=[('tops', draft)], ) status_change_url = urlreverse( 'ietf.doc.views_doc.document_main', @@ -899,7 +922,7 @@ def test_draft_status_changes(self): ) proposed_status_change_doc = StatusChangeFactory( group=draft.group, - changes_status_of=[('tobcp', draft.docalias.first())], + changes_status_of=[('tobcp', draft)], states=[State.objects.get(slug='needshep', type='statchg')], ) proposed_status_change_url = urlreverse( @@ -910,7 +933,7 @@ def test_draft_status_changes(self): r = self.client.get( urlreverse( 'ietf.doc.views_doc.document_main', - kwargs={'name': draft.canonical_name()}, + kwargs={'name': draft.name}, ) ) self.assertEqual(r.status_code, 200) @@ -1444,6 +1467,14 @@ def test_document_draft_action_holders_buttons(self, mock_method): """Buttons for action holders should be shown when AD or secretary""" draft = WgDraftFactory() draft.action_holders.set([PersonFactory()]) + other_group = GroupFactory(type_id=draft.group.type_id) + + # create a test RoleName and put it in the docman_roles for the document group + RoleName.objects.create(slug="wrangler", name="Wrangler", used=True) + draft.group.features.docman_roles.append("wrangler") + draft.group.features.save() + wrangler = RoleFactory(group=draft.group, name_id="wrangler").person + wrangler_of_other_group = RoleFactory(group=other_group, name_id="wrangler").person url = urlreverse('ietf.doc.views_doc.document_main', kwargs=dict(name=draft.name)) edit_ah_url = urlreverse('ietf.doc.views_doc.edit_action_holders', kwargs=dict(name=draft.name)) @@ -1476,6 +1507,8 @@ def _run_test(username=None, expect_buttons=False): _run_test(None, False) _run_test('plain', False) + _run_test(wrangler_of_other_group.user.username, False) + _run_test(wrangler.user.username, True) _run_test('ad', True) _run_test('secretary', True) @@ -1490,11 +1523,11 @@ def test_draft_group_link(self): self.assertEqual(r.status_code, 200) self.assert_correct_wg_group_link(r, group) - rfc = WgRfcFactory(name='draft-rfc-document-%s' % group_type_id, group=group) + rfc = WgRfcFactory(group=group) + draft = WgDraftFactory(group=group) + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) DocEventFactory.create(doc=rfc, type='published_rfc', time=event_datetime) - # get the rfc name to avoid a redirect - rfc_name = rfc.docalias.filter(name__startswith='rfc').first().name - r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc_name))) + r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc.name))) self.assertEqual(r.status_code, 200) self.assert_correct_wg_group_link(r, group) @@ -1505,14 +1538,33 @@ def test_draft_group_link(self): self.assertEqual(r.status_code, 200) self.assert_correct_non_wg_group_link(r, group) - rfc = WgRfcFactory(name='draft-rfc-document-%s' % group_type_id, group=group) + rfc = WgRfcFactory(group=group) + draft = WgDraftFactory(name='draft-rfc-document-%s'% group_type_id, group=group) + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) DocEventFactory.create(doc=rfc, type='published_rfc', time=event_datetime) - # get the rfc name to avoid a redirect - rfc_name = rfc.docalias.filter(name__startswith='rfc').first().name - r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc_name))) + r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc.name))) self.assertEqual(r.status_code, 200) self.assert_correct_non_wg_group_link(r, group) + def test_document_email_authors_button(self): + # rfc not from draft + rfc = WgRfcFactory() + DocEventFactory.create(doc=rfc, type='published_rfc') + url = urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc.name)) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertEqual(len(q('a:contains("Email authors")')), 0, 'Did not expect "Email authors" button') + + # rfc from draft + draft = WgDraftFactory(group=rfc.group) + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) + draft.set_state(State.objects.get(used=True, type="draft", slug="rfc")) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertEqual(len(q('a:contains("Email authors")')), 1, 'Expected "Email authors" button') + def test_document_primary_and_history_views(self): IndividualDraftFactory(name='draft-imaginary-independent-submission') ConflictReviewFactory(name='conflict-review-imaginary-irtf-submission') @@ -1610,13 +1662,17 @@ def test_status_change(self): statchg = StatusChangeFactory() r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=statchg.name))) self.assertEqual(r.status_code, 200) - r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=statchg.relateddocument_set.first().target.document))) - self.assertEqual(r.status_code, 302) + r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=statchg.relateddocument_set.first().target))) + self.assertEqual(r.status_code, 200) def test_document_charter(self): CharterFactory(name='charter-ietf-mars') r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name="charter-ietf-mars"))) self.assertEqual(r.status_code, 200) + + def test_incorrect_rfc_url(self): + r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name="rfc8989", rev="00"))) + self.assertEqual(r.status_code, 404) def test_document_conflict_review(self): ConflictReviewFactory(name='conflict-review-imaginary-irtf-submission') @@ -1654,6 +1710,17 @@ def test_document_material(self): r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=doc.name))) self.assertEqual(r.status_code, 200) + self.assertNotContains(r, "The session for this document was cancelled.") + + SchedulingEvent.objects.create( + session=session, + status_id='canceled', + by = Person.objects.get(user__username="marschairman"), + ) + + r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=doc.name))) + self.assertEqual(r.status_code, 200) + self.assertContains(r, "The session for this document was cancelled.") def test_document_ballot(self): doc = IndividualDraftFactory() @@ -1771,26 +1838,26 @@ def test_document_ballot_needed_positions(self): self.assertNotContains(r, 'more YES or NO') # status change - DocAlias.objects.create(name='rfc9998').docs.add(IndividualDraftFactory()) - DocAlias.objects.create(name='rfc9999').docs.add(IndividualDraftFactory()) + Document.objects.create(name='rfc9998') + Document.objects.create(name='rfc9999') doc = DocumentFactory(type_id='statchg',name='status-change-imaginary-mid-review') iesgeval_pk = str(State.objects.get(slug='iesgeval',type__slug='statchg').pk) empty_outbox() self.client.login(username='ad', password='ad+password') r = self.client.post(urlreverse('ietf.doc.views_status_change.change_state',kwargs=dict(name=doc.name)),dict(new_state=iesgeval_pk)) self.assertEqual(r.status_code, 302) - r = self.client.get(r._headers["location"][1]) + r = self.client.get(r.headers["location"]) self.assertContains(r, ">IESG Evaluation<") self.assertEqual(len(outbox), 2) self.assertIn('iesg-secretary',outbox[0]['To']) self.assertIn('drafts-eval',outbox[1]['To']) - doc.relateddocument_set.create(target=DocAlias.objects.get(name='rfc9998'),relationship_id='tohist') + doc.relateddocument_set.create(target=Document.objects.get(name='rfc9998'),relationship_id='tohist') r = self.client.get(urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name))) self.assertNotContains(r, 'Needs a YES') self.assertNotContains(r, 'more YES or NO') - doc.relateddocument_set.create(target=DocAlias.objects.get(name='rfc9999'),relationship_id='tois') + doc.relateddocument_set.create(target=Document.objects.get(name='rfc9999'),relationship_id='tois') r = self.client.get(urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name))) self.assertContains(r, 'more YES or NO') @@ -1837,6 +1904,18 @@ def test_writeup(self): self.assertContains(r, notes.text) self.assertContains(r, rfced_note.text) + def test_diff_revisions(self): + ind_doc = IndividualDraftFactory(create_revisions=range(2)) + wg_doc = WgDraftFactory( + relations=[("replaces", ind_doc)], create_revisions=range(2) + ) + diff_revisions = get_diff_revisions(HttpRequest(), wg_doc.name, wg_doc) + self.assertEqual(len(diff_revisions), 4) + self.assertEqual( + [t[3] for t in diff_revisions], + [f"{n}-{v:02d}" for n in [wg_doc.name, ind_doc.name] for v in [1, 0]], + ) + def test_history(self): doc = IndividualDraftFactory() @@ -1853,15 +1932,14 @@ def test_history(self): self.assertContains(r, e.desc) def test_history_bis_00(self): - rfcname='rfc9090' - rfc = WgRfcFactory(alias2=rfcname) - bis_draft = WgDraftFactory(name='draft-ietf-{}-{}bis'.format(rfc.group.acronym,rfcname)) + rfc = WgRfcFactory(rfc_number=9090) + bis_draft = WgDraftFactory(name='draft-ietf-{}-{}bis'.format(rfc.group.acronym,rfc.name)) url = urlreverse('ietf.doc.views_doc.document_history', kwargs=dict(name=bis_draft.name)) r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(unicontent(r)) - attr1='value="{}"'.format(rfcname) + attr1='value="{}"'.format(rfc.name) self.assertEqual(len(q('option['+attr1+'][selected="selected"]')), 1) @@ -1911,11 +1989,31 @@ def test_last_call_feed(self): self.assertContains(r, doc.name) def test_rfc_feed(self): - WgRfcFactory() + rfc = WgRfcFactory(rfc_number=9000) + DocEventFactory(doc=rfc, type="published_rfc") r = self.client.get("/feed/rfc/") self.assertTrue(r.status_code, 200) + q = PyQuery(r.content[39:]) # Strip off the xml declaration + self.assertEqual(len(q("item")), 1) + item = q("item")[0] + media_content = item.findall("{http://search.yahoo.com/mrss/}content") + self.assertEqual(len(media_content),4) + types = set([m.attrib["type"] for m in media_content]) + self.assertEqual(types, set(["application/rfc+xml", "text/plain", "text/html", "application/pdf"])) + rfcs_2016 = WgRfcFactory.create_batch(3) # rfc numbers will be well below v3 + for rfc in rfcs_2016: + e = DocEventFactory(doc=rfc, type="published_rfc") + e.time = e.time.replace(year=2016) + e.save() r = self.client.get("/feed/rfc/2016") self.assertTrue(r.status_code, 200) + q = PyQuery(r.content[39:]) + self.assertEqual(len(q("item")), 3) + item = q("item")[0] + media_content = item.findall("{http://search.yahoo.com/mrss/}content") + self.assertEqual(len(media_content), 3) + types = set([m.attrib["type"] for m in media_content]) + self.assertEqual(types, set(["text/plain", "text/html", "application/pdf"])) def test_state_help(self): url = urlreverse('ietf.doc.views_help.state_help', kwargs=dict(type="draft-iesg")) @@ -1948,70 +2046,91 @@ def _parse_bibtex_response(self, response) -> dict: @override_settings(RFC_EDITOR_INFO_BASE_URL='https://www.rfc-editor.ietf.org/info/') def test_document_bibtex(self): + + for factory in [CharterFactory, BcpFactory, StatusChangeFactory, ConflictReviewFactory]: # Should be extended to all other doc types + doc = factory() + url = urlreverse("ietf.doc.views_doc.document_bibtex", kwargs=dict(name=doc.name)) + r = self.client.get(url) + self.assertEqual(r.status_code, 404) rfc = WgRfcFactory.create( - #other_aliases = ['rfc6020',], - states = [('draft','rfc'),('draft-iesg','pub')], - std_level_id = 'ps', - time = datetime.datetime(2010, 10, 10, tzinfo=ZoneInfo(settings.TIME_ZONE)), - ) - num = rfc.rfc_number() + time=datetime.datetime(2010, 10, 10, tzinfo=ZoneInfo(settings.TIME_ZONE)) + ) + num = rfc.rfc_number DocEventFactory.create( doc=rfc, - type='published_rfc', + type="published_rfc", time=datetime.datetime(2010, 10, 10, tzinfo=RPC_TZINFO), ) # - url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=rfc.name)) + url = urlreverse("ietf.doc.views_doc.document_bibtex", kwargs=dict(name=rfc.name)) r = self.client.get(url) - entry = self._parse_bibtex_response(r)["rfc%s"%num] - self.assertEqual(entry['series'], 'Request for Comments') - self.assertEqual(entry['number'], num) - self.assertEqual(entry['doi'], '10.17487/RFC%s'%num) - self.assertEqual(entry['year'], '2010') - self.assertEqual(entry['month'].lower()[0:3], 'oct') - self.assertEqual(entry['url'], f'https://www.rfc-editor.ietf.org/info/rfc{num}') + entry = self._parse_bibtex_response(r)["rfc%s" % num] + self.assertEqual(entry["series"], "Request for Comments") + self.assertEqual(int(entry["number"]), num) + self.assertEqual(entry["doi"], "10.17487/RFC%s" % num) + self.assertEqual(entry["year"], "2010") + self.assertEqual(entry["month"].lower()[0:3], "oct") + self.assertEqual(entry["url"], f"https://www.rfc-editor.ietf.org/info/rfc{num}") # - self.assertNotIn('day', entry) - + self.assertNotIn("day", entry) + + # test for incorrect case - revision for RFC + rfc = WgRfcFactory(name="rfc0000") + url = urlreverse( + "ietf.doc.views_doc.document_bibtex", kwargs=dict(name=rfc.name, rev="00") + ) + r = self.client.get(url) + self.assertEqual(r.status_code, 404) + april1 = IndividualRfcFactory.create( - stream_id = 'ise', - states = [('draft','rfc'),('draft-iesg','pub')], - std_level_id = 'inf', - time = datetime.datetime(1990, 4, 1, tzinfo=ZoneInfo(settings.TIME_ZONE)), - ) - num = april1.rfc_number() + stream_id="ise", + std_level_id="inf", + time=datetime.datetime(1990, 4, 1, tzinfo=ZoneInfo(settings.TIME_ZONE)), + ) + num = april1.rfc_number DocEventFactory.create( doc=april1, - type='published_rfc', + type="published_rfc", time=datetime.datetime(1990, 4, 1, tzinfo=RPC_TZINFO), ) # - url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=april1.name)) + url = urlreverse( + "ietf.doc.views_doc.document_bibtex", kwargs=dict(name=april1.name) + ) r = self.client.get(url) - self.assertEqual(r.get('Content-Type'), 'text/plain; charset=utf-8') - entry = self._parse_bibtex_response(r)["rfc%s"%num] - self.assertEqual(entry['series'], 'Request for Comments') - self.assertEqual(entry['number'], num) - self.assertEqual(entry['doi'], '10.17487/RFC%s'%num) - self.assertEqual(entry['year'], '1990') - self.assertEqual(entry['month'].lower()[0:3], 'apr') - self.assertEqual(entry['day'], '1') - self.assertEqual(entry['url'], f'https://www.rfc-editor.ietf.org/info/rfc{num}') - + self.assertEqual(r.get("Content-Type"), "text/plain; charset=utf-8") + entry = self._parse_bibtex_response(r)["rfc%s" % num] + self.assertEqual(entry["series"], "Request for Comments") + self.assertEqual(int(entry["number"]), num) + self.assertEqual(entry["doi"], "10.17487/RFC%s" % num) + self.assertEqual(entry["year"], "1990") + self.assertEqual(entry["month"].lower()[0:3], "apr") + self.assertEqual(entry["day"], "1") + self.assertEqual(entry["url"], f"https://www.rfc-editor.ietf.org/info/rfc{num}") + draft = IndividualDraftFactory.create() - docname = '%s-%s' % (draft.name, draft.rev) - bibname = docname[6:] # drop the 'draft-' prefix - url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=draft.name)) + docname = "%s-%s" % (draft.name, draft.rev) + bibname = docname[6:] # drop the 'draft-' prefix + url = urlreverse("ietf.doc.views_doc.document_bibtex", kwargs=dict(name=draft.name)) r = self.client.get(url) entry = self._parse_bibtex_response(r)[bibname] - self.assertEqual(entry['note'], 'Work in Progress') - self.assertEqual(entry['number'], docname) - self.assertEqual(entry['year'], str(draft.pub_date().year)) - self.assertEqual(entry['month'].lower()[0:3], draft.pub_date().strftime('%b').lower()) - self.assertEqual(entry['day'], str(draft.pub_date().day)) - self.assertEqual(entry['url'], settings.IDTRACKER_BASE_URL + urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name, rev=draft.rev))) + self.assertEqual(entry["note"], "Work in Progress") + self.assertEqual(entry["number"], docname) + self.assertEqual(entry["year"], str(draft.pub_date().year)) + self.assertEqual( + entry["month"].lower()[0:3], draft.pub_date().strftime("%b").lower() + ) + self.assertEqual(entry["day"], str(draft.pub_date().day)) + self.assertEqual( + entry["url"], + settings.IDTRACKER_BASE_URL + + urlreverse( + "ietf.doc.views_doc.document_main", + kwargs=dict(name=draft.name, rev=draft.rev), + ), + ) # - self.assertNotIn('doi', entry) + self.assertNotIn("doi", entry) def test_document_bibxml(self): draft = IndividualDraftFactory.create() @@ -2042,20 +2161,19 @@ def test_trailing_hypen_digit_name_bibxml(self): class AddCommentTestCase(TestCase): def test_add_comment(self): - draft = WgDraftFactory(name='draft-ietf-mars-test',group__acronym='mars') - url = urlreverse('ietf.doc.views_doc.add_comment', kwargs=dict(name=draft.name)) + draft = WgDraftFactory(name="draft-ietf-mars-test", group__acronym="mars") + url = urlreverse("ietf.doc.views_doc.add_comment", kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) # normal get r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(unicontent(r)) - self.assertEqual(len(q('form textarea[name=comment]')), 1) + self.assertEqual(len(q("form textarea[name=comment]")), 1) - # request resurrect events_before = draft.docevent_set.count() mailbox_before = len(outbox) - + r = self.client.post(url, dict(comment="This is a test.")) self.assertEqual(r.status_code, 302) @@ -2063,9 +2181,9 @@ def test_add_comment(self): self.assertEqual("This is a test.", draft.latest_event().desc) self.assertEqual("added_comment", draft.latest_event().type) self.assertEqual(len(outbox), mailbox_before + 1) - self.assertIn("Comment added", outbox[-1]['Subject']) - self.assertIn(draft.name, outbox[-1]['Subject']) - self.assertIn('draft-ietf-mars-test@', outbox[-1]['To']) + self.assertIn("Comment added", outbox[-1]["Subject"]) + self.assertIn(draft.name, outbox[-1]["Subject"]) + self.assertIn("draft-ietf-mars-test@", outbox[-1]["To"]) # Make sure we can also do it as IANA self.client.login(username="iana", password="iana+password") @@ -2074,7 +2192,22 @@ def test_add_comment(self): r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(unicontent(r)) - self.assertEqual(len(q('form textarea[name=comment]')), 1) + self.assertEqual(len(q("form textarea[name=comment]")), 1) + + empty_outbox() + rfc = WgRfcFactory() + self.client.login(username="rfc", password="rfc+password") + url = urlreverse("ietf.doc.views_doc.add_comment", kwargs=dict(name=rfc.name)) + r = self.client.post( + url, dict(comment="This is an RFC Editor comment on an RFC.") + ) + self.assertEqual(r.status_code, 302) + + self.assertEqual( + "This is an RFC Editor comment on an RFC.", rfc.latest_event().desc + ) + self.assertEqual(len(outbox), 1) + self.assertIn("This is an RFC Editor comment on an RFC.", get_payload_text(outbox[0])) class TemplateTagTest(TestCase): @@ -2088,7 +2221,7 @@ class ReferencesTest(TestCase): def test_references(self): doc1 = WgDraftFactory(name='draft-ietf-mars-test') - doc2 = IndividualDraftFactory(name='draft-imaginary-independent-submission').docalias.first() + doc2 = IndividualDraftFactory(name='draft-imaginary-independent-submission') RelatedDocument.objects.get_or_create(source=doc1,target=doc2,relationship=DocRelationshipName.objects.get(slug='refnorm')) url = urlreverse('ietf.doc.views_doc.document_references', kwargs=dict(name=doc1.name)) r = self.client.get(url) @@ -2100,124 +2233,169 @@ def test_references(self): self.assertContains(r, doc1.name) class GenerateDraftAliasesTests(TestCase): - def setUp(self): - super().setUp() - self.doc_aliases_file = NamedTemporaryFile(delete=False, mode='w+') - self.doc_aliases_file.close() - self.doc_virtual_file = NamedTemporaryFile(delete=False, mode='w+') - self.doc_virtual_file.close() - self.saved_draft_aliases_path = settings.DRAFT_ALIASES_PATH - self.saved_draft_virtual_path = settings.DRAFT_VIRTUAL_PATH - settings.DRAFT_ALIASES_PATH = self.doc_aliases_file.name - settings.DRAFT_VIRTUAL_PATH = self.doc_virtual_file.name - - def tearDown(self): - settings.DRAFT_ALIASES_PATH = self.saved_draft_aliases_path - settings.DRAFT_VIRTUAL_PATH = self.saved_draft_virtual_path - os.unlink(self.doc_aliases_file.name) - os.unlink(self.doc_virtual_file.name) - super().tearDown() - - def testManagementCommand(self): - a_month_ago = (timezone.now() - datetime.timedelta(30)).astimezone(RPC_TZINFO) - a_month_ago = a_month_ago.replace(hour=0, minute=0, second=0, microsecond=0) - ad = RoleFactory(name_id='ad', group__type_id='area', group__state_id='active').person - shepherd = PersonFactory() - author1 = PersonFactory() - author2 = PersonFactory() - author3 = PersonFactory() - author4 = PersonFactory() - author5 = PersonFactory() - author6 = PersonFactory() - mars = GroupFactory(type_id='wg', acronym='mars') - marschairman = PersonFactory(user__username='marschairman') - mars.role_set.create(name_id='chair', person=marschairman, email=marschairman.email()) - doc1 = IndividualDraftFactory(authors=[author1], shepherd=shepherd.email(), ad=ad) - doc2 = WgDraftFactory(name='draft-ietf-mars-test', group__acronym='mars', authors=[author2], ad=ad) - doc3 = WgRfcFactory.create(name='draft-ietf-mars-finished', group__acronym='mars', authors=[author3], ad=ad, std_level_id='ps', states=[('draft','rfc'),('draft-iesg','pub')], time=a_month_ago) - DocEventFactory.create(doc=doc3, type='published_rfc', time=a_month_ago) - doc4 = WgRfcFactory.create(authors=[author4,author5], ad=ad, std_level_id='ps', states=[('draft','rfc'),('draft-iesg','pub')], time=datetime.datetime(2010,10,10, tzinfo=ZoneInfo(settings.TIME_ZONE))) - DocEventFactory.create(doc=doc4, type='published_rfc', time=datetime.datetime(2010, 10, 10, tzinfo=RPC_TZINFO)) - doc5 = IndividualDraftFactory(authors=[author6]) - - args = [ ] - kwargs = { } - out = io.StringIO() - call_command("generate_draft_aliases", *args, **kwargs, stdout=out, stderr=out) - self.assertFalse(out.getvalue()) - - with open(settings.DRAFT_ALIASES_PATH) as afile: - acontent = afile.read() - self.assertTrue(all([x in acontent for x in [ - 'xfilter-' + doc1.name, - 'xfilter-' + doc1.name + '.ad', - 'xfilter-' + doc1.name + '.authors', - 'xfilter-' + doc1.name + '.shepherd', - 'xfilter-' + doc1.name + '.all', - 'xfilter-' + doc2.name, - 'xfilter-' + doc2.name + '.ad', - 'xfilter-' + doc2.name + '.authors', - 'xfilter-' + doc2.name + '.chairs', - 'xfilter-' + doc2.name + '.all', - 'xfilter-' + doc3.name, - 'xfilter-' + doc3.name + '.ad', - 'xfilter-' + doc3.name + '.authors', - 'xfilter-' + doc3.name + '.chairs', - 'xfilter-' + doc5.name, - 'xfilter-' + doc5.name + '.authors', - 'xfilter-' + doc5.name + '.all', - ]])) - self.assertFalse(all([x in acontent for x in [ - 'xfilter-' + doc1.name + '.chairs', - 'xfilter-' + doc2.name + '.shepherd', - 'xfilter-' + doc3.name + '.shepherd', - 'xfilter-' + doc4.name, - 'xfilter-' + doc5.name + '.shepherd', - 'xfilter-' + doc5.name + '.ad', - ]])) - - with open(settings.DRAFT_VIRTUAL_PATH) as vfile: - vcontent = vfile.read() - self.assertTrue(all([x in vcontent for x in [ - ad.email_address(), - shepherd.email_address(), - marschairman.email_address(), - author1.email_address(), - author2.email_address(), - author3.email_address(), - author6.email_address(), - ]])) - self.assertFalse(all([x in vcontent for x in [ - author4.email_address(), - author5.email_address(), - ]])) - self.assertTrue(all([x in vcontent for x in [ - 'xfilter-' + doc1.name, - 'xfilter-' + doc1.name + '.ad', - 'xfilter-' + doc1.name + '.authors', - 'xfilter-' + doc1.name + '.shepherd', - 'xfilter-' + doc1.name + '.all', - 'xfilter-' + doc2.name, - 'xfilter-' + doc2.name + '.ad', - 'xfilter-' + doc2.name + '.authors', - 'xfilter-' + doc2.name + '.chairs', - 'xfilter-' + doc2.name + '.all', - 'xfilter-' + doc3.name, - 'xfilter-' + doc3.name + '.ad', - 'xfilter-' + doc3.name + '.authors', - 'xfilter-' + doc3.name + '.chairs', - 'xfilter-' + doc5.name, - 'xfilter-' + doc5.name + '.authors', - 'xfilter-' + doc5.name + '.all', - ]])) - self.assertFalse(all([x in vcontent for x in [ - 'xfilter-' + doc1.name + '.chairs', - 'xfilter-' + doc2.name + '.shepherd', - 'xfilter-' + doc3.name + '.shepherd', - 'xfilter-' + doc4.name, - 'xfilter-' + doc5.name + '.shepherd', - 'xfilter-' + doc5.name + '.ad', - ]])) + @override_settings(TOOLS_SERVER="tools.example.org", DRAFT_ALIAS_DOMAIN="draft.example.org") + def test_generator_class(self): + """The DraftAliasGenerator should generate the same lists as the old mgmt cmd""" + a_month_ago = (timezone.now() - datetime.timedelta(30)).astimezone(RPC_TZINFO) + a_month_ago = a_month_ago.replace(hour=0, minute=0, second=0, microsecond=0) + ad = RoleFactory( + name_id="ad", group__type_id="area", group__state_id="active" + ).person + shepherd = PersonFactory() + author1 = PersonFactory() + author2 = PersonFactory() + author3 = PersonFactory() + author4 = PersonFactory() + author5 = PersonFactory() + author6 = PersonFactory() + mars = GroupFactory(type_id="wg", acronym="mars") + marschairman = PersonFactory(user__username="marschairman") + mars.role_set.create( + name_id="chair", person=marschairman, email=marschairman.email() + ) + doc1 = IndividualDraftFactory(authors=[author1], shepherd=shepherd.email(), ad=ad) + doc2 = WgDraftFactory( + name="draft-ietf-mars-test", group__acronym="mars", authors=[author2], ad=ad + ) + doc2.notify = f"{doc2.name}.ad@draft.example.org" + doc2.save() + doc3 = WgDraftFactory.create( + name="draft-ietf-mars-finished", + group__acronym="mars", + authors=[author3], + ad=ad, + std_level_id="ps", + states=[("draft", "rfc"), ("draft-iesg", "pub")], + time=a_month_ago, + ) + rfc3 = WgRfcFactory() + DocEventFactory.create(doc=rfc3, type="published_rfc", time=a_month_ago) + doc3.relateddocument_set.create(relationship_id="became_rfc", target=rfc3) + doc4 = WgDraftFactory.create( + authors=[author4, author5], + ad=ad, + std_level_id="ps", + states=[("draft", "rfc"), ("draft-iesg", "pub")], + time=datetime.datetime(2010, 10, 10, tzinfo=ZoneInfo(settings.TIME_ZONE)), + ) + rfc4 = WgRfcFactory() + DocEventFactory.create( + doc=rfc4, + type="published_rfc", + time=datetime.datetime(2010, 10, 10, tzinfo=RPC_TZINFO), + ) + doc4.relateddocument_set.create(relationship_id="became_rfc", target=rfc4) + doc5 = IndividualDraftFactory(authors=[author6]) + + output = [(alias, alist) for alias, alist in DraftAliasGenerator()] + alias_dict = dict(output) + self.assertEqual(len(alias_dict), len(output)) # no duplicate aliases + expected_dict = { + doc1.name: [author1.email_address()], + doc1.name + ".ad": [ad.email_address()], + doc1.name + ".authors": [author1.email_address()], + doc1.name + ".shepherd": [shepherd.email_address()], + doc1.name + + ".all": [ + author1.email_address(), + ad.email_address(), + shepherd.email_address(), + ], + doc2.name: [author2.email_address()], + doc2.name + ".ad": [ad.email_address()], + doc2.name + ".authors": [author2.email_address()], + doc2.name + ".chairs": [marschairman.email_address()], + doc2.name + ".notify": [ad.email_address()], + doc2.name + + ".all": [ + author2.email_address(), + ad.email_address(), + marschairman.email_address(), + ], + doc3.name: [author3.email_address()], + doc3.name + ".ad": [ad.email_address()], + doc3.name + ".authors": [author3.email_address()], + doc3.name + ".chairs": [marschairman.email_address()], + doc3.name + + ".all": [ + author3.email_address(), + ad.email_address(), + marschairman.email_address(), + ], + doc5.name: [author6.email_address()], + doc5.name + ".authors": [author6.email_address()], + doc5.name + ".all": [author6.email_address()], + } + # Sort lists for comparison + self.assertEqual( + {k: sorted(v) for k, v in alias_dict.items()}, + {k: sorted(v) for k, v in expected_dict.items()}, + ) + + # check single name + output = [(alias, alist) for alias, alist in DraftAliasGenerator(Document.objects.filter(name=doc1.name))] + alias_dict = dict(output) + self.assertEqual(len(alias_dict), len(output)) # no duplicate aliases + expected_dict = { + doc1.name: [author1.email_address()], + doc1.name + ".ad": [ad.email_address()], + doc1.name + ".authors": [author1.email_address()], + doc1.name + ".shepherd": [shepherd.email_address()], + doc1.name + + ".all": [ + author1.email_address(), + ad.email_address(), + shepherd.email_address(), + ], + } + # Sort lists for comparison + self.assertEqual( + {k: sorted(v) for k, v in alias_dict.items()}, + {k: sorted(v) for k, v in expected_dict.items()}, + ) + + @override_settings(TOOLS_SERVER="tools.example.org", DRAFT_ALIAS_DOMAIN="draft.example.org") + def test_get_draft_notify_emails(self): + ad = PersonFactory() + shepherd = PersonFactory() + author = PersonFactory() + doc = DocumentFactory(authors=[author], shepherd=shepherd.email(), ad=ad) + generator = DraftAliasGenerator() + + doc.notify = f"{doc.name}@draft.example.org" + doc.save() + self.assertCountEqual(generator.get_draft_notify_emails(doc), [author.email_address()]) + + doc.notify = f"{doc.name}.ad@draft.example.org" + doc.save() + self.assertCountEqual(generator.get_draft_notify_emails(doc), [ad.email_address()]) + + doc.notify = f"{doc.name}.shepherd@draft.example.org" + doc.save() + self.assertCountEqual(generator.get_draft_notify_emails(doc), [shepherd.email_address()]) + + doc.notify = f"{doc.name}.all@draft.example.org" + doc.save() + self.assertCountEqual( + generator.get_draft_notify_emails(doc), + [ad.email_address(), author.email_address(), shepherd.email_address()] + ) + + doc.notify = f"{doc.name}.notify@draft.example.org" + doc.save() + self.assertCountEqual(generator.get_draft_notify_emails(doc), []) + + doc.notify = f"{doc.name}.ad@somewhere.example.com" + doc.save() + self.assertCountEqual(generator.get_draft_notify_emails(doc), [f"{doc.name}.ad@somewhere.example.com"]) + + doc.notify = f"somebody@example.com, nobody@example.com, {doc.name}.ad@tools.example.org" + doc.save() + self.assertCountEqual( + generator.get_draft_notify_emails(doc), + ["somebody@example.com", "nobody@example.com", ad.email_address()] + ) + class EmailAliasesTests(TestCase): @@ -2226,37 +2404,20 @@ def setUp(self): WgDraftFactory(name='draft-ietf-mars-test',group__acronym='mars') WgDraftFactory(name='draft-ietf-ames-test',group__acronym='ames') RoleFactory(group__type_id='review', group__acronym='yangdoctors', name_id='secr') - self.doc_alias_file = NamedTemporaryFile(delete=False, mode='w+') - self.doc_alias_file.write("""# Generated by hand at 2015-02-12_16:26:45 -virtual.ietf.org anything -draft-ietf-mars-test@ietf.org xfilter-draft-ietf-mars-test -expand-draft-ietf-mars-test@virtual.ietf.org mars-author@example.com, mars-collaborator@example.com -draft-ietf-mars-test.authors@ietf.org xfilter-draft-ietf-mars-test.authors -expand-draft-ietf-mars-test.authors@virtual.ietf.org mars-author@example.mars, mars-collaborator@example.mars -draft-ietf-mars-test.chairs@ietf.org xfilter-draft-ietf-mars-test.chairs -expand-draft-ietf-mars-test.chairs@virtual.ietf.org mars-chair@example.mars -draft-ietf-mars-test.all@ietf.org xfilter-draft-ietf-mars-test.all -expand-draft-ietf-mars-test.all@virtual.ietf.org mars-author@example.mars, mars-collaborator@example.mars, mars-chair@example.mars -draft-ietf-ames-test@ietf.org xfilter-draft-ietf-ames-test -expand-draft-ietf-ames-test@virtual.ietf.org ames-author@example.com, ames-collaborator@example.com -draft-ietf-ames-test.authors@ietf.org xfilter-draft-ietf-ames-test.authors -expand-draft-ietf-ames-test.authors@virtual.ietf.org ames-author@example.ames, ames-collaborator@example.ames -draft-ietf-ames-test.chairs@ietf.org xfilter-draft-ietf-ames-test.chairs -expand-draft-ietf-ames-test.chairs@virtual.ietf.org ames-chair@example.ames -draft-ietf-ames-test.all@ietf.org xfilter-draft-ietf-ames-test.all -expand-draft-ietf-ames-test.all@virtual.ietf.org ames-author@example.ames, ames-collaborator@example.ames, ames-chair@example.ames - -""") - self.doc_alias_file.close() - self.saved_draft_virtual_path = settings.DRAFT_VIRTUAL_PATH - settings.DRAFT_VIRTUAL_PATH = self.doc_alias_file.name - - def tearDown(self): - settings.DRAFT_VIRTUAL_PATH = self.saved_draft_virtual_path - os.unlink(self.doc_alias_file.name) - super().tearDown() - - def testAliases(self): + + + @mock.patch("ietf.doc.views_doc.get_doc_email_aliases") + def testAliases(self, mock_get_aliases): + mock_get_aliases.return_value = [ + {"doc_name": "draft-ietf-mars-test", "alias_type": "", "expansion": "mars-author@example.mars, mars-collaborator@example.mars"}, + {"doc_name": "draft-ietf-mars-test", "alias_type": ".authors", "expansion": "mars-author@example.mars, mars-collaborator@example.mars"}, + {"doc_name": "draft-ietf-mars-test", "alias_type": ".chairs", "expansion": "mars-chair@example.mars"}, + {"doc_name": "draft-ietf-mars-test", "alias_type": ".all", "expansion": "mars-author@example.mars, mars-collaborator@example.mars, mars-chair@example.mars"}, + {"doc_name": "draft-ietf-ames-test", "alias_type": "", "expansion": "ames-author@example.ames, ames-collaborator@example.ames"}, + {"doc_name": "draft-ietf-ames-test", "alias_type": ".authors", "expansion": "ames-author@example.ames, ames-collaborator@example.ames"}, + {"doc_name": "draft-ietf-ames-test", "alias_type": ".chairs", "expansion": "ames-chair@example.ames"}, + {"doc_name": "draft-ietf-ames-test", "alias_type": ".all", "expansion": "ames-author@example.ames, ames-collaborator@example.ames, ames-chair@example.ames"}, + ] PersonFactory(user__username='plain') url = urlreverse('ietf.doc.urls.redirect.document_email', kwargs=dict(name="draft-ietf-mars-test")) r = self.client.get(url) @@ -2266,16 +2427,70 @@ def testAliases(self): login_testing_unauthorized(self, "plain", url) r = self.client.get(url) self.assertEqual(r.status_code, 200) + self.assertEqual(mock_get_aliases.call_args, mock.call()) self.assertTrue(all([x in unicontent(r) for x in ['mars-test@','mars-test.authors@','mars-test.chairs@']])) self.assertTrue(all([x in unicontent(r) for x in ['ames-test@','ames-test.authors@','ames-test.chairs@']])) - def testExpansions(self): + + @mock.patch("ietf.doc.views_doc.get_doc_email_aliases") + def testExpansions(self, mock_get_aliases): + mock_get_aliases.return_value = [ + {"doc_name": "draft-ietf-mars-test", "alias_type": "", "expansion": "mars-author@example.mars, mars-collaborator@example.mars"}, + {"doc_name": "draft-ietf-mars-test", "alias_type": ".authors", "expansion": "mars-author@example.mars, mars-collaborator@example.mars"}, + {"doc_name": "draft-ietf-mars-test", "alias_type": ".chairs", "expansion": "mars-chair@example.mars"}, + {"doc_name": "draft-ietf-mars-test", "alias_type": ".all", "expansion": "mars-author@example.mars, mars-collaborator@example.mars, mars-chair@example.mars"}, + ] url = urlreverse('ietf.doc.views_doc.document_email', kwargs=dict(name="draft-ietf-mars-test")) r = self.client.get(url) + self.assertEqual(mock_get_aliases.call_args, mock.call("draft-ietf-mars-test")) self.assertEqual(r.status_code, 200) self.assertContains(r, 'draft-ietf-mars-test.all@ietf.org') self.assertContains(r, 'iesg_ballot_saved') + + @mock.patch("ietf.doc.utils.DraftAliasGenerator") + def test_get_doc_email_aliases(self, mock_alias_gen_cls): + mock_alias_gen_cls.return_value = [ + ("draft-something-or-other.some-type", ["somebody@example.com"]), + ("draft-something-or-other", ["somebody@example.com"]), + ("draft-nothing-at-all", ["nobody@example.com"]), + ("draft-nothing-at-all.some-type", ["nobody@example.com"]), + ] + # order is important in the response - should be sorted by doc name and otherwise left + # in order + self.assertEqual( + get_doc_email_aliases(), + [ + { + "doc_name": "draft-nothing-at-all", + "alias_type": "", + "expansion": "nobody@example.com", + }, + { + "doc_name": "draft-nothing-at-all", + "alias_type": ".some-type", + "expansion": "nobody@example.com", + }, + { + "doc_name": "draft-something-or-other", + "alias_type": ".some-type", + "expansion": "somebody@example.com", + }, + { + "doc_name": "draft-something-or-other", + "alias_type": "", + "expansion": "somebody@example.com", + }, + ], + ) + self.assertEqual(mock_alias_gen_cls.call_args, mock.call(None)) + # Repeat with a name, no need to re-test that the alias list is actually passed through, just + # check that the DraftAliasGenerator is called correctly + draft = WgDraftFactory() + get_doc_email_aliases(draft.name) + self.assertQuerySetEqual(mock_alias_gen_cls.call_args[0][0], Document.objects.filter(pk=draft.pk)) + + class DocumentMeetingTests(TestCase): def setUp(self): @@ -2298,8 +2513,8 @@ def setUp(self): def test_view_document_meetings(self): doc = IndividualDraftFactory.create() - doc.sessionpresentation_set.create(session=self.inprog,rev=None) - doc.sessionpresentation_set.create(session=self.interim,rev=None) + doc.presentations.create(session=self.inprog,rev=None) + doc.presentations.create(session=self.interim,rev=None) url = urlreverse('ietf.doc.views_doc.all_presentations', kwargs=dict(name=doc.name)) response = self.client.get(url) @@ -2310,8 +2525,8 @@ def test_view_document_meetings(self): self.assertFalse(q('#addsessionsbutton')) self.assertFalse(q("a.btn:contains('Remove document')")) - doc.sessionpresentation_set.create(session=self.past_cutoff,rev=None) - doc.sessionpresentation_set.create(session=self.past,rev=None) + doc.presentations.create(session=self.past_cutoff,rev=None) + doc.presentations.create(session=self.past,rev=None) self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) @@ -2344,41 +2559,72 @@ def test_view_document_meetings(self): self.assertFalse(q("#futuremeets a.btn:contains('Remove document')")) self.assertFalse(q("#pastmeets a.btn:contains('Remove document')")) - def test_edit_document_session(self): + @override_settings(MEETECHO_API_CONFIG="fake settings") + @mock.patch("ietf.doc.views_doc.SlidesManager") + def test_edit_document_session(self, mock_slides_manager_cls): doc = IndividualDraftFactory.create() - sp = doc.sessionpresentation_set.create(session=self.future,rev=None) + sp = doc.presentations.create(session=self.future,rev=None) url = urlreverse('ietf.doc.views_doc.edit_sessionpresentation',kwargs=dict(name='no-such-doc',session_id=sp.session_id)) response = self.client.get(url) self.assertEqual(response.status_code, 404) + self.assertFalse(mock_slides_manager_cls.called) url = urlreverse('ietf.doc.views_doc.edit_sessionpresentation',kwargs=dict(name=doc.name,session_id=0)) response = self.client.get(url) self.assertEqual(response.status_code, 404) + self.assertFalse(mock_slides_manager_cls.called) url = urlreverse('ietf.doc.views_doc.edit_sessionpresentation',kwargs=dict(name=doc.name,session_id=sp.session_id)) response = self.client.get(url) self.assertEqual(response.status_code, 404) + self.assertFalse(mock_slides_manager_cls.called) self.client.login(username=self.other_chair.user.username,password='%s+password'%self.other_chair.user.username) response = self.client.get(url) self.assertEqual(response.status_code, 404) - + self.assertFalse(mock_slides_manager_cls.called) + self.client.login(username=self.group_chair.user.username,password='%s+password'%self.group_chair.user.username) response = self.client.get(url) self.assertEqual(response.status_code, 200) q = PyQuery(response.content) self.assertEqual(2,len(q('select#id_version option'))) + self.assertFalse(mock_slides_manager_cls.called) + # edit draft self.assertEqual(1,doc.docevent_set.count()) response = self.client.post(url,{'version':'00','save':''}) self.assertEqual(response.status_code, 302) - self.assertEqual(doc.sessionpresentation_set.get(pk=sp.pk).rev,'00') + self.assertEqual(doc.presentations.get(pk=sp.pk).rev,'00') self.assertEqual(2,doc.docevent_set.count()) + self.assertFalse(mock_slides_manager_cls.called) + + # editing slides should call Meetecho API + slides = SessionPresentationFactory( + session=self.future, + document__type_id="slides", + document__rev="00", + rev=None, + order=1, + ).document + url = urlreverse( + "ietf.doc.views_doc.edit_sessionpresentation", + kwargs={"name": slides.name, "session_id": self.future.pk}, + ) + response = self.client.post(url, {"version": "00", "save": ""}) + self.assertEqual(response.status_code, 302) + self.assertEqual(mock_slides_manager_cls.call_count, 1) + self.assertEqual(mock_slides_manager_cls.call_args, mock.call(api_config="fake settings")) + self.assertEqual(mock_slides_manager_cls.return_value.send_update.call_count, 1) + self.assertEqual( + mock_slides_manager_cls.return_value.send_update.call_args, + mock.call(self.future), + ) def test_edit_document_session_after_proceedings_closed(self): doc = IndividualDraftFactory.create() - sp = doc.sessionpresentation_set.create(session=self.past_cutoff,rev=None) + sp = doc.presentations.create(session=self.past_cutoff,rev=None) url = urlreverse('ietf.doc.views_doc.edit_sessionpresentation',kwargs=dict(name=doc.name,session_id=sp.session_id)) self.client.login(username=self.group_chair.user.username,password='%s+password'%self.group_chair.user.username) @@ -2391,39 +2637,64 @@ def test_edit_document_session_after_proceedings_closed(self): q=PyQuery(response.content) self.assertEqual(1,len(q(".alert-warning:contains('may affect published proceedings')"))) - def test_remove_document_session(self): + @override_settings(MEETECHO_API_CONFIG="fake settings") + @mock.patch("ietf.doc.views_doc.SlidesManager") + def test_remove_document_session(self, mock_slides_manager_cls): doc = IndividualDraftFactory.create() - sp = doc.sessionpresentation_set.create(session=self.future,rev=None) + sp = doc.presentations.create(session=self.future,rev=None) url = urlreverse('ietf.doc.views_doc.remove_sessionpresentation',kwargs=dict(name='no-such-doc',session_id=sp.session_id)) response = self.client.get(url) self.assertEqual(response.status_code, 404) + self.assertFalse(mock_slides_manager_cls.called) url = urlreverse('ietf.doc.views_doc.remove_sessionpresentation',kwargs=dict(name=doc.name,session_id=0)) response = self.client.get(url) self.assertEqual(response.status_code, 404) + self.assertFalse(mock_slides_manager_cls.called) url = urlreverse('ietf.doc.views_doc.remove_sessionpresentation',kwargs=dict(name=doc.name,session_id=sp.session_id)) response = self.client.get(url) self.assertEqual(response.status_code, 404) + self.assertFalse(mock_slides_manager_cls.called) self.client.login(username=self.other_chair.user.username,password='%s+password'%self.other_chair.user.username) response = self.client.get(url) self.assertEqual(response.status_code, 404) - + self.assertFalse(mock_slides_manager_cls.called) + self.client.login(username=self.group_chair.user.username,password='%s+password'%self.group_chair.user.username) response = self.client.get(url) self.assertEqual(response.status_code, 200) + self.assertFalse(mock_slides_manager_cls.called) + # removing a draft self.assertEqual(1,doc.docevent_set.count()) response = self.client.post(url,{'remove_session':''}) self.assertEqual(response.status_code, 302) - self.assertFalse(doc.sessionpresentation_set.filter(pk=sp.pk).exists()) + self.assertFalse(doc.presentations.filter(pk=sp.pk).exists()) self.assertEqual(2,doc.docevent_set.count()) + self.assertFalse(mock_slides_manager_cls.called) + + # removing slides should call Meetecho API + slides = SessionPresentationFactory(session=self.future, document__type_id="slides", order=1).document + url = urlreverse( + "ietf.doc.views_doc.remove_sessionpresentation", + kwargs={"name": slides.name, "session_id": self.future.pk}, + ) + response = self.client.post(url, {"remove_session": ""}) + self.assertEqual(response.status_code, 302) + self.assertEqual(mock_slides_manager_cls.call_count, 1) + self.assertEqual(mock_slides_manager_cls.call_args, mock.call(api_config="fake settings")) + self.assertEqual(mock_slides_manager_cls.return_value.delete.call_count, 1) + self.assertEqual( + mock_slides_manager_cls.return_value.delete.call_args, + mock.call(self.future, slides), + ) def test_remove_document_session_after_proceedings_closed(self): doc = IndividualDraftFactory.create() - sp = doc.sessionpresentation_set.create(session=self.past_cutoff,rev=None) + sp = doc.presentations.create(session=self.past_cutoff,rev=None) url = urlreverse('ietf.doc.views_doc.remove_sessionpresentation',kwargs=dict(name=doc.name,session_id=sp.session_id)) self.client.login(username=self.group_chair.user.username,password='%s+password'%self.group_chair.user.username) @@ -2436,28 +2707,49 @@ def test_remove_document_session_after_proceedings_closed(self): q=PyQuery(response.content) self.assertEqual(1,len(q(".alert-warning:contains('may affect published proceedings')"))) - def test_add_document_session(self): + @override_settings(MEETECHO_API_CONFIG="fake settings") + @mock.patch("ietf.doc.views_doc.SlidesManager") + def test_add_document_session(self, mock_slides_manager_cls): doc = IndividualDraftFactory.create() url = urlreverse('ietf.doc.views_doc.add_sessionpresentation',kwargs=dict(name=doc.name)) login_testing_unauthorized(self,self.group_chair.user.username,url) response = self.client.get(url) self.assertEqual(response.status_code,200) - + self.assertFalse(mock_slides_manager_cls.called) + response = self.client.post(url,{'session':0,'version':'current'}) self.assertEqual(response.status_code,200) q=PyQuery(response.content) self.assertTrue(q('.form-select.is-invalid')) + self.assertFalse(mock_slides_manager_cls.called) response = self.client.post(url,{'session':self.future.pk,'version':'bogus version'}) self.assertEqual(response.status_code,200) q=PyQuery(response.content) self.assertTrue(q('.form-select.is-invalid')) + self.assertFalse(mock_slides_manager_cls.called) + # adding a draft self.assertEqual(1,doc.docevent_set.count()) response = self.client.post(url,{'session':self.future.pk,'version':'current'}) self.assertEqual(response.status_code,302) self.assertEqual(2,doc.docevent_set.count()) + self.assertEqual(doc.presentations.get(session__pk=self.future.pk).order, 0) + self.assertFalse(mock_slides_manager_cls.called) + + # adding slides should set order / call Meetecho API + slides = DocumentFactory(type_id="slides") + url = urlreverse("ietf.doc.views_doc.add_sessionpresentation", kwargs=dict(name=slides.name)) + response = self.client.post(url, {"session": self.future.pk, "version": "current"}) + self.assertEqual(response.status_code,302) + self.assertEqual(slides.presentations.get(session__pk=self.future.pk).order, 1) + self.assertEqual(mock_slides_manager_cls.call_args, mock.call(api_config="fake settings")) + self.assertEqual(mock_slides_manager_cls.return_value.add.call_count, 1) + self.assertEqual( + mock_slides_manager_cls.return_value.add.call_args, + mock.call(self.future, slides, order=1), + ) def test_get_related_meeting(self): """Should be able to retrieve related meeting""" @@ -2490,60 +2782,6 @@ def test_get_related_meeting(self): self.assertIsNone(doc.get_related_meeting(), f'{doc.type.slug} should not be related to meeting') class ChartTests(ResourceTestCaseMixin, TestCase): - def test_search_chart_conf(self): - doc = IndividualDraftFactory() - - conf_url = urlreverse('ietf.doc.views_stats.chart_conf_newrevisiondocevent') - - # No qurey arguments; expect an empty json object - r = self.client.get(conf_url) - self.assertValidJSONResponse(r) - self.assertEqual(unicontent(r), '{}') - - # No match - r = self.client.get(conf_url + '?activedrafts=on&name=thisisnotadocumentname') - self.assertValidJSONResponse(r) - d = r.json() - self.assertEqual(d['chart']['type'], settings.CHART_TYPE_COLUMN_OPTIONS['chart']['type']) - - r = self.client.get(conf_url + '?activedrafts=on&name=%s'%doc.name[6:12]) - self.assertValidJSONResponse(r) - d = r.json() - self.assertEqual(d['chart']['type'], settings.CHART_TYPE_COLUMN_OPTIONS['chart']['type']) - self.assertEqual(len(d['series'][0]['data']), 0) - - def test_search_chart_data(self): - doc = IndividualDraftFactory() - - data_url = urlreverse('ietf.doc.views_stats.chart_data_newrevisiondocevent') - - # No qurey arguments; expect an empty json list - r = self.client.get(data_url) - self.assertValidJSONResponse(r) - self.assertEqual(unicontent(r), '[]') - - # No match - r = self.client.get(data_url + '?activedrafts=on&name=thisisnotadocumentname') - self.assertValidJSONResponse(r) - d = r.json() - self.assertEqual(unicontent(r), '[]') - - r = self.client.get(data_url + '?activedrafts=on&name=%s'%doc.name[6:12]) - self.assertValidJSONResponse(r) - d = r.json() - self.assertEqual(len(d), 1) - self.assertEqual(len(d[0]), 2) - - def test_search_chart(self): - doc = IndividualDraftFactory() - - chart_url = urlreverse('ietf.doc.views_stats.chart_newrevisiondocevent') - r = self.client.get(chart_url) - self.assertEqual(r.status_code, 200) - - r = self.client.get(chart_url + '?activedrafts=on&name=%s'%doc.name[6:12]) - self.assertEqual(r.status_code, 200) - def test_personal_chart(self): person = PersonFactory.create() IndividualDraftFactory.create( @@ -2565,6 +2803,7 @@ def test_personal_chart(self): d = r.json() self.assertEqual(len(d), 1) self.assertEqual(len(d[0]), 2) + self.assertEqual(d[0][1], 1) page_url = urlreverse('ietf.person.views.profile', kwargs=dict(email_or_name=person.name)) r = self.client.get(page_url) @@ -2649,49 +2888,59 @@ def test_markdown_and_text(self): class Idnits2SupportTests(TestCase): settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['DERIVED_DIR'] - def test_obsoleted(self): - rfc = WgRfcFactory(alias2__name='rfc1001') - WgRfcFactory(alias2__name='rfc1003',relations=[('obs',rfc)]) - rfc = WgRfcFactory(alias2__name='rfc1005') - WgRfcFactory(alias2__name='rfc1007',relations=[('obs',rfc)]) + def test_generate_idnits2_rfcs_obsoleted(self): + rfc = WgRfcFactory(rfc_number=1001) + WgRfcFactory(rfc_number=1003,relations=[('obs',rfc)]) + rfc = WgRfcFactory(rfc_number=1005) + WgRfcFactory(rfc_number=1007,relations=[('obs',rfc)]) + blob = generate_idnits2_rfcs_obsoleted() + self.assertEqual(blob, b'1001 1003\n1005 1007\n'.decode("utf8")) + def test_obsoleted(self): url = urlreverse('ietf.doc.views_doc.idnits2_rfcs_obsoleted') r = self.client.get(url) self.assertEqual(r.status_code, 404) - call_command('generate_idnits2_rfcs_obsoleted') + # value written is arbitrary, expect it to be passed through + (Path(settings.DERIVED_DIR) / "idnits2-rfcs-obsoleted").write_bytes(b'1001 1003\n1005 1007\n') url = urlreverse('ietf.doc.views_doc.idnits2_rfcs_obsoleted') r = self.client.get(url) self.assertEqual(r.status_code, 200) self.assertEqual(r.content, b'1001 1003\n1005 1007\n') - def test_rfc_status(self): + def test_generate_idnits2_rfc_status(self): for slug in ('bcp', 'ds', 'exp', 'hist', 'inf', 'std', 'ps', 'unkn'): WgRfcFactory(std_level_id=slug) + blob = generate_idnits2_rfc_status().replace("\n", "") + self.assertEqual(blob[6312-1], "O") + + def test_rfc_status(self): url = urlreverse('ietf.doc.views_doc.idnits2_rfc_status') r = self.client.get(url) self.assertEqual(r.status_code,404) - call_command('generate_idnits2_rfc_status') + # value written is arbitrary, expect it to be passed through + (Path(settings.DERIVED_DIR) / "idnits2-rfc-status").write_bytes(b'1001 1003\n1005 1007\n') r = self.client.get(url) self.assertEqual(r.status_code,200) - blob = unicontent(r).replace('\n','') - self.assertEqual(blob[6312-1],'O') + self.assertEqual(r.content, b'1001 1003\n1005 1007\n') def test_idnits2_state(self): rfc = WgRfcFactory() - url = urlreverse('ietf.doc.views_doc.idnits2_state', kwargs=dict(name=rfc.canonical_name())) + draft = WgDraftFactory() + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) + url = urlreverse('ietf.doc.views_doc.idnits2_state', kwargs=dict(name=rfc.name)) r = self.client.get(url) self.assertEqual(r.status_code, 200) self.assertContains(r,'rfcnum') draft = WgDraftFactory() - url = urlreverse('ietf.doc.views_doc.idnits2_state', kwargs=dict(name=draft.canonical_name())) + url = urlreverse('ietf.doc.views_doc.idnits2_state', kwargs=dict(name=draft.name)) r = self.client.get(url) self.assertEqual(r.status_code, 200) self.assertNotContains(r,'rfcnum') self.assertContains(r,'Unknown') draft = WgDraftFactory(intended_std_level_id='ps') - url = urlreverse('ietf.doc.views_doc.idnits2_state', kwargs=dict(name=draft.canonical_name())) + url = urlreverse('ietf.doc.views_doc.idnits2_state', kwargs=dict(name=draft.name)) r = self.client.get(url) self.assertEqual(r.status_code, 200) self.assertContains(r,'Proposed') @@ -2736,16 +2985,12 @@ def test_raw_id(self): self.should_succeed(dict(name=draft.name, rev='00',ext='txt')) self.should_404(dict(name=draft.name, rev='00',ext='html')) - def test_raw_id_rfc(self): - rfc = WgRfcFactory() - dir = settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR - (Path(dir) / f'{rfc.name}-{rfc.rev}.txt').touch() - self.should_succeed(dict(name=rfc.name)) - self.should_404(dict(name=rfc.canonical_name())) + # test_raw_id_rfc intentionally removed + # an rfc is no longer a pseudo-version of a draft. def test_non_draft(self): - charter = CharterFactory() - self.should_404(dict(name=charter.name)) + for doc in [CharterFactory(), WgRfcFactory()]: + self.should_404(dict(name=doc.name)) class PdfizedTests(TestCase): @@ -2757,31 +3002,47 @@ def should_succeed(self, argdict): url = urlreverse(self.view, kwargs=argdict) r = self.client.get(url) self.assertEqual(r.status_code,200) - self.assertEqual(r.get('Content-Type'),'application/pdf;charset=utf-8') + self.assertEqual(r.get('Content-Type'),'application/pdf') def should_404(self, argdict): url = urlreverse(self.view, kwargs=argdict) r = self.client.get(url) self.assertEqual(r.status_code, 404) + # This takes a _long_ time (32s on a 2022 m1 macbook pro) - is it worth what it covers? def test_pdfized(self): - rfc = WgRfcFactory(create_revisions=range(0,2)) + rfc = WgRfcFactory() + draft = WgDraftFactory(create_revisions=range(0,2)) + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) dir = settings.RFC_PATH - with (Path(dir) / f'{rfc.canonical_name()}.txt').open('w') as f: + with (Path(dir) / f'{rfc.name}.txt').open('w') as f: f.write('text content') dir = settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR for r in range(0,2): - with (Path(dir) / f'{rfc.name}-{r:02d}.txt').open('w') as f: + with (Path(dir) / f'{draft.name}-{r:02d}.txt').open('w') as f: f.write('text content') - self.should_succeed(dict(name=rfc.canonical_name())) + self.assertTrue( + login_testing_unauthorized( + self, + PersonFactory().user.username, + urlreverse(self.view, kwargs={"name": draft.name}), + ) + ) self.should_succeed(dict(name=rfc.name)) + self.should_succeed(dict(name=draft.name)) for r in range(0,2): - self.should_succeed(dict(name=rfc.name,rev=f'{r:02d}')) + self.should_succeed(dict(name=draft.name,rev=f'{r:02d}')) for ext in ('pdf','txt','html','anythingatall'): - self.should_succeed(dict(name=rfc.name,rev=f'{r:02d}',ext=ext)) - self.should_404(dict(name=rfc.name,rev='02')) + self.should_succeed(dict(name=draft.name,rev=f'{r:02d}',ext=ext)) + self.should_404(dict(name=draft.name,rev='02')) + + with mock.patch('ietf.doc.models.DocumentInfo.pdfized', side_effect=URLFetchingError): + url = urlreverse(self.view, kwargs=dict(name=rfc.name)) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + self.assertContains(r, "Error while rendering PDF") class NotifyValidationTests(TestCase): def test_notify_validation(self): @@ -2864,3 +3125,383 @@ def test_gets_request_conflict_review_action_button(self): r = self.client.get(url) self.assertContains(r, target_string) +class DocInfoMethodsTests(TestCase): + + def test_became_rfc(self): + draft = WgDraftFactory() + rfc = WgRfcFactory() + draft.relateddocument_set.create(relationship_id="became_rfc",target=rfc) + self.assertEqual(draft.became_rfc(), rfc) + self.assertEqual(rfc.came_from_draft(), draft) + + charter = CharterFactory() + self.assertIsNone(charter.became_rfc()) + self.assertIsNone(charter.came_from_draft()) + + def test_revisions(self): + draft = WgDraftFactory(rev="09",create_revisions=range(0,10)) + self.assertEqual(draft.revisions_by_dochistory(),[f"{i:02d}" for i in range(0,10)]) + self.assertEqual(draft.revisions_by_newrevisionevent(),[f"{i:02d}" for i in range(0,10)]) + rfc = WgRfcFactory() + self.assertEqual(rfc.revisions_by_newrevisionevent(),[]) + self.assertEqual(rfc.revisions_by_dochistory(),[]) + + draft.history_set.filter(rev__lt="08").delete() + draft.docevent_set.filter(newrevisiondocevent__rev="05").delete() + self.assertEqual(draft.revisions_by_dochistory(),[f"{i:02d}" for i in range(8,10)]) + self.assertEqual(draft.revisions_by_newrevisionevent(),[f"{i:02d}" for i in [*range(0,5), *range(6,10)]]) + + def test_referenced_by_rfcs(self): + # n.b., no significance to the ref* values in this test + referring_draft = WgDraftFactory() + (rfc, referring_rfc) = WgRfcFactory.create_batch(2) + rfc.targets_related.create(relationship_id="refnorm", source=referring_draft) + rfc.targets_related.create(relationship_id="refnorm", source=referring_rfc) + self.assertCountEqual( + rfc.referenced_by_rfcs(), + rfc.targets_related.filter(source=referring_rfc), + ) + + def test_referenced_by_rfcs_as_rfc_or_draft(self): + # n.b., no significance to the ref* values in this test + draft = WgDraftFactory() + rfc = WgRfcFactory() + draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc) + + # Draft referring to the rfc and the draft - should not be reported at all + draft_referring_to_both = WgDraftFactory() + draft_referring_to_both.relateddocument_set.create(relationship_id="refnorm", target=draft) + draft_referring_to_both.relateddocument_set.create(relationship_id="refnorm", target=rfc) + + # RFC referring only to the draft - should be reported for either the draft or the rfc + rfc_referring_to_draft = WgRfcFactory() + rfc_referring_to_draft.relateddocument_set.create(relationship_id="refinfo", target=draft) + + # RFC referring only to the rfc - should be reported only for the rfc + rfc_referring_to_rfc = WgRfcFactory() + rfc_referring_to_rfc.relateddocument_set.create(relationship_id="refinfo", target=rfc) + + # RFC referring only to the rfc - should be reported only for the rfc + rfc_referring_to_rfc = WgRfcFactory() + rfc_referring_to_rfc.relateddocument_set.create(relationship_id="refinfo", target=rfc) + + # RFC referring to the rfc and the draft - should be reported for both + rfc_referring_to_both = WgRfcFactory() + rfc_referring_to_both.relateddocument_set.create(relationship_id="refnorm", target=draft) + rfc_referring_to_both.relateddocument_set.create(relationship_id="refnorm", target=rfc) + + self.assertCountEqual( + draft.referenced_by_rfcs_as_rfc_or_draft(), + draft.targets_related.filter(source__type="rfc"), + ) + + self.assertCountEqual( + rfc.referenced_by_rfcs_as_rfc_or_draft(), + draft.targets_related.filter(source__type="rfc") | rfc.targets_related.filter(source__type="rfc"), + ) + +class StateIndexTests(TestCase): + + def test_state_index(self): + url = urlreverse('ietf.doc.views_help.state_index') + r = self.client.get(url) + q = PyQuery(r.content) + content = [ e.text for e in q('#content table td a ') ] + names = StateType.objects.values_list('slug', flat=True) + # The following doesn't cover all doc types, only a selection + for name in names: + if not '-' in name: + self.assertIn(name, content) + +class InvestigateTests(TestCase): + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + [ + "AGENDA_PATH", + # "INTERNET_DRAFT_PATH", + # "INTERNET_DRAFT_ARCHIVE_DIR", + # "INTERNET_ALL_DRAFTS_ARCHIVE_DIR", + ] + + def setUp(self): + super().setUp() + # Contort the draft archive dir temporary replacement + # to match the "collections" concept + archive_tmp_dir = Path(settings.INTERNET_DRAFT_ARCHIVE_DIR) + new_archive_dir = archive_tmp_dir / "draft-archive" + new_archive_dir.mkdir() + settings.INTERNET_DRAFT_ARCHIVE_DIR = str(new_archive_dir) + donated_personal_copy_dir = archive_tmp_dir / "donated-personal-copy" + donated_personal_copy_dir.mkdir() + meeting_dir = Path(settings.AGENDA_PATH) / "666" + meeting_dir.mkdir() + all_archive_dir = Path(settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR) + repository_dir = Path(settings.INTERNET_DRAFT_PATH) + + for path in [repository_dir, all_archive_dir]: + (path / "draft-this-is-active-00.txt").touch() + for path in [new_archive_dir, all_archive_dir]: + (path / "draft-old-but-can-authenticate-00.txt").touch() + (path / "draft-has-mixed-provenance-01.txt").touch() + for path in [donated_personal_copy_dir, all_archive_dir]: + (path / "draft-donated-from-a-personal-collection-00.txt").touch() + (path / "draft-has-mixed-provenance-00.txt").touch() + (path / "draft-has-mixed-provenance-00.txt.Z").touch() + (all_archive_dir / "draft-this-should-not-be-possible-00.txt").touch() + (meeting_dir / "draft-this-predates-the-archive-00.txt").touch() + + def test_investigate_fragment(self): + + result = investigate_fragment("this-is-active") + self.assertEqual(len(result["can_verify"]), 1) + self.assertEqual(len(result["unverifiable_collections"]), 0) + self.assertEqual(len(result["unexpected"]), 0) + self.assertEqual( + list(result["can_verify"])[0].name, "draft-this-is-active-00.txt" + ) + + result = investigate_fragment("old-but-can") + self.assertEqual(len(result["can_verify"]), 1) + self.assertEqual(len(result["unverifiable_collections"]), 0) + self.assertEqual(len(result["unexpected"]), 0) + self.assertEqual( + list(result["can_verify"])[0].name, "draft-old-but-can-authenticate-00.txt" + ) + + result = investigate_fragment("predates") + self.assertEqual(len(result["can_verify"]), 1) + self.assertEqual(len(result["unverifiable_collections"]), 0) + self.assertEqual(len(result["unexpected"]), 0) + self.assertEqual( + list(result["can_verify"])[0].name, "draft-this-predates-the-archive-00.txt" + ) + + result = investigate_fragment("personal-collection") + self.assertEqual(len(result["can_verify"]), 0) + self.assertEqual(len(result["unverifiable_collections"]), 1) + self.assertEqual(len(result["unexpected"]), 0) + self.assertEqual( + list(result["unverifiable_collections"])[0].name, + "draft-donated-from-a-personal-collection-00.txt", + ) + + result = investigate_fragment("mixed-provenance") + self.assertEqual(len(result["can_verify"]), 1) + self.assertEqual(len(result["unverifiable_collections"]), 2) + self.assertEqual(len(result["unexpected"]), 0) + self.assertEqual( + list(result["can_verify"])[0].name, "draft-has-mixed-provenance-01.txt" + ) + self.assertEqual( + set([p.name for p in result["unverifiable_collections"]]), + set( + [ + "draft-has-mixed-provenance-00.txt", + "draft-has-mixed-provenance-00.txt.Z", + ] + ), + ) + + result = investigate_fragment("not-be-possible") + self.assertEqual(len(result["can_verify"]), 0) + self.assertEqual(len(result["unverifiable_collections"]), 0) + self.assertEqual(len(result["unexpected"]), 1) + self.assertEqual( + list(result["unexpected"])[0].name, + "draft-this-should-not-be-possible-00.txt", + ) + + @mock.patch("ietf.doc.utils.caches") + def test_investigate_fragment_cache(self, mock_caches): + """investigate_fragment should cache its result""" + mock_default_cache = mock_caches["default"] + mock_default_cache.get.return_value = None # disable cache + result = investigate_fragment("this-is-active") + self.assertEqual(len(result["can_verify"]), 1) + self.assertEqual(len(result["unverifiable_collections"]), 0) + self.assertEqual(len(result["unexpected"]), 0) + self.assertEqual( + list(result["can_verify"])[0].name, "draft-this-is-active-00.txt" + ) + self.assertTrue(mock_default_cache.get.called) + self.assertTrue(mock_default_cache.set.called) + expected_key = f"investigate_fragment:{sha384(b'this-is-active').hexdigest()}" + self.assertEqual(mock_default_cache.set.call_args.kwargs["key"], expected_key) + cached_value = mock_default_cache.set.call_args.kwargs["value"] # hang on to this + mock_default_cache.reset_mock() + + # Check that a cached value is used + mock_default_cache.get.return_value = cached_value + with mock.patch("ietf.doc.utils.Path") as mock_path: + result = investigate_fragment("this-is-active") + # Check that we got the same results + self.assertEqual(len(result["can_verify"]), 1) + self.assertEqual(len(result["unverifiable_collections"]), 0) + self.assertEqual(len(result["unexpected"]), 0) + self.assertEqual( + list(result["can_verify"])[0].name, "draft-this-is-active-00.txt" + ) + # And that we used the cache + self.assertFalse(mock_path.called) # a proxy for "did the method do any real work" + self.assertTrue(mock_default_cache.get.called) + self.assertEqual(mock_default_cache.get.call_args, mock.call(expected_key)) + + def test_investigate_get(self): + """GET with no querystring should retrieve the investigate UI""" + url = urlreverse("ietf.doc.views_doc.investigate") + login_testing_unauthorized(self, "secretary", url) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertEqual(len(q("form#investigate")), 1) + self.assertEqual(len(q("div#results")), 0) + + @mock.patch("ietf.doc.views_doc.AsyncResult") + def test_investgate_get_task_id(self, mock_asyncresult): + """GET with querystring should lookup task status""" + url = urlreverse("ietf.doc.views_doc.investigate") + login_testing_unauthorized(self, "secretary", url) + mock_asyncresult.return_value.ready.return_value = True + r = self.client.get(url + "?id=a-task-id") + self.assertEqual(r.status_code, 200) + self.assertEqual(r.json(), {"status": "ready"}) + self.assertTrue(mock_asyncresult.called) + self.assertEqual(mock_asyncresult.call_args, mock.call("a-task-id")) + mock_asyncresult.reset_mock() + + mock_asyncresult.return_value.ready.return_value = False + r = self.client.get(url + "?id=a-task-id") + self.assertEqual(r.status_code, 200) + self.assertEqual(r.json(), {"status": "notready"}) + self.assertTrue(mock_asyncresult.called) + self.assertEqual(mock_asyncresult.call_args, mock.call("a-task-id")) + + @mock.patch("ietf.doc.views_doc.investigate_fragment_task") + def test_investigate_post(self, mock_investigate_fragment_task): + """POST with a name_fragment and no task_id should start a celery task""" + url = urlreverse("ietf.doc.views_doc.investigate") + login_testing_unauthorized(self, "secretary", url) + + # test some invalid cases + r = self.client.post(url, {"name_fragment": "short"}) # limit is >= 8 characters + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertEqual(len(q("#id_name_fragment.is-invalid")), 1) + self.assertFalse(mock_investigate_fragment_task.delay.called) + for char in ["*", "%", "/", "\\"]: + r = self.client.post(url, {"name_fragment": f"bad{char}character"}) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertEqual(len(q("#id_name_fragment.is-invalid")), 1) + self.assertFalse(mock_investigate_fragment_task.delay.called) + + # now a valid one + mock_investigate_fragment_task.delay.return_value.id = "a-task-id" + r = self.client.post(url, {"name_fragment": "this-is-a-valid-fragment"}) + self.assertEqual(r.status_code, 200) + self.assertTrue(mock_investigate_fragment_task.delay.called) + self.assertEqual(mock_investigate_fragment_task.delay.call_args, mock.call("this-is-a-valid-fragment")) + self.assertEqual(r.json(), {"id": "a-task-id"}) + + @mock.patch("ietf.doc.views_doc.AsyncResult") + def test_investigate_post_task_id(self, mock_asyncresult): + """POST with name_fragment and task_id should retrieve results""" + url = urlreverse("ietf.doc.views_doc.investigate") + login_testing_unauthorized(self, "secretary", url) + + # First, test a non-successful result - this could be a failure or non-existent task id + mock_result = mock_asyncresult.return_value + mock_result.successful.return_value = False + r = self.client.post(url, {"name_fragment": "some-fragment", "task_id": "a-task-id"}) + self.assertContains(r, "The investigation task failed.", status_code=200) + self.assertTrue(mock_asyncresult.called) + self.assertEqual(mock_asyncresult.call_args, mock.call("a-task-id")) + self.assertFalse(mock_result.get.called) + mock_asyncresult.reset_mock() + q = PyQuery(r.content) + self.assertEqual(q("#id_name_fragment").val(), "some-fragment") + self.assertEqual(q("#id_task_id").val(), "a-task-id") + + # now the various successful result mixes + mock_result = mock_asyncresult.return_value + mock_result.successful.return_value = True + mock_result.get.return_value = { + "name_fragment": "different-fragment", + "results": { + "can_verify": set(), + "unverifiable_collections": set(), + "unexpected": set(), + } + } + r = self.client.post(url, {"name_fragment": "some-fragment", "task_id": "a-task-id"}) + self.assertEqual(r.status_code, 200) + self.assertTrue(mock_asyncresult.called) + self.assertEqual(mock_asyncresult.call_args, mock.call("a-task-id")) + mock_asyncresult.reset_mock() + q = PyQuery(r.content) + self.assertEqual(q("#id_name_fragment").val(), "different-fragment", "name_fragment should be reset") + self.assertEqual(q("#id_task_id").val(), "", "task_id should be cleared") + self.assertEqual(len(q("div#results")), 1) + self.assertEqual(len(q("table#authenticated")), 0) + self.assertEqual(len(q("table#unverifiable")), 0) + self.assertEqual(len(q("table#unexpected")), 0) + + # This file was created in setUp. It allows the view to render properly + # but its location / content don't matter for this test otherwise. + a_file_that_exists = Path(settings.INTERNET_DRAFT_PATH) / "draft-this-is-active-00.txt" + + mock_result.get.return_value = { + "name_fragment": "different-fragment", + "results": { + "can_verify": {a_file_that_exists}, + "unverifiable_collections": {a_file_that_exists}, + "unexpected": set(), + } + } + r = self.client.post(url, {"name_fragment": "some-fragment", "task_id": "a-task-id"}) + self.assertEqual(r.status_code, 200) + self.assertTrue(mock_asyncresult.called) + self.assertEqual(mock_asyncresult.call_args, mock.call("a-task-id")) + mock_asyncresult.reset_mock() + q = PyQuery(r.content) + self.assertEqual(q("#id_name_fragment").val(), "different-fragment", "name_fragment should be reset") + self.assertEqual(q("#id_task_id").val(), "", "task_id should be cleared") + self.assertEqual(len(q("div#results")), 1) + self.assertEqual(len(q("table#authenticated")), 1) + self.assertEqual(len(q("table#unverifiable")), 1) + self.assertEqual(len(q("table#unexpected")), 0) + + mock_result.get.return_value = { + "name_fragment": "different-fragment", + "results": { + "can_verify": set(), + "unverifiable_collections": set(), + "unexpected": {a_file_that_exists}, + } + } + r = self.client.post(url, {"name_fragment": "some-fragment", "task_id": "a-task-id"}) + self.assertEqual(r.status_code, 200) + self.assertTrue(mock_asyncresult.called) + self.assertEqual(mock_asyncresult.call_args, mock.call("a-task-id")) + mock_asyncresult.reset_mock() + q = PyQuery(r.content) + self.assertEqual(q("#id_name_fragment").val(), "different-fragment", "name_fragment should be reset") + self.assertEqual(q("#id_task_id").val(), "", "task_id should be cleared") + self.assertEqual(len(q("div#results")), 1) + self.assertEqual(len(q("table#authenticated")), 0) + self.assertEqual(len(q("table#unverifiable")), 0) + self.assertEqual(len(q("table#unexpected")), 1) + + +class LogIOErrorTests(TestCase): + + def test_doc_text_io_error(self): + + d = IndividualDraftFactory() + + with mock.patch("ietf.doc.models.Path") as path_cls_mock: + with mock.patch("ietf.doc.models.log.log") as log_mock: + path_cls_mock.return_value.exists.return_value = True + path_cls_mock.return_value.open.return_value.__enter__.return_value.read.side_effect = IOError("Bad things happened") + text = d.text() + self.assertIsNone(text) + self.assertTrue(log_mock.called) + self.assertIn("Bad things happened", log_mock.call_args[0][0]) diff --git a/ietf/doc/tests_ballot.py b/ietf/doc/tests_ballot.py index 8a4717c748e..8420e411e29 100644 --- a/ietf/doc/tests_ballot.py +++ b/ietf/doc/tests_ballot.py @@ -3,7 +3,7 @@ import datetime -import mock +from unittest import mock from pyquery import PyQuery @@ -17,28 +17,37 @@ from ietf.doc.models import (Document, State, DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, TelechatDocEvent) from ietf.doc.factories import (DocumentFactory, IndividualDraftFactory, IndividualRfcFactory, WgDraftFactory, - BallotPositionDocEventFactory, BallotDocEventFactory, IRSGBallotDocEventFactory) + BallotPositionDocEventFactory, BallotDocEventFactory, IRSGBallotDocEventFactory, RgDraftFactory) from ietf.doc.templatetags.ietf_filters import can_defer from ietf.doc.utils import create_ballot_if_not_open +from ietf.doc.views_ballot import parse_ballot_edit_return_point from ietf.doc.views_doc import document_ballot_content from ietf.group.models import Group, Role from ietf.group.factories import GroupFactory, RoleFactory, ReviewTeamFactory from ietf.ipr.factories import HolderIprDisclosureFactory -from ietf.name.models import BallotPositionName from ietf.iesg.models import TelechatDate -from ietf.person.models import Person, PersonalApiKey -from ietf.person.factories import PersonFactory +from ietf.person.models import Person +from ietf.person.factories import PersonFactory, PersonalApiKeyFactory from ietf.person.utils import get_active_ads from ietf.utils.test_utils import TestCase, login_testing_unauthorized from ietf.utils.mail import outbox, empty_outbox, get_payload_text from ietf.utils.text import unwrap -from ietf.utils.timezone import date_today +from ietf.utils.timezone import date_today, datetime_today class EditPositionTests(TestCase): + + # N.B. This test needs to be rewritten to exercise all types of ballots (iesg, irsg, rsab) + # and test against the output of the mailtriggers instead of looking for hardcoded values + # in the To and CC results. See #7864 def test_edit_position(self): ad = Person.objects.get(user__username="ad") - draft = IndividualDraftFactory(ad=ad,stream_id='ietf') + draft = WgDraftFactory( + ad=ad, + stream_id="ietf", + notify="somebody@example.com", + group__acronym="mars", + ) ballot = create_ballot_if_not_open(None, draft, ad, 'approve') url = urlreverse('ietf.doc.views_ballot.edit_position', kwargs=dict(name=draft.name, ballot_id=ballot.pk)) @@ -54,11 +63,20 @@ def test_edit_position(self): self.assertEqual(len(q('form textarea[name=comment]')), 1) # vote + empty_outbox() events_before = draft.docevent_set.count() - - r = self.client.post(url, dict(position="discuss", - discuss=" This is a discussion test. \n ", - comment=" This is a test. \n ")) + + r = self.client.post( + url, + dict( + position="discuss", + discuss=" This is a discussion test. \n ", + comment=" This is a test. \n ", + additional_cc="test298347@example.com", + cc_choices=["doc_notify", "doc_group_chairs"], + send_mail=1, + ), + ) self.assertEqual(r.status_code, 302) pos = draft.latest_event(BallotPositionDocEvent, balloter=ad) @@ -69,6 +87,22 @@ def test_edit_position(self): self.assertTrue(pos.comment_time != None) self.assertTrue("New position" in pos.desc) self.assertEqual(draft.docevent_set.count(), events_before + 3) + self.assertEqual(len(outbox),1) + m = outbox[0] + self.assertTrue("COMMENT" in m['Subject']) + self.assertTrue("DISCUSS" in m['Subject']) + self.assertTrue(draft.name in m['Subject']) + self.assertTrue("This is a discussion test." in str(m)) + self.assertTrue("This is a test" in str(m)) + self.assertTrue("iesg@" in m['To']) + # cc_choice doc_group_chairs + self.assertTrue("mars-chairs@" in m['Cc']) + # cc_choice doc_notify + self.assertTrue("somebody@example.com" in m['Cc']) + # cc_choice doc_group_email_list was not selected + self.assertFalse(draft.group.list_email in m['Cc']) + # extra-cc + self.assertTrue("test298347@example.com" in m['Cc']) # recast vote events_before = draft.docevent_set.count() @@ -110,7 +144,7 @@ def test_api_set_position(self): create_ballot_if_not_open(None, draft, ad, 'approve') ad.user.last_login = timezone.now() ad.user.save() - apikey = PersonalApiKey.objects.create(endpoint=url, person=ad) + apikey = PersonalApiKeyFactory(endpoint=url, person=ad) # vote events_before = draft.docevent_set.count() @@ -229,61 +263,6 @@ def test_cannot_edit_position_as_pre_ad(self): r = self.client.post(url, dict(position="discuss", discuss="Test discuss text")) self.assertEqual(r.status_code, 403) - def test_send_ballot_comment(self): - ad = Person.objects.get(user__username="ad") - draft = WgDraftFactory(ad=ad,group__acronym='mars') - draft.notify = "somebody@example.com" - draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")]) - - ballot = create_ballot_if_not_open(None, draft, ad, 'approve') - - BallotPositionDocEvent.objects.create( - doc=draft, rev=draft.rev, type="changed_ballot_position", - by=ad, balloter=ad, ballot=ballot, pos=BallotPositionName.objects.get(slug="discuss"), - discuss="This draft seems to be lacking a clearer title?", - discuss_time=timezone.now(), - comment="Test!", - comment_time=timezone.now()) - - url = urlreverse('ietf.doc.views_ballot.send_ballot_comment', kwargs=dict(name=draft.name, - ballot_id=ballot.pk)) - login_testing_unauthorized(self, "ad", url) - - # normal get - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - q = PyQuery(r.content) - self.assertTrue(len(q('form input[name="extra_cc"]')) > 0) - - # send - mailbox_before = len(outbox) - - r = self.client.post(url, dict(extra_cc="test298347@example.com", cc_choices=['doc_notify','doc_group_chairs'])) - self.assertEqual(r.status_code, 302) - - self.assertEqual(len(outbox), mailbox_before + 1) - m = outbox[-1] - self.assertTrue("COMMENT" in m['Subject']) - self.assertTrue("DISCUSS" in m['Subject']) - self.assertTrue(draft.name in m['Subject']) - self.assertTrue("clearer title" in str(m)) - self.assertTrue("Test!" in str(m)) - self.assertTrue("iesg@" in m['To']) - # cc_choice doc_group_chairs - self.assertTrue("mars-chairs@" in m['Cc']) - # cc_choice doc_notify - self.assertTrue("somebody@example.com" in m['Cc']) - # cc_choice doc_group_email_list was not selected - self.assertFalse(draft.group.list_email in m['Cc']) - # extra-cc - self.assertTrue("test298347@example.com" in m['Cc']) - - r = self.client.post(url, dict(cc="")) - self.assertEqual(r.status_code, 302) - self.assertEqual(len(outbox), mailbox_before + 2) - m = outbox[-1] - self.assertTrue("iesg@" in m['To']) - self.assertFalse(m['Cc'] and draft.group.list_email in m['Cc']) class BallotWriteupsTests(TestCase): @@ -356,7 +335,7 @@ def test_request_last_call(self): self.assertTrue('aread@' in outbox[-1]['Cc']) def test_edit_ballot_writeup(self): - draft = IndividualDraftFactory(states=[('draft','active'),('draft-iesg','iesg-eva')]) + draft = IndividualDraftFactory(states=[('draft','active'),('draft-iesg','iesg-eva')], stream_id='ietf') url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -386,8 +365,25 @@ def test_edit_ballot_writeup(self): self.assertTrue("This is a simple test" in d.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text").text) self.assertTrue('iesg-eva' == d.get_state_slug('draft-iesg')) + def test_edit_ballot_writeup_unauthorized_stream(self): + # Test that accessing a document from unauthorized (irtf) stream returns a 404 error + draft = RgDraftFactory() + url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name)) + login_testing_unauthorized(self, "ad", url) + + r = self.client.get(url) + self.assertEqual(r.status_code, 404) + + def test_edit_ballot_writeup_invalid_name(self): + # Test that accessing a non-existent document returns a 404 error + url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name="invalid_name")) + login_testing_unauthorized(self, "ad", url) + + r = self.client.get(url) + self.assertEqual(r.status_code, 404) + def test_edit_ballot_writeup_already_approved(self): - draft = IndividualDraftFactory(states=[('draft','active'),('draft-iesg','approved')]) + draft = IndividualDraftFactory(states=[('draft','active'),('draft-iesg','approved')], stream_id='ietf') url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -461,7 +457,7 @@ def test_edit_ballot_rfceditornote(self): def test_issue_ballot(self): ad = Person.objects.get(user__username="ad") for case in ('none','past','future'): - draft = IndividualDraftFactory(ad=ad) + draft = IndividualDraftFactory(ad=ad, stream_id='ietf') if case in ('past','future'): LastCallDocEvent.objects.create( by=Person.objects.get(name='(System)'), @@ -500,7 +496,7 @@ def test_issue_ballot(self): def test_issue_ballot_auto_state_change(self): ad = Person.objects.get(user__username="ad") - draft = IndividualDraftFactory(ad=ad, states=[('draft','active'),('draft-iesg','writeupw')]) + draft = IndividualDraftFactory(ad=ad, states=[('draft','active'),('draft-iesg','writeupw')], stream_id='ietf') url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -524,11 +520,12 @@ def test_issue_ballot_auto_state_change(self): def test_issue_ballot_warn_if_early(self): ad = Person.objects.get(user__username="ad") - draft = IndividualDraftFactory(ad=ad, states=[('draft','active'),('draft-iesg','lc')]) + draft = IndividualDraftFactory(ad=ad, states=[('draft','active'),('draft-iesg','lc')], stream_id='ietf') url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) # expect warning about issuing a ballot before IETF Last Call is done + # No last call has yet been issued r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) @@ -536,6 +533,38 @@ def test_issue_ballot_warn_if_early(self): self.assertTrue(q('[class=text-danger]:contains("not completed IETF Last Call")')) self.assertTrue(q('[type=submit]:contains("Save")')) + # Last call exists but hasn't expired + LastCallDocEvent.objects.create( + doc=draft, + expires=datetime_today()+datetime.timedelta(days=14), + by=Person.objects.get(name="(System)") + ) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertTrue(q('[class=text-danger]:contains("not completed IETF Last Call")')) + + # Last call exists and has expired + LastCallDocEvent.objects.filter(doc=draft).update(expires=datetime_today()-datetime.timedelta(days=2)) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertFalse(q('[class=text-danger]:contains("not completed IETF Last Call")')) + + for state_slug in ["lc", "ad-eval"]: + draft.set_state(State.objects.get(type="draft-iesg",slug=state_slug)) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertTrue(q('[class=text-danger]:contains("It would be unexpected to issue a ballot while in this state.")')) + + draft.set_state(State.objects.get(type="draft-iesg",slug="writeupw")) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertFalse(q('[class=text-danger]:contains("It would be unexpected to issue a ballot while in this state.")')) + + def test_edit_approval_text(self): ad = Person.objects.get(user__username="ad") draft = WgDraftFactory(ad=ad,states=[('draft','active'),('draft-iesg','iesg-eva')],intended_std_level_id='ps',group__parent=Group.objects.get(acronym='farfut')) @@ -773,7 +802,7 @@ def test_clear_ballot(self): ballot = create_ballot_if_not_open(None, draft, ad, 'approve') old_ballot_id = ballot.id draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva")) - url = urlreverse('ietf.doc.views_ballot.clear_ballot', kwargs=dict(name=draft.name,ballot_type_slug=draft.ballot_open('approve').ballot_type.slug)) + url = urlreverse('ietf.doc.views_ballot.clear_ballot', kwargs=dict(name=draft.name,ballot_type_slug="approve")) login_testing_unauthorized(self, "secretary", url) r = self.client.get(url) self.assertEqual(r.status_code, 200) @@ -783,6 +812,11 @@ def test_clear_ballot(self): self.assertIsNotNone(ballot) self.assertEqual(ballot.ballotpositiondocevent_set.count(),0) self.assertNotEqual(old_ballot_id, ballot.id) + # It's not valid to clear a ballot of a type where there's no matching state + url = urlreverse('ietf.doc.views_ballot.clear_ballot', kwargs=dict(name=draft.name,ballot_type_slug="statchg")) + r = self.client.post(url,{}) + self.assertEqual(r.status_code, 404) + def test_ballot_downref_approve(self): ad = Person.objects.get(name="Areað Irector") @@ -803,8 +837,8 @@ def test_ballot_downref_approve(self): desc='Last call announcement was changed', text='this is simple last call text.' ) rfc = IndividualRfcFactory.create( + name = "rfc6666", stream_id='ise', - other_aliases=['rfc6666',], states=[('draft','rfc'),('draft-iesg','pub')], std_level_id='inf', ) @@ -821,7 +855,7 @@ def test_ballot_downref_approve(self): self.assertContains(r, "No downward references for") # Add a downref, the page should ask if it should be added to the registry - rel = draft.relateddocument_set.create(target=rfc.docalias.get(name='rfc6666'),relationship_id='refnorm') + rel = draft.relateddocument_set.create(target=rfc, relationship_id='refnorm') d = [rdoc for rdoc in draft.relateddocument_set.all() if rel.is_approved_downref()] original_len = len(d) r = self.client.get(url) @@ -1121,13 +1155,13 @@ def test_regenerate_last_call(self): self.assertFalse("contains these normative down" in lc_text) rfc = IndividualRfcFactory.create( + rfc_number=6666, stream_id='ise', - other_aliases=['rfc6666',], states=[('draft','rfc'),('draft-iesg','pub')], std_level_id='inf', ) - draft.relateddocument_set.create(target=rfc.docalias.get(name='rfc6666'),relationship_id='refnorm') + draft.relateddocument_set.create(target=rfc,relationship_id='refnorm') r = self.client.post(url, dict(regenerate_last_call_text="1")) self.assertEqual(r.status_code, 200) @@ -1137,7 +1171,7 @@ def test_regenerate_last_call(self): self.assertTrue("rfc6666" in lc_text) self.assertTrue("Independent Submission" in lc_text) - draft.relateddocument_set.create(target=rfc.docalias.get(name='rfc6666'), relationship_id='downref-approval') + draft.relateddocument_set.create(target=rfc, relationship_id='downref-approval') r = self.client.post(url, dict(regenerate_last_call_text="1")) self.assertEqual(r.status_code, 200) @@ -1413,3 +1447,28 @@ def test_document_ballot_content_without_send_email_values(self): self._assertBallotMessage(q, balloters[0], 'No discuss send log available') self._assertBallotMessage(q, balloters[1], 'No comment send log available') self._assertBallotMessage(q, old_balloter, 'No ballot position send log available') + +class ReturnToUrlTests(TestCase): + def test_invalid_return_to_url(self): + with self.assertRaises(ValueError): + parse_ballot_edit_return_point('/', 'draft-ietf-opsawg-ipfix-tcpo-v6eh', '998718') + + with self.assertRaises(ValueError): + parse_ballot_edit_return_point('/a-route-that-does-not-exist/', 'draft-ietf-opsawg-ipfix-tcpo-v6eh', '998718') + + with self.assertRaises(ValueError): + parse_ballot_edit_return_point('https://example.com/phishing', 'draft-ietf-opsawg-ipfix-tcpo-v6eh', '998718') + + def test_valid_default_return_to_url(self): + self.assertEqual(parse_ballot_edit_return_point( + None, + 'draft-ietf-opsawg-ipfix-tcpo-v6eh', + '998718' + ), '/doc/draft-ietf-opsawg-ipfix-tcpo-v6eh/ballot/998718/') + + def test_valid_return_to_url(self): + self.assertEqual(parse_ballot_edit_return_point( + '/doc/draft-ietf-opsawg-ipfix-tcpo-v6eh/ballot/998718/', + 'draft-ietf-opsawg-ipfix-tcpo-v6eh', + '998718' + ), '/doc/draft-ietf-opsawg-ipfix-tcpo-v6eh/ballot/998718/') diff --git a/ietf/doc/tests_bofreq.py b/ietf/doc/tests_bofreq.py index 2fdc8c282a3..6a7c9393ef8 100644 --- a/ietf/doc/tests_bofreq.py +++ b/ietf/doc/tests_bofreq.py @@ -16,9 +16,10 @@ from django.template.loader import render_to_string from django.utils import timezone +from ietf.doc.storage_utils import retrieve_str from ietf.group.factories import RoleFactory from ietf.doc.factories import BofreqFactory, NewRevisionDocEventFactory -from ietf.doc.models import State, Document, DocAlias, NewRevisionDocEvent +from ietf.doc.models import State, Document, NewRevisionDocEvent from ietf.doc.utils_bofreq import bofreq_editors, bofreq_responsible from ietf.ietfauth.utils import has_role from ietf.person.factories import PersonFactory @@ -32,7 +33,7 @@ class BofreqTests(TestCase): settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['BOFREQ_PATH'] def write_bofreq_file(self, bofreq): - fname = Path(settings.BOFREQ_PATH) / ("%s-%s.md" % (bofreq.canonical_name(), bofreq.rev)) + fname = Path(settings.BOFREQ_PATH) / ("%s-%s.md" % (bofreq.name, bofreq.rev)) with fname.open("w") as f: f.write(f"""# This is a test bofreq. Version: {bofreq.rev} @@ -54,8 +55,8 @@ def test_show_bof_requests(self): self.assertEqual(r.status_code, 200) q = PyQuery(r.content) for state in states: - self.assertEqual(len(q(f'#bofreqs-{state.slug}')), 1) - self.assertEqual(len(q(f'#bofreqs-{state.slug} tbody tr')), 3) + self.assertEqual(len(q(f'#bofreqs-{state.slug}')), 1 if state.slug!="spam" else 0) + self.assertEqual(len(q(f'#bofreqs-{state.slug} tbody tr')), 3 if state.slug!="spam" else 0) self.assertFalse(q('#start_button')) PersonFactory(user__username='nobody') self.client.login(username='nobody', password='nobody+password') @@ -63,6 +64,13 @@ def test_show_bof_requests(self): self.assertEqual(r.status_code, 200) q = PyQuery(r.content) self.assertTrue(q('#start_button')) + self.client.logout() + self.client.login(username='secretary', password='secretary+password') + r = self.client.get(url) + q = PyQuery(r.content) + for state in states: + self.assertEqual(len(q(f'#bofreqs-{state.slug}')), 1) + self.assertEqual(len(q(f'#bofreqs-{state.slug} tbody tr')), 3) def test_bofreq_main_page(self): @@ -333,6 +341,7 @@ def test_submit(self): doc = reload_db_objects(doc) self.assertEqual('%02d'%(int(rev)+1) ,doc.rev) self.assertEqual(f'# {username}', doc.text()) + self.assertEqual(f'# {username}', retrieve_str('bofreq',doc.get_base_name())) self.assertEqual(docevent_count+1, doc.docevent_set.count()) self.assertEqual(1, len(outbox)) rev = doc.rev @@ -366,13 +375,13 @@ def test_start_new_bofreq(self): name = f"bofreq-{xslugify(nobody.last_name())[:64]}-{postdict['title']}".replace(' ','-') bofreq = Document.objects.filter(name=name,type_id='bofreq').first() self.assertIsNotNone(bofreq) - self.assertIsNotNone(DocAlias.objects.filter(name=name).first()) self.assertEqual(bofreq.title, postdict['title']) self.assertEqual(bofreq.rev, '00') self.assertEqual(bofreq.get_state_slug(), 'proposed') self.assertEqual(list(bofreq_editors(bofreq)), [nobody]) self.assertEqual(bofreq.latest_event(NewRevisionDocEvent).rev, '00') self.assertEqual(bofreq.text_or_error(), 'some stuff') + self.assertEqual(retrieve_str('bofreq',bofreq.get_base_name()), 'some stuff') self.assertEqual(len(outbox),1) finally: os.unlink(file.name) diff --git a/ietf/doc/tests_charter.py b/ietf/doc/tests_charter.py index f65cf14e088..62e49559e28 100644 --- a/ietf/doc/tests_charter.py +++ b/ietf/doc/tests_charter.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright The IETF Trust 2011-2020, All Rights Reserved +# Copyright The IETF Trust 2011-2023, All Rights Reserved import datetime @@ -16,6 +16,7 @@ from ietf.doc.factories import CharterFactory, NewRevisionDocEventFactory, TelechatDocEventFactory from ietf.doc.models import ( Document, State, BallotDocEvent, BallotType, NewRevisionDocEvent, TelechatDocEvent, WriteupDocEvent ) +from ietf.doc.storage_utils import retrieve_str from ietf.doc.utils_charter import ( next_revision, default_review_text, default_action_text, charter_name_for_group ) from ietf.doc.utils import close_open_ballots @@ -87,11 +88,12 @@ def test_view_revisions(self): class EditCharterTests(TestCase): settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CHARTER_PATH'] + def setUp(self): + super().setUp() + (Path(settings.FTP_DIR)/"charter").mkdir() + def write_charter_file(self, charter): - with (Path(settings.CHARTER_PATH) / - ("%s-%s.txt" % (charter.canonical_name(), charter.rev)) - ).open("w") as f: - f.write("This is a charter.") + (Path(settings.CHARTER_PATH) / f"{charter.name}-{charter.rev}.txt").write_text("This is a charter.") def test_startstop_process(self): CharterFactory(group__acronym='mars') @@ -509,8 +511,21 @@ def test_submit_charter(self): self.assertEqual(charter.rev, next_revision(prev_rev)) self.assertTrue("new_revision" in charter.latest_event().type) - with (Path(settings.CHARTER_PATH) / (charter.canonical_name() + "-" + charter.rev + ".txt")).open(encoding='utf-8') as f: - self.assertEqual(f.read(), "Windows line\nMac line\nUnix line\n" + utf_8_snippet.decode('utf-8')) + charter_path = Path(settings.CHARTER_PATH) / (charter.name + "-" + charter.rev + ".txt") + file_contents = (charter_path).read_text("utf-8") + self.assertEqual( + file_contents, + "Windows line\nMac line\nUnix line\n" + utf_8_snippet.decode("utf-8"), + ) + ftp_charter_path = Path(settings.FTP_DIR) / "charter" / charter_path.name + self.assertTrue(ftp_charter_path.exists()) + self.assertTrue(charter_path.samefile(ftp_charter_path)) + blobstore_contents = retrieve_str("charter", charter.get_base_name()) + self.assertEqual( + blobstore_contents, + "Windows line\nMac line\nUnix line\n" + utf_8_snippet.decode("utf-8"), + ) + def test_submit_initial_charter(self): group = GroupFactory(type_id='wg',acronym='mars',list_email='mars-wg@ietf.org') @@ -538,6 +553,24 @@ def test_submit_initial_charter(self): group = Group.objects.get(pk=group.pk) self.assertEqual(group.charter, charter) + def test_submit_charter_with_invalid_name(self): + self.client.login(username="secretary", password="secretary+password") + ietf_group = GroupFactory(type_id="wg") + for bad_name in ("charter-irtf-{}", "charter-randomjunk-{}", "charter-ietf-thisisnotagroup"): + url = urlreverse("ietf.doc.views_charter.submit", kwargs={"name": bad_name.format(ietf_group.acronym)}) + r = self.client.get(url) + self.assertEqual(r.status_code, 404, f"GET of charter named {bad_name} should 404") + r = self.client.post(url, {}) + self.assertEqual(r.status_code, 404, f"POST of charter named {bad_name} should 404") + + irtf_group = GroupFactory(type_id="rg") + for bad_name in ("charter-ietf-{}", "charter-whatisthis-{}", "charter-irtf-thisisnotagroup"): + url = urlreverse("ietf.doc.views_charter.submit", kwargs={"name": bad_name.format(irtf_group.acronym)}) + r = self.client.get(url) + self.assertEqual(r.status_code, 404, f"GET of charter named {bad_name} should 404") + r = self.client.post(url, {}) + self.assertEqual(r.status_code, 404, f"POST of charter named {bad_name} should 404") + def test_edit_review_announcement_text(self): area = GroupFactory(type_id='area') RoleFactory(name_id='ad',group=area,person=Person.objects.get(user__username='ad')) @@ -788,9 +821,11 @@ def test_approve(self): self.assertTrue(not charter.ballot_open("approve")) self.assertEqual(charter.rev, "01") - self.assertTrue( - (Path(settings.CHARTER_PATH) / ("charter-ietf-%s-%s.txt" % (group.acronym, charter.rev))).exists() - ) + charter_path = Path(settings.CHARTER_PATH) / ("charter-ietf-%s-%s.txt" % (group.acronym, charter.rev)) + charter_ftp_path = Path(settings.FTP_DIR) / "charter" / charter_path.name + self.assertTrue(charter_path.exists()) + self.assertTrue(charter_ftp_path.exists()) + self.assertTrue(charter_path.samefile(charter_ftp_path)) self.assertEqual(len(outbox), 2) # @@ -817,6 +852,19 @@ def test_approve(self): self.assertEqual(group.groupmilestone_set.filter(state="active", desc=m1.desc).count(), 1) self.assertEqual(group.groupmilestone_set.filter(state="active", desc=m4.desc).count(), 1) + def test_approve_irtf(self): + charter = CharterFactory(group__type_id='rg') + url = urlreverse('ietf.doc.views_charter.approve', kwargs=dict(name=charter.name)) + login_testing_unauthorized(self, "secretary", url) + empty_outbox() + r = self.client.post(url, dict()) + self.assertEqual(r.status_code, 302) + self.assertEqual(len(outbox), 2) + self.assertTrue("IRTF" in outbox[1]['From']) + self.assertTrue("irtf-announce" in outbox[1]['To']) + self.assertTrue(charter.group.acronym in outbox[1]['Cc']) + self.assertTrue("RG Action" in outbox[1]['Subject']) + def test_charter_with_milestones(self): charter = CharterFactory() diff --git a/ietf/doc/tests_conflict_review.py b/ietf/doc/tests_conflict_review.py index 6fa1a4d9b68..791db17f5a2 100644 --- a/ietf/doc/tests_conflict_review.py +++ b/ietf/doc/tests_conflict_review.py @@ -1,9 +1,10 @@ -# Copyright The IETF Trust 2012-2020, All Rights Reserved +# Copyright The IETF Trust 2012-2023, All Rights Reserved # -*- coding: utf-8 -*- import io import os +from pathlib import Path from pyquery import PyQuery from textwrap import wrap @@ -13,8 +14,9 @@ import debug # pyflakes:ignore -from ietf.doc.factories import IndividualDraftFactory, ConflictReviewFactory -from ietf.doc.models import Document, DocEvent, NewRevisionDocEvent, BallotPositionDocEvent, TelechatDocEvent, State +from ietf.doc.factories import IndividualDraftFactory, ConflictReviewFactory, RgDraftFactory +from ietf.doc.models import Document, DocEvent, NewRevisionDocEvent, BallotPositionDocEvent, TelechatDocEvent, State, DocTagName +from ietf.doc.storage_utils import retrieve_str from ietf.doc.utils import create_ballot_if_not_open from ietf.doc.views_conflict_review import default_approval_text from ietf.group.models import Person @@ -70,12 +72,12 @@ def test_start_review_as_secretary(self): self.assertEqual(review_doc.ad.name,'Areað Irector') self.assertEqual(review_doc.notify,'ipu@ietf.org') doc = Document.objects.get(name='draft-imaginary-independent-submission') - self.assertTrue(doc in [x.target.document for x in review_doc.relateddocument_set.filter(relationship__slug='conflrev')]) + self.assertTrue(doc in [x.target for x in review_doc.relateddocument_set.filter(relationship__slug='conflrev')]) self.assertTrue(review_doc.latest_event(DocEvent,type="added_comment").desc.startswith("IETF conflict review requested")) self.assertTrue(doc.latest_event(DocEvent,type="added_comment").desc.startswith("IETF conflict review initiated")) self.assertTrue('Conflict Review requested' in outbox[-1]['Subject']) - + # verify you can't start a review when a review is already in progress r = self.client.post(url,dict(ad="Areað Irector",create_in_state="Needs Shepherd",notify='ipu@ietf.org')) self.assertEqual(r.status_code, 404) @@ -119,7 +121,7 @@ def test_start_review_as_stream_owner(self): self.assertEqual(review_doc.ad.name,'Ietf Chair') self.assertEqual(review_doc.notify,'ipu@ietf.org') doc = Document.objects.get(name='draft-imaginary-independent-submission') - self.assertTrue(doc in [x.target.document for x in review_doc.relateddocument_set.filter(relationship__slug='conflrev')]) + self.assertTrue(doc in [x.target for x in review_doc.relateddocument_set.filter(relationship__slug='conflrev')]) self.assertEqual(len(outbox), messages_before + 2) @@ -168,6 +170,21 @@ def test_change_state(self): self.assertTrue(review_doc.active_ballot()) self.assertEqual(review_doc.latest_event(BallotPositionDocEvent, type="changed_ballot_position").pos_id,'yes') + # try to change to an AD-forbidden state + appr_noprob_sent_pk = str(State.objects.get(used=True, slug='appr-noprob-sent',type__slug='conflrev').pk) + r = self.client.post(url,dict(review_state=appr_noprob_sent_pk,comment='xyzzy')) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertTrue(q('form .invalid-feedback')) + + # try again as secretariat + self.client.logout() + login_testing_unauthorized(self, 'secretary', url) + r = self.client.post(url,dict(review_state=appr_noprob_sent_pk,comment='xyzzy')) + self.assertEqual(r.status_code, 302) + review_doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') + self.assertEqual(review_doc.get_state('conflrev').slug, 'appr-noprob-sent') + def test_edit_notices(self): doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') @@ -372,7 +389,7 @@ def setUp(self): class ConflictReviewSubmitTests(TestCase): - settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CONFLICT_REVIEW_PATH'] + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CONFLICT_REVIEW_PATH','FTP_PATH'] def test_initial_submission(self): doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') url = urlreverse('ietf.doc.views_conflict_review.submit',kwargs=dict(name=doc.name)) @@ -388,9 +405,15 @@ def test_initial_submission(self): # Right now, nothing to test - we let people put whatever the web browser will let them put into that textbox # sane post using textbox - path = os.path.join(settings.CONFLICT_REVIEW_PATH, '%s-%s.txt' % (doc.canonical_name(), doc.rev)) + basename = f"{doc.name}-{doc.rev}.txt" + path = Path(settings.CONFLICT_REVIEW_PATH) / basename + ftp_dir = Path(settings.FTP_DIR) / "conflict-reviews" + if not ftp_dir.exists(): + ftp_dir.mkdir() + ftp_path = ftp_dir / basename self.assertEqual(doc.rev,'00') - self.assertFalse(os.path.exists(path)) + self.assertFalse(path.exists()) + self.assertFalse(ftp_path.exists()) r = self.client.post(url,dict(content="Some initial review text\n",submit_response="1")) self.assertEqual(r.status_code,302) doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') @@ -398,7 +421,9 @@ def test_initial_submission(self): with io.open(path) as f: self.assertEqual(f.read(),"Some initial review text\n") f.close() + self.assertTrue(ftp_path.exists()) self.assertTrue( "submission-00" in doc.latest_event(NewRevisionDocEvent).desc) + self.assertEqual(retrieve_str("conflrev",basename), "Some initial review text\n") def test_subsequent_submission(self): doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') @@ -408,7 +433,7 @@ def test_subsequent_submission(self): # A little additional setup # doc.rev is u'00' per the test setup - double-checking that here - if it fails, the breakage is in setUp self.assertEqual(doc.rev,'00') - path = os.path.join(settings.CONFLICT_REVIEW_PATH, '%s-%s.txt' % (doc.canonical_name(), doc.rev)) + path = os.path.join(settings.CONFLICT_REVIEW_PATH, '%s-%s.txt' % (doc.name, doc.rev)) with io.open(path,'w') as f: f.write('This is the old proposal.') f.close() @@ -435,7 +460,7 @@ def test_subsequent_submission(self): self.assertEqual(r.status_code, 302) doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') self.assertEqual(doc.rev,'01') - path = os.path.join(settings.CONFLICT_REVIEW_PATH, '%s-%s.txt' % (doc.canonical_name(), doc.rev)) + path = os.path.join(settings.CONFLICT_REVIEW_PATH, '%s-%s.txt' % (doc.name, doc.rev)) with io.open(path) as f: self.assertEqual(f.read(),"This is a new proposal.") f.close() @@ -450,3 +475,89 @@ def test_subsequent_submission(self): def setUp(self): super().setUp() ConflictReviewFactory(name='conflict-review-imaginary-irtf-submission',review_of=IndividualDraftFactory(name='draft-imaginary-irtf-submission',stream_id='irtf'),notify='notifyme@example.net') + +class ConflictReviewStreamStateTests(TestCase): + + def start_review(self, stream, role, kwargs=None): + doc = RgDraftFactory() if stream=='irtf' else IndividualDraftFactory(stream=StreamName.objects.get(slug='ise')) + url = urlreverse('ietf.doc.views_conflict_review.start_review', kwargs=dict(name=doc.name)) + login_testing_unauthorized(self, role, url) + r = self.client.post(url, kwargs) + self.assertEqual(r.status_code, 302) + self.assertEqual(doc.get_state('draft-stream-'+stream).slug, 'iesg-rev') + + def test_start_irtf_review_as_secretary(self): + ad_strpk = str(Person.objects.get(name='Areað Irector').pk) + state_strpk = str(State.objects.get(used=True, slug='needshep', type__slug='conflrev').pk) + self.start_review('irtf', 'secretary', kwargs=dict(ad=ad_strpk, create_in_state=state_strpk)) + + def test_start_ise_review_as_secretary(self): + ad_strpk = str(Person.objects.get(name='Areað Irector').pk) + state_strpk = str(State.objects.get(used=True, slug='needshep', type__slug='conflrev').pk) + self.start_review('ise', 'secretary', kwargs=dict(ad=ad_strpk, create_in_state=state_strpk)) + + def test_start_irtf_review_as_stream_owner(self): + self.start_review('irtf', 'irtf-chair') + + def test_start_ise_review_as_stream_owner(self): + self.start_review('ise', 'ise-chair') + + def close_review(self, close_type, stream, role): + doc = RgDraftFactory() if stream=='irtf' else IndividualDraftFactory(stream=StreamName.objects.get(slug='ise')) + review = ConflictReviewFactory(review_of=doc) + url = urlreverse('ietf.doc.views_conflict_review.change_state', kwargs=dict(name=review.name)) + login_testing_unauthorized(self, role, url) + strpk = str(State.objects.get(used=True, slug=close_type, type__slug='conflrev').pk) + r = self.client.post(url, dict(review_state=strpk)) + self.assertEqual(r.status_code, 302) + self.assertEqual(doc.get_state('draft-stream-'+stream).slug, 'chair-w' if stream=='irtf' else 'ise-rev') + self.assertIn(DocTagName.objects.get(pk='iesg-com'), doc.tags.all()) + + def test_close_irtf_review_reqnopub_as_secretary(self): + self.close_review('appr-reqnopub-sent', 'irtf', 'secretary') + + def test_close_ise_review_reqnopub_as_secretary(self): + self.close_review('appr-reqnopub-sent', 'ise', 'secretary') + + def test_close_irtf_review_noprob_as_secretary(self): + self.close_review('appr-noprob-sent', 'irtf', 'secretary') + + def test_close_ise_review_noprob_as_secretary(self): + self.close_review('appr-noprob-sent', 'ise', 'secretary') + + def test_close_irtf_review_withdraw_as_secretary(self): + self.close_review('withdraw', 'irtf', 'secretary') + + def test_close_ise_review_withdraw_as_secretary(self): + self.close_review('withdraw', 'ise', 'secretary') + + def test_close_irtf_review_dead_as_secretary(self): + self.close_review('dead', 'irtf', 'secretary') + + def test_close_ise_review_dead_as_secretary(self): + self.close_review('dead', 'ise', 'secretary') + + def test_close_irtf_review_withdraw_as_ad(self): + self.close_review('withdraw', 'irtf', 'ad') + + def test_close_ise_review_withdraw_as_ad(self): + self.close_review('withdraw', 'ise', 'ad') + + def test_close_irtf_review_dead_as_ad(self): + self.close_review('dead', 'irtf', 'ad') + + def test_close_ise_review_dead_as_ad(self): + self.close_review('dead', 'ise', 'ad') + + def test_approve_review(self): + doc = RgDraftFactory() + review = ConflictReviewFactory(review_of=doc) + review.set_state(State.objects.get(used=True, slug='appr-noprob-pend', type='conflrev')) + + url = urlreverse('ietf.doc.views_conflict_review.approve_conflict_review', kwargs=dict(name=review.name)) + login_testing_unauthorized(self, 'secretary', url) + + r = self.client.post(url, dict(announcement_text=default_approval_text(review))) + self.assertEqual(r.status_code, 302) + self.assertEqual(doc.get_state('draft-stream-irtf').slug, 'chair-w') + self.assertIn(DocTagName.objects.get(pk='iesg-com'), doc.tags.all()) diff --git a/ietf/doc/tests_downref.py b/ietf/doc/tests_downref.py index 258494e364c..0222ad79423 100644 --- a/ietf/doc/tests_downref.py +++ b/ietf/doc/tests_downref.py @@ -19,12 +19,9 @@ def setUp(self): super().setUp() PersonFactory(name='Plain Man',user__username='plain') self.draft = WgDraftFactory(name='draft-ietf-mars-test') - self.draftalias = self.draft.docalias.get(name='draft-ietf-mars-test') self.doc = WgDraftFactory(name='draft-ietf-mars-approved-document',states=[('draft-iesg','rfcqueue')]) - self.docalias = self.doc.docalias.get(name='draft-ietf-mars-approved-document') - self.rfc = WgRfcFactory(alias2__name='rfc9998') - self.rfcalias = self.rfc.docalias.get(name='rfc9998') - RelatedDocument.objects.create(source=self.doc, target=self.rfcalias, relationship_id='downref-approval') + self.rfc = WgRfcFactory(rfc_number=9998) + RelatedDocument.objects.create(source=self.doc, target=self.rfc, relationship_id='downref-approval') def test_downref_registry(self): url = urlreverse('ietf.doc.views_downref.downref_registry') @@ -64,44 +61,44 @@ def test_downref_registry_add(self): self.assertContains(r, 'Save downref') # error - already in the downref registry - r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.docalias.pk, ))) + r = self.client.post(url, dict(rfc=self.rfc.pk, drafts=(self.doc.pk, ))) self.assertContains(r, 'Downref is already in the registry') # error - source is not in an approved state r = self.client.get(url) self.assertEqual(r.status_code, 200) - r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draftalias.pk, ))) + r = self.client.post(url, dict(rfc=self.rfc.pk, drafts=(self.draft.pk, ))) self.assertContains(r, 'Draft is not yet approved') # error - the target is not a normative reference of the source self.draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="pub")) r = self.client.get(url) self.assertEqual(r.status_code, 200) - r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draftalias.pk, ))) + r = self.client.post(url, dict(rfc=self.rfc.pk, drafts=(self.draft.pk, ))) self.assertContains(r, 'There does not seem to be a normative reference to RFC') self.assertContains(r, 'Save downref anyway') # normal - approve the document so the downref is now okay - RelatedDocument.objects.create(source=self.draft, target=self.rfcalias, relationship_id='refnorm') + RelatedDocument.objects.create(source=self.draft, target=self.rfc, relationship_id='refnorm') draft_de_count_before = self.draft.docevent_set.count() rfc_de_count_before = self.rfc.docevent_set.count() r = self.client.get(url) self.assertEqual(r.status_code, 200) - r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draftalias.pk, ))) + r = self.client.post(url, dict(rfc=self.rfc.pk, drafts=(self.draft.pk, ))) self.assertEqual(r.status_code, 302) newurl = urlreverse('ietf.doc.views_downref.downref_registry') r = self.client.get(newurl) self.assertContains(r, 'tr>th:first-child").text() + self.assertNotIn("IESG", top_level_metadata_headings) + self.assertNotIn("IANA", top_level_metadata_headings) + +class BallotEmailAjaxTests(TestCase): + def test_ajax_build_position_email(self): + def _post_json(self, url, json_to_post): + r = self.client.post( + url, json.dumps(json_to_post), content_type="application/json" + ) + self.assertEqual(r.status_code, 200) + return json.loads(r.content) + + doc = WgDraftFactory() + ad = RoleFactory( + name_id="ad", group=doc.group, person__name="Some Areadirector" + ).person + url = urlreverse("ietf.doc.views_ballot.ajax_build_position_email") + login_testing_unauthorized(self, "secretary", url) + r = self.client.get(url) + self.assertEqual(r.status_code, 405) + response = _post_json(self, url, {}) + self.assertFalse(response["success"]) + self.assertEqual(response["errors"], ["post_data not provided"]) + response = _post_json(self, url, {"dictis": "not empty"}) + self.assertFalse(response["success"]) + self.assertEqual(response["errors"], ["post_data not provided"]) + response = _post_json(self, url, {"post_data": {}}) + self.assertFalse(response["success"]) + self.assertEqual(len(response["errors"]), 7) + response = _post_json( + self, + url, + { + "post_data": { + "discuss": "aaaaaa", + "comment": "bbbbbb", + "position": "discuss", + "balloter": Person.objects.aggregate(maxpk=Max("pk") + 1)["maxpk"], + "docname": "this-draft-does-not-exist", + "cc_choices": ["doc_group_mail_list"], + "additional_cc": "foo@example.com", + } + }, + ) + self.assertFalse(response["success"]) + self.assertEqual( + response["errors"], + ["No person found matching balloter", "No document found matching docname"], + ) + response = _post_json( + self, + url, + { + "post_data": { + "discuss": "aaaaaa", + "comment": "bbbbbb", + "position": "discuss", + "balloter": ad.pk, + "docname": doc.name, + "cc_choices": ["doc_group_mail_list"], + "additional_cc": "foo@example.com", + } + }, + ) + self.assertTrue(response["success"]) + for snippet in [ + "aaaaaa", + "bbbbbb", + "DISCUSS", + ad.plain_name(), + doc.name, + doc.group.list_email, + "foo@example.com", + ]: + self.assertIn(snippet, response["text"]) + diff --git a/ietf/doc/tests_irsg_ballot.py b/ietf/doc/tests_irsg_ballot.py index 92752e48c48..d96cf9dbefe 100644 --- a/ietf/doc/tests_irsg_ballot.py +++ b/ietf/doc/tests_irsg_ballot.py @@ -288,7 +288,7 @@ def test_edit_ballot_position_permissions(self): def test_iesg_ballot_no_irsg_actions(self): ad = Person.objects.get(user__username="ad") - wg_draft = IndividualDraftFactory(ad=ad) + wg_draft = IndividualDraftFactory(ad=ad, stream_id='ietf') irsgmember = get_active_irsg()[0] url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=wg_draft.name)) @@ -355,28 +355,35 @@ def test_issue_ballot(self): def test_take_and_email_position(self): draft = RgDraftFactory() ballot = IRSGBallotDocEventFactory(doc=draft) - url = urlreverse('ietf.doc.views_ballot.edit_position', kwargs=dict(name=draft.name, ballot_id=ballot.pk)) + self.balloter + url = ( + urlreverse( + "ietf.doc.views_ballot.edit_position", + kwargs=dict(name=draft.name, ballot_id=ballot.pk), + ) + + self.balloter + ) empty_outbox() login_testing_unauthorized(self, self.username, url) r = self.client.get(url) self.assertEqual(r.status_code, 200) - r = self.client.post(url, dict(position='yes', comment='oib239sb', send_mail='Save and send email')) + empty_outbox() + r = self.client.post( + url, + dict( + position="yes", + comment="oib239sb", + send_mail="Save and send email", + cc_choices=["doc_authors", "doc_group_chairs", "doc_group_mail_list"], + ), + ) self.assertEqual(r.status_code, 302) e = draft.latest_event(BallotPositionDocEvent) - self.assertEqual(e.pos.slug,'yes') - self.assertEqual(e.comment, 'oib239sb') - - url = urlreverse('ietf.doc.views_ballot.send_ballot_comment', kwargs=dict(name=draft.name, ballot_id=ballot.pk)) + self.balloter - - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - - r = self.client.post(url, dict(cc_choices=['doc_authors','doc_group_chairs','doc_group_mail_list'], body="Stuff")) - self.assertEqual(r.status_code, 302) - self.assertEqual(len(outbox),1) - self.assertNotIn('discuss-criteria', get_payload_text(outbox[0])) + self.assertEqual(e.pos.slug, "yes") + self.assertEqual(e.comment, "oib239sb") + self.assertEqual(len(outbox), 1) + self.assertNotIn("discuss-criteria", get_payload_text(outbox[0])) def test_close_ballot(self): draft = RgDraftFactory() @@ -482,27 +489,31 @@ def test_cant_take_position_on_iesg_ballot(self): def test_take_and_email_position(self): draft = RgDraftFactory() ballot = IRSGBallotDocEventFactory(doc=draft) - url = urlreverse('ietf.doc.views_ballot.edit_position', kwargs=dict(name=draft.name, ballot_id=ballot.pk)) + url = urlreverse( + "ietf.doc.views_ballot.edit_position", + kwargs=dict(name=draft.name, ballot_id=ballot.pk), + ) empty_outbox() login_testing_unauthorized(self, self.username, url) r = self.client.get(url) self.assertEqual(r.status_code, 200) - r = self.client.post(url, dict(position='yes', comment='oib239sb', send_mail='Save and send email')) + r = self.client.post( + url, + dict( + position="yes", + comment="oib239sb", + send_mail="Save and send email", + cc_choices=["doc_authors", "doc_group_chairs", "doc_group_mail_list"], + ), + ) self.assertEqual(r.status_code, 302) e = draft.latest_event(BallotPositionDocEvent) - self.assertEqual(e.pos.slug,'yes') - self.assertEqual(e.comment, 'oib239sb') - - url = urlreverse('ietf.doc.views_ballot.send_ballot_comment', kwargs=dict(name=draft.name, ballot_id=ballot.pk)) - - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - - r = self.client.post(url, dict(cc_choices=['doc_authors','doc_group_chairs','doc_group_mail_list'], body="Stuff")) + self.assertEqual(e.pos.slug, "yes") + self.assertEqual(e.comment, "oib239sb") self.assertEqual(r.status_code, 302) - self.assertEqual(len(outbox),1) + self.assertEqual(len(outbox), 1) class IESGMemberTests(TestCase): diff --git a/ietf/doc/tests_js.py b/ietf/doc/tests_js.py index 02daaae9048..9a5aad13b9c 100644 --- a/ietf/doc/tests_js.py +++ b/ietf/doc/tests_js.py @@ -41,7 +41,7 @@ def _fill_in_author_form(form_elt, name, email, affiliation, country): (By.CSS_SELECTOR, result_selector), name )) - input.send_keys('\n') # select the object + self.driver.find_element(By.CSS_SELECTOR, result_selector).click() # After the author is selected, the email select options will be populated. # Wait for that, then click on the option corresponding to the requested email. @@ -92,12 +92,8 @@ def _read_author_form(form_elt): self.assertEqual(len(author_forms), 1) # get the "add author" button so we can add blank author forms - add_author_button = self.driver.find_element(By.ID, 'add-author-button') for index, auth in enumerate(authors): - self.driver.execute_script("arguments[0].scrollIntoView();", add_author_button) # FIXME: no idea why this fails: - # self.scroll_to_element(add_author_button) # Can only click if it's in view! - self.driver.execute_script("arguments[0].click();", add_author_button) # FIXME: no idea why this fails: - # add_author_button.click() # Create a new form. Automatically scrolls to it. + self.scroll_and_click((By.ID, 'add-author-button')) # Create new form. Automatically scrolls to it. author_forms = authors_list.find_elements(By.CLASS_NAME, 'author-panel') authors_added = index + 1 self.assertEqual(len(author_forms), authors_added + 1) # Started with 1 author, hence +1 @@ -118,10 +114,9 @@ def _read_author_form(form_elt): # Must provide a "basis" (change reason) self.driver.find_element(By.ID, 'id_basis').send_keys('change testing') # Now click the 'submit' button and check that the update was accepted. - submit_button = self.driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]') - self.driver.execute_script("arguments[0].click();", submit_button) # FIXME: no idea why this fails: - # self.scroll_to_element(submit_button) - # submit_button.click() + submit_button = self.driver.find_element(By.CSS_SELECTOR, '#content button[type="submit"]') + self.scroll_to_element(submit_button) + submit_button.click() # Wait for redirect to the document_main view self.wait.until( expected_conditions.url_to_be( @@ -132,4 +127,4 @@ def _read_author_form(form_elt): self.assertEqual( list(draft.documentauthor_set.values_list('person', flat=True)), [first_auth.person.pk] + [auth.pk for auth in authors] - ) \ No newline at end of file + ) diff --git a/ietf/doc/tests_material.py b/ietf/doc/tests_material.py index 05bbc2078b6..04779bdaf14 100644 --- a/ietf/doc/tests_material.py +++ b/ietf/doc/tests_material.py @@ -6,19 +6,22 @@ import shutil import io +from unittest.mock import call, patch from pathlib import Path from pyquery import PyQuery import debug # pyflakes:ignore from django.conf import settings +from django.test import override_settings from django.urls import reverse as urlreverse from django.utils import timezone -from ietf.doc.models import Document, State, DocAlias, NewRevisionDocEvent +from ietf.doc.models import Document, State, NewRevisionDocEvent +from ietf.doc.storage_utils import retrieve_str from ietf.group.factories import RoleFactory from ietf.group.models import Group -from ietf.meeting.factories import MeetingFactory, SessionFactory +from ietf.meeting.factories import MeetingFactory, SessionFactory, SessionPresentationFactory from ietf.meeting.models import Meeting, SessionPresentation, SchedulingEvent from ietf.name.models import SessionStatusName from ietf.person.models import Person @@ -26,7 +29,7 @@ class GroupMaterialTests(TestCase): - settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH'] + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH', 'FTP_DIR'] def setUp(self): super().setUp() self.materials_dir = self.tempdir("materials") @@ -35,6 +38,10 @@ def setUp(self): self.slides_dir.mkdir() self.saved_document_path_pattern = settings.DOCUMENT_PATH_PATTERN settings.DOCUMENT_PATH_PATTERN = self.materials_dir + "/{doc.type_id}/" + self.assertTrue(Path(settings.FTP_DIR).exists()) + ftp_slides_dir = Path(settings.FTP_DIR) / "slides" + if not ftp_slides_dir.exists(): + ftp_slides_dir.mkdir() self.meeting_slides_dir = Path(settings.AGENDA_PATH) / "42" / "slides" if not self.meeting_slides_dir.exists(): @@ -54,7 +61,6 @@ def create_slides(self): doc = Document.objects.create(name="slides-testteam-test-file", rev="01", type_id="slides", group=group) doc.set_state(State.objects.get(type="slides", slug="active")) doc.set_state(State.objects.get(type="reuse_policy", slug="multiple")) - DocAlias.objects.create(name=doc.name).docs.add(doc) NewRevisionDocEvent.objects.create(doc=doc,by=Person.objects.get(name="(System)"),rev='00',type='new_revision',desc='New revision available') NewRevisionDocEvent.objects.create(doc=doc,by=Person.objects.get(name="(System)"),rev='01',type='new_revision',desc='New revision available') @@ -111,8 +117,16 @@ def test_upload_slides(self): self.assertEqual(doc.title, "Test File - with fancy title") self.assertEqual(doc.get_state_slug(), "active") - with io.open(os.path.join(self.materials_dir, "slides", doc.name + "-" + doc.rev + ".pdf")) as f: + basename=f"{doc.name}-{doc.rev}.pdf" + filepath=Path(self.materials_dir) / "slides" / basename + with filepath.open() as f: self.assertEqual(f.read(), content) + ftp_filepath=Path(settings.FTP_DIR) / "slides" / basename + with ftp_filepath.open() as f: + self.assertEqual(f.read(), content) + # This test is very sloppy wrt the actual file content. + # Working with/around that for the moment. + self.assertEqual(retrieve_str("slides", basename), content) # check that posting same name is prevented test_file.seek(0) @@ -136,19 +150,47 @@ def test_change_state(self): doc = Document.objects.get(name=doc.name) self.assertEqual(doc.get_state_slug(), "deleted") - def test_edit_title(self): + @override_settings(MEETECHO_API_CONFIG="fake settings") + @patch("ietf.doc.views_material.SlidesManager") + def test_edit_title(self, mock_slides_manager_cls): doc = self.create_slides() url = urlreverse('ietf.doc.views_material.edit_material', kwargs=dict(name=doc.name, action="title")) login_testing_unauthorized(self, "secretary", url) + self.assertFalse(mock_slides_manager_cls.called) # post r = self.client.post(url, dict(title="New title")) self.assertEqual(r.status_code, 302) doc = Document.objects.get(name=doc.name) self.assertEqual(doc.title, "New title") + self.assertFalse(mock_slides_manager_cls.return_value.send_update.called) + + # assign to a session to see that it now sends updates to Meetecho + session = SessionPresentationFactory(session__group=doc.group, document=doc).session + + # Grab the title on the slides when the API call was made (to be sure it's not before it was updated) + titles_sent = [] + mock_slides_manager_cls.return_value.send_update.side_effect = lambda sess: titles_sent.extend( + list(sess.presentations.values_list("document__title", flat=True)) + ) + + r = self.client.post(url, dict(title="Newer title")) + self.assertEqual(r.status_code, 302) + doc = Document.objects.get(name=doc.name) + self.assertEqual(doc.title, "Newer title") + self.assertTrue(mock_slides_manager_cls.called) + self.assertEqual(mock_slides_manager_cls.call_args, call(api_config="fake settings")) + self.assertEqual(mock_slides_manager_cls.return_value.send_update.call_count, 1) + self.assertEqual( + mock_slides_manager_cls.return_value.send_update.call_args, + call(session), + ) + self.assertEqual(titles_sent, ["Newer title"]) - def test_revise(self): + @override_settings(MEETECHO_API_CONFIG="fake settings") + @patch("ietf.doc.views_material.SlidesManager") + def test_revise(self, mock_slides_manager_cls): doc = self.create_slides() session = SessionFactory( @@ -166,11 +208,18 @@ def test_revise(self): url = urlreverse('ietf.doc.views_material.edit_material', kwargs=dict(name=doc.name, action="revise")) login_testing_unauthorized(self, "secretary", url) + self.assertFalse(mock_slides_manager_cls.called) content = "some text" test_file = io.StringIO(content) test_file.name = "unnamed.txt" + # Grab the title on the slides when the API call was made (to be sure it's not before it was updated) + titles_sent = [] + mock_slides_manager_cls.return_value.send_update.side_effect = lambda sess: titles_sent.extend( + list(sess.presentations.values_list("document__title", flat=True)) + ) + # post r = self.client.post(url, dict(title="New title", abstract="New abstract", @@ -181,7 +230,17 @@ def test_revise(self): self.assertEqual(doc.rev, "02") self.assertEqual(doc.title, "New title") self.assertEqual(doc.get_state_slug(), "active") + self.assertTrue(mock_slides_manager_cls.called) + self.assertEqual(mock_slides_manager_cls.call_args, call(api_config="fake settings")) + self.assertEqual(mock_slides_manager_cls.return_value.send_update.call_count, 1) + self.assertEqual( + mock_slides_manager_cls.return_value.send_update.call_args, + call(session), + ) + self.assertEqual(titles_sent, ["New title"]) with io.open(os.path.join(doc.get_file_path(), doc.name + "-" + doc.rev + ".txt")) as f: self.assertEqual(f.read(), content) + self.assertEqual(retrieve_str("slides", f"{doc.name}-{doc.rev}.txt"), content) + diff --git a/ietf/doc/tests_models.py b/ietf/doc/tests_models.py new file mode 100644 index 00000000000..d835f646fb6 --- /dev/null +++ b/ietf/doc/tests_models.py @@ -0,0 +1,113 @@ +# Copyright The IETF Trust 2016-2023, All Rights Reserved +# -*- coding: utf-8 -*- + +import itertools + +from ietf.doc.factories import WgRfcFactory +from ietf.doc.models import RelatedDocument +from ietf.utils.test_utils import TestCase + + +class RelatedDocumentTests(TestCase): + def test_is_downref(self): + rfcs = [ + WgRfcFactory(std_level_id=lvl) + for lvl in ["inf", "exp", "bcp", "ps", "ds", "std", "unkn"] + ] + + result_matrix = { + # source + "inf": { + "inf": None, # target + "exp": None, # target + "bcp": None, # target + "ps": None, # target + "ds": None, # target + "std": None, # target + "unkn": None, # target + }, + # source + "exp": { + "inf": None, # target + "exp": None, # target + "bcp": None, # target + "ps": None, # target + "ds": None, # target + "std": None, # target + "unkn": None, # target + }, + # source + "bcp": { + "inf": "Downref", # target + "exp": "Downref", # target + "bcp": None, # target + "ps": None, # target + "ds": None, # target + "std": None, # target + "unkn": "Possible Downref", # target + }, + # source + "ps": { + "inf": "Downref", # target + "exp": "Downref", # target + "bcp": None, # target + "ps": None, # target + "ds": None, # target + "std": None, # target + "unkn": "Possible Downref", # target + }, + # source + "ds": { + "inf": "Downref", # target + "exp": "Downref", # target + "bcp": None, # target + "ps": "Downref", # target + "ds": None, # target + "std": None, # target + "unkn": "Possible Downref", # target + }, + # source + "std": { + "inf": "Downref", # target + "exp": "Downref", # target + "bcp": None, # target + "ps": "Downref", # target + "ds": "Downref", # target + "std": None, # target + "unkn": "Possible Downref", # target + }, + # source + "unkn": { + "inf": None, # target + "exp": None, # target + "bcp": None, # target + "ps": "Possible Downref", # target + "ds": "Possible Downref", # target + "std": None, # target + "unkn": "Possible Downref", # target + }, + } + + for rel in ["refnorm", "refinfo", "refunk", "refold"]: + for source, target in itertools.product(rfcs, rfcs): + ref = RelatedDocument.objects.create( + source=source, + target=target, + relationship_id=rel, + ) + + result = ref.is_downref() + + desired_result = ( + result_matrix[source.std_level_id][target.std_level_id] + if ref.relationship.slug in ["refnorm", "refunk"] + else None + ) + if ( + ref.relationship.slug == "refunk" + and desired_result is not None + and not desired_result.startswith("Possible") + ): + desired_result = f"Possible {desired_result}" + + self.assertEqual(desired_result, result) diff --git a/ietf/doc/tests_review.py b/ietf/doc/tests_review.py index 1f84303a91f..8c1fc99ffe2 100644 --- a/ietf/doc/tests_review.py +++ b/ietf/doc/tests_review.py @@ -1,13 +1,14 @@ -# Copyright The IETF Trust 2016-2020, All Rights Reserved +# Copyright The IETF Trust 2016-2023, All Rights Reserved # -*- coding: utf-8 -*- -import datetime, os, shutil +from pathlib import Path +import datetime import io -import tarfile, tempfile, mailbox -import email.mime.multipart, email.mime.text, email.utils +import os +import shutil -from mock import patch +from unittest.mock import patch, Mock from requests import Response from django.apps import apps @@ -19,11 +20,12 @@ import debug # pyflakes:ignore +from ietf.doc.storage_utils import retrieve_str import ietf.review.mailarch from ietf.doc.factories import ( NewRevisionDocEventFactory, IndividualDraftFactory, WgDraftFactory, WgRfcFactory, ReviewFactory, DocumentFactory) -from ietf.doc.models import ( Document, DocumentAuthor, RelatedDocument, DocEvent, ReviewRequestDocEvent, +from ietf.doc.models import ( DocumentAuthor, RelatedDocument, DocEvent, ReviewRequestDocEvent, ReviewAssignmentDocEvent, ) from ietf.group.factories import RoleFactory, ReviewTeamFactory from ietf.group.models import Group @@ -47,6 +49,7 @@ def setUp(self): self.review_dir = self.tempdir('review') self.old_document_path_pattern = settings.DOCUMENT_PATH_PATTERN settings.DOCUMENT_PATH_PATTERN = self.review_dir + "/{doc.type_id}/" + (Path(settings.FTP_DIR) / "review").mkdir() self.review_subdir = os.path.join(self.review_dir, "review") if not os.path.exists(self.review_subdir): @@ -57,6 +60,17 @@ def tearDown(self): settings.DOCUMENT_PATH_PATTERN = self.old_document_path_pattern super().tearDown() + def verify_review_files_were_written(self, assignment, expected_content = "This is a review\nwith two lines"): + review_file = Path(self.review_subdir) / f"{assignment.review.name}.txt" + content = review_file.read_text() + self.assertEqual(content, expected_content) + self.assertEqual( + retrieve_str("review", review_file.name), + expected_content + ) + review_ftp_file = Path(settings.FTP_DIR) / "review" / review_file.name + self.assertTrue(review_file.samefile(review_ftp_file)) + def test_request_review(self): doc = WgDraftFactory(group__acronym='mars',rev='01') NewRevisionDocEventFactory(doc=doc,rev='01') @@ -137,10 +151,18 @@ def test_request_review_of_rfc(self): url = urlreverse('ietf.doc.views_review.request_review', kwargs={ "name": doc.name }) login_testing_unauthorized(self, "ad", url) - # get should fail + # get should fail - all non draft types 404 + r = self.client.get(url) + self.assertEqual(r.status_code, 404) + + # Can only request reviews on active draft documents + doc = WgDraftFactory(states=[("draft","rfc")]) + url = urlreverse('ietf.doc.views_review.request_review', kwargs={ "name": doc.name }) r = self.client.get(url) self.assertEqual(r.status_code, 403) + + def test_doc_page(self): doc = WgDraftFactory(group__acronym='mars',rev='01') @@ -153,8 +175,8 @@ def test_doc_page(self): # check we can fish it out old_doc = WgDraftFactory(name="draft-foo-mars-test") older_doc = WgDraftFactory(name="draft-older") - RelatedDocument.objects.create(source=old_doc, target=older_doc.docalias.first(), relationship_id='replaces') - RelatedDocument.objects.create(source=doc, target=old_doc.docalias.first(), relationship_id='replaces') + RelatedDocument.objects.create(source=old_doc, target=older_doc, relationship_id='replaces') + RelatedDocument.objects.create(source=doc, target=old_doc, relationship_id='replaces') review_req.doc = older_doc review_req.save() @@ -355,6 +377,42 @@ def test_assign_reviewer(self): request_events = review_req.reviewrequestdocevent_set.all() self.assertEqual(request_events.count(), 0) + def test_assign_reviewer_after_reject(self): + doc = WgDraftFactory() + review_team = ReviewTeamFactory() + rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') + reviewer_email = Email.objects.get(person__user__username="reviewer") + RoleFactory(group=review_team,person__user__username='reviewsecretary',name_id='secr') + review_req = ReviewRequestFactory(team=review_team,doc=doc) + ReviewAssignmentFactory(review_request=review_req, state_id='rejected', reviewer=rev_role.person.email_set.first()) + + url = urlreverse('ietf.doc.views_review.assign_reviewer', kwargs={ "name": doc.name, "request_id": review_req.pk }) + login_testing_unauthorized(self, "reviewsecretary", url) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + reviewer_label = q("option[value=\"{}\"]".format(reviewer_email.address)).text().lower() + self.assertIn("rejected review of document before", reviewer_label) + + def test_assign_reviewer_after_withdraw(self): + doc = WgDraftFactory() + review_team = ReviewTeamFactory() + rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') + RoleFactory(group=review_team,person__user__username='reviewsecretary',name_id='secr') + review_req = ReviewRequestFactory(team=review_team,doc=doc) + reviewer = rev_role.person.email_set.first() + ReviewAssignmentFactory(review_request=review_req, state_id='withdrawn', reviewer=reviewer) + req_url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk }) + assign_url = urlreverse('ietf.doc.views_review.assign_reviewer', kwargs={ "name": doc.name, "request_id": review_req.pk }) + + login_testing_unauthorized(self, "reviewsecretary", assign_url) + r = self.client.post(assign_url, { "action": "assign", "reviewer": reviewer.pk }) + self.assertRedirects(r, req_url) + review_req = reload_db_objects(review_req) + assignment = review_req.reviewassignment_set.last() + self.assertEqual(assignment.state, ReviewAssignmentStateName.objects.get(slug='assigned')) + self.assertEqual(review_req.state, ReviewRequestStateName.objects.get(slug='assigned')) + def test_previously_reviewed_replaced_doc(self): review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',person__name='Some Reviewer',name_id='reviewer') @@ -418,9 +476,50 @@ def test_reject_reviewer_assignment(self): r = self.client.get(req_url) self.assertEqual(r.status_code, 200) self.assertContains(r, reject_url) + + # anonymous user should not be able to reject + self.client.logout() + r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" }) + self.assertEqual(r.status_code, 302) # forwards to login page + assignment = reload_db_objects(assignment) + self.assertEqual(assignment.state_id, "accepted") + + # unrelated person should not be able to reject + other_person = PersonFactory() + login_testing_unauthorized(self, other_person.user.username, reject_url) + r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" }) + self.assertEqual(r.status_code, 403) + assignment = reload_db_objects(assignment) + self.assertEqual(assignment.state_id, "accepted") + + # Check that user can reject it + login_testing_unauthorized(self, assignment.reviewer.person.user.username, reject_url) + r = self.client.get(reject_url) + self.assertEqual(r.status_code, 200) + self.assertContains(r, escape(assignment.reviewer.person.name)) + self.assertNotContains(r, 'can not be rejected') + self.assertContains(r, ' -
  • -
  • - - + {% bootstrap_form form %} +
    + + + +
    diff --git a/ietf/secr/templates/announcement/index.html b/ietf/secr/templates/announcement/index.html new file mode 100644 index 00000000000..ad7226e3bc1 --- /dev/null +++ b/ietf/secr/templates/announcement/index.html @@ -0,0 +1,31 @@ +{# Copyright The IETF Trust 2024, All Rights Reserved #} +{% extends "base.html" %} +{% load static %} +{% load ietf_filters %} +{% load django_bootstrap5 %} +{% block title %}Announcement{% endblock %} +{% block content %} +

    Announcement

    + {% if form.non_field_errors %}
    {{ form.non_field_errors }}
    {% endif %} + +
    + {% csrf_token %} + {% bootstrap_field form.nomcom layout='horizontal' %} + {% bootstrap_field form.to layout='horizontal' %} + {% bootstrap_field form.to_custom layout='horizontal' %} + {% bootstrap_field form.frm layout='horizontal' %} + {% bootstrap_field form.cc layout='horizontal' %} + {% bootstrap_field form.bcc layout='horizontal' %} + {% bootstrap_field form.reply_to layout='horizontal' %} + {% bootstrap_field form.subject layout='horizontal' %} + {% bootstrap_field form.body layout='horizontal' %} + + + Cancel +
    + +{% endblock %} +{% block js %} + +{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/announcement/main.html b/ietf/secr/templates/announcement/main.html deleted file mode 100644 index c88b4a2406c..00000000000 --- a/ietf/secr/templates/announcement/main.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends "base_site.html" %} - -{% block title %}Announcement{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Announcement -{% endblock %} - -{% block content %} - -
    -

    Announcement

    - -
    {% csrf_token %} - - - {% if form.non_field_errors %}{{ form.non_field_errors }}{% endif %} - {% for field in form.visible_fields %} - - - - - {% endfor %} - -
    {{ field.label_tag }}{% if field.field.required %} *{% endif %}{{ field.errors }}{{ field }}{% if field.help_text %}
    {{ field.help_text }}{% endif %}
    -
    -
      -
    • -
    • -
    -
    - -
    -
    - -{% endblock %} diff --git a/ietf/secr/templates/areas/list.html b/ietf/secr/templates/areas/list.html deleted file mode 100644 index a0ed1ae4a37..00000000000 --- a/ietf/secr/templates/areas/list.html +++ /dev/null @@ -1,42 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} -{% block title %}Areas{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Areas -{% endblock %} - -{% block content %} - -
    -

    Areas

    - - - - - - - - - - {% for item in results %} - - - - - - {% endfor %} - -
    NameAcronymStatus
    {{ item.name }}{{ item.acronym }}{{ item.state }}
    - -
    -
      -
    -
    -
    - -{% endblock %} diff --git a/ietf/secr/templates/areas/people.html b/ietf/secr/templates/areas/people.html deleted file mode 100644 index e84dc1a7988..00000000000 --- a/ietf/secr/templates/areas/people.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} -{% block title %}Areas - People{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Areas - » {{ area.acronym }} - » People -{% endblock %} - -{% block content %} - -
    -

    Area Directors ({{ area.acronym }})

    - - {% for director in directors %} - {% csrf_token %} - - - - - {% endif %} - - - - {% endfor %} -
    {{ director.person.name }}{% if director.name.slug == "ad" %} - Voting Enabled - {% else %} -
    - - - -
    -
      -
    • -
    -
    -
    - -{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/areas/view.html b/ietf/secr/templates/areas/view.html deleted file mode 100644 index e3ecac70a1f..00000000000 --- a/ietf/secr/templates/areas/view.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} -{% block title %}Areas - View{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Areas - » {{ area.acronym }} -{% endblock %} - -{% block content %} - -
    -

    Area - View

    - - - - - - - - - - -
    Area Acronym:{{ area.acronym }}
    Area Name:{{ area.name }}
    Status:{{ area.state }}
    Start Date:{{ area.start_date|date:"Y-m-d" }}
    Concluded Date:{{ area.concluded_date|date:"Y-m-d" }}
    Last Modified Date:{{ area.time|date:"Y-m-d" }}
    Comments:{{ area.comments}}
    - - - -
    -
      - -
    • -
    • -
    -
    -
    - -{% endblock %} diff --git a/ietf/secr/templates/base_secr.html b/ietf/secr/templates/base_secr.html index 47b893f0439..18d77e47bae 100644 --- a/ietf/secr/templates/base_secr.html +++ b/ietf/secr/templates/base_secr.html @@ -1,5 +1,5 @@ -{% load staticfiles %} +{% load static %} diff --git a/ietf/secr/templates/base_secr_bootstrap.html b/ietf/secr/templates/base_secr_bootstrap.html index 2eee566a121..a326346847b 100644 --- a/ietf/secr/templates/base_secr_bootstrap.html +++ b/ietf/secr/templates/base_secr_bootstrap.html @@ -1,5 +1,5 @@ -{% load staticfiles %} +{% load static %} diff --git a/ietf/secr/templates/base_site.html b/ietf/secr/templates/base_site.html index d369a40ec17..5e3ddc62d86 100644 --- a/ietf/secr/templates/base_site.html +++ b/ietf/secr/templates/base_site.html @@ -1,7 +1,7 @@ {% extends "base_secr.html" %} {% load i18n %} {% load ietf_filters %} -{% load staticfiles %} +{% load static %} {% block title %}{{ title }}{% if user|has_role:"Secretariat" %} Secretariat Dashboard {% else %} IETF Dashboard {% endif %}{% endblock %} diff --git a/ietf/secr/templates/base_site_bootstrap.html b/ietf/secr/templates/base_site_bootstrap.html index c1c2fdac6b7..1653b26b856 100644 --- a/ietf/secr/templates/base_site_bootstrap.html +++ b/ietf/secr/templates/base_site_bootstrap.html @@ -1,7 +1,7 @@ {% extends "base_secr_bootstrap.html" %} {% load i18n %} {% load ietf_filters %} -{% load staticfiles %} +{% load static %} {% block title %}{{ title }}{% if user|has_role:"Secretariat" %} Secretariat Dashboard {% else %} WG Chair Dashboard {% endif %}{% endblock %} diff --git a/ietf/secr/templates/confirm_cancel.html b/ietf/secr/templates/confirm_cancel.html index 6bae631a7ec..541c82863fb 100644 --- a/ietf/secr/templates/confirm_cancel.html +++ b/ietf/secr/templates/confirm_cancel.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Confirm Cancel{% endblock %} diff --git a/ietf/secr/templates/confirm_delete.html b/ietf/secr/templates/confirm_delete.html index ccfc7b1c2fc..3f8fd19c8fa 100644 --- a/ietf/secr/templates/confirm_delete.html +++ b/ietf/secr/templates/confirm_delete.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Confirm Delete{% endblock %} diff --git a/ietf/secr/templates/console/main.html b/ietf/secr/templates/console/main.html deleted file mode 100644 index 5aadefc558a..00000000000 --- a/ietf/secr/templates/console/main.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "base_site.html" %} - -{% block title %}Console{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Console -{% endblock %} - -{% block content %} - -
    -

    Console

    - - - - - -
    Latest DocEvent{{ latest_docevent }}
    - -
    - -{% endblock %} diff --git a/ietf/secr/templates/includes/activities.html b/ietf/secr/templates/includes/activities.html deleted file mode 100644 index 3e79c9aed48..00000000000 --- a/ietf/secr/templates/includes/activities.html +++ /dev/null @@ -1,23 +0,0 @@ -

    Activies Log

    - diff --git a/ietf/secr/templates/includes/buttons_next_cancel.html b/ietf/secr/templates/includes/buttons_next_cancel.html deleted file mode 100644 index 95d25f55bcc..00000000000 --- a/ietf/secr/templates/includes/buttons_next_cancel.html +++ /dev/null @@ -1,6 +0,0 @@ -
    -
      -
    • -
    • -
    -
    diff --git a/ietf/secr/templates/includes/buttons_submit_cancel.html b/ietf/secr/templates/includes/buttons_submit_cancel.html deleted file mode 100644 index df40c982559..00000000000 --- a/ietf/secr/templates/includes/buttons_submit_cancel.html +++ /dev/null @@ -1,6 +0,0 @@ -
    -
      -
    • -
    • -
    -
    diff --git a/ietf/secr/templates/includes/sessions_footer.html b/ietf/secr/templates/includes/sessions_footer.html deleted file mode 100755 index 2a26440047f..00000000000 --- a/ietf/secr/templates/includes/sessions_footer.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/ietf/secr/templates/includes/sessions_request_form.html b/ietf/secr/templates/includes/sessions_request_form.html deleted file mode 100755 index cd36fe45f1d..00000000000 --- a/ietf/secr/templates/includes/sessions_request_form.html +++ /dev/null @@ -1,139 +0,0 @@ -* Required Field -
    {% csrf_token %} - {{ form.session_forms.management_form }} - {% if form.non_field_errors %} - {{ form.non_field_errors }} - {% endif %} - - - - - - {% if group.features.acts_like_wg %} - - {% if not is_virtual %} - - {% endif %} - - {% else %}{# else not group.features.acts_like_wg #} - {% for session_form in form.session_forms %} - - {% endfor %} - {% endif %} - - - - - - - - - - {% if not is_virtual %} - - - - - - - - - - - - - - - - - - - - - - - {% endif %} - - - - - - {% if form.notifications_optional %} - - - - - {% endif %} - -
    Working Group Name:{{ group.name }} ({{ group.acronym }})
    Area Name:{% if group.parent %}{{ group.parent.name }} ({{ group.parent.acronym }}){% endif %}
    Number of Sessions:*{{ form.num_session.errors }}{{ form.num_session }}
    Session 1:*{% include 'meeting/session_details_form.html' with form=form.session_forms.0 hide_onsite_tool_prompt=True only %}
    Session 2:*{% include 'meeting/session_details_form.html' with form=form.session_forms.1 hide_onsite_tool_prompt=True only %}
    Time between two sessions:{{ form.session_time_relation.errors }}{{ form.session_time_relation }}
    Additional Session Request:{{ form.third_session }} Check this box to request an additional session.
    - Additional slot may be available after agenda scheduling has closed and with the approval of an Area Director.
    -
    - Third Session: - {% include 'meeting/session_details_form.html' with form=form.session_forms.2 hide_onsite_tool_prompt=True only %} -
    -
    Session {{ forloop.counter }}:*{% include 'meeting/session_details_form.html' with form=session_form only %}
    Number of Attendees:{% if not is_virtual %}*{% endif %}{{ form.attendees.errors }}{{ form.attendees }}
    Participants who must be present: - {{ form.bethere.errors }} - {{ form.bethere }} -

    - Do not include Area Directors and WG Chairs; the system already tracks their availability. -

    -
    Conflicts to Avoid: - - - - - - - {% for cname, cfield, cselector in form.wg_constraint_fields %} - - {% if forloop.first %}{% endif %} - - - - {% empty %}{# shown if there are no constraint fields #} - - {% endfor %} - {% if form.inactive_wg_constraints %} - {% for cname, value, field in form.inactive_wg_constraints %} - - {% if forloop.first %} - - {% endif %} - - - - {% endfor %} - {% endif %} - - - - - -
    Other WGs that included {{ group.name }} in their conflict lists:{{ session_conflicts.inbound|default:"None" }}
    WG Sessions:
    You may select multiple WGs within each category
    {{ cname|title }}{{ cselector }} -
    - {{ cfield.errors }}{{ cfield }} -
    No constraints are enabled for this meeting.
    - Disabled for this meeting - {{ cname|title }}
    {{ field }} {{ field.label }}
    BOF Sessions:If the sessions can not be found in the fields above, please enter free form requests in the Special Requests field below.
    -
    Resources requested: - {{ form.resources.errors }} {{ form.resources }} -
    Times during which this WG can not meet:
    Please explain any selections in Special Requests below.
    {{ form.timeranges.errors }}{{ form.timeranges }}
    - Plan session adjacent with another WG:
    - (Immediately before or after another WG, no break in between, in the same room.) -
    {{ form.adjacent_with_wg.errors }}{{ form.adjacent_with_wg }}
    - Joint session with:
    - (To request one session for multiple WGs together.) -
    {{ form.joint_with_groups_selector }} -
    - {{ form.joint_with_groups.errors }}{{ form.joint_with_groups }} -
    - Of the sessions requested by this WG, the joint session, if applicable, is: - {{ form.joint_for_session.errors }}{{ form.joint_for_session }}
    Special Requests:
     
    i.e. restrictions on meeting times / days, etc.
    (limit 200 characters)
    {{ form.comments.errors }}{{ form.comments }}
    {{ form.send_notifications.label }}{{ form.send_notifications.errors }}{{ form.send_notifications }}
    - -
    -
      -
    • -
    • -
    -
    -
    \ No newline at end of file diff --git a/ietf/secr/templates/includes/sessions_request_view.html b/ietf/secr/templates/includes/sessions_request_view.html deleted file mode 100644 index bc6aef06116..00000000000 --- a/ietf/secr/templates/includes/sessions_request_view.html +++ /dev/null @@ -1,73 +0,0 @@ -{% load ams_filters %} - - - - - - {% if form %} - {% include 'includes/sessions_request_view_formset.html' with formset=form.session_forms group=group session=session only %} - {% else %} - {% include 'includes/sessions_request_view_session_set.html' with session_set=sessions group=group session=session only %} - {% endif %} - - - - - - - - - - {% if not is_virtual %} - - - - - {% endif %} - - - - - - - - - {% if not is_virtual %} - - - - - - - - - {% endif %} - - {% if form and form.notifications_optional %} - - - - - {% endif %} - -
    Working Group Name:{{ group.name }} ({{ group.acronym }})
    Area Name:{{ group.parent }}
    Number of Sessions Requested:{% if session.third_session %}3{% else %}{{ session.num_session }}{% endif %}
    Number of Attendees:{{ session.attendees }}
    Conflicts to Avoid: - {% if session_conflicts.outbound %} - - - {% for conflict in session_conflicts.outbound %} - - {% endfor %} - -
    {{ conflict.name|title }}: {{ conflict.groups }}
    - {% else %}None{% endif %} -
    Other WGs that included {{ group }} in their conflict list:{% if session_conflicts.inbound %}{{ session_conflicts.inbound }}{% else %}None so far{% endif %}
    Resources requested:{% if session.resources %}
      {% for resource in session.resources %}
    • {{ resource.desc }}
    • {% endfor %}
    {% else %}None so far{% endif %}
    Participants who must be present:{% if session.bethere %}
      {% for person in session.bethere %}
    • {{ person }}
    • {% endfor %}
    {% else %}None{% endif %}
    Can not meet on:{% if session.timeranges_display %}{{ session.timeranges_display|join:', ' }}{% else %}No constraints{% endif %}
    Adjacent with WG:{{ session.adjacent_with_wg|default:'No preference' }}
    Joint session: - {% if session.joint_with_groups %} - {{ session.joint_for_session_display }} with: {{ session.joint_with_groups }} - {% else %} - Not a joint session - {% endif %} -
    Special Requests:{{ session.comments }}
    - {{ form.send_notifications.label}} - - {% if form.cleaned_data.send_notifications %}Yes{% else %}No{% endif %} -
    \ No newline at end of file diff --git a/ietf/secr/templates/includes/sessions_request_view_formset.html b/ietf/secr/templates/includes/sessions_request_view_formset.html deleted file mode 100644 index 80cad8d829e..00000000000 --- a/ietf/secr/templates/includes/sessions_request_view_formset.html +++ /dev/null @@ -1,32 +0,0 @@ -{% load ams_filters %}{# keep this in sync with sessions_request_view_session_set.html #} -{% for sess_form in formset %}{% if sess_form.cleaned_data and not sess_form.cleaned_data.DELETE %} - - Session {{ forloop.counter }}: - -
    -
    Length
    -
    {{ sess_form.cleaned_data.requested_duration.total_seconds|display_duration }}
    - {% if sess_form.cleaned_data.name %} -
    Name
    -
    {{ sess_form.cleaned_data.name }}
    {% endif %} - {% if sess_form.cleaned_data.purpose.slug != 'regular' %} -
    Purpose
    -
    - {{ sess_form.cleaned_data.purpose }} - {% if sess_form.cleaned_data.purpose.timeslot_types|length > 1 %}({{ sess_form.cleaned_data.type }} - ){% endif %} -
    -
    Onsite tool?
    -
    {{ sess_form.cleaned_data.has_onsite_tool|yesno }}
    - {% endif %} -
    - - - {% if group.features.acts_like_wg and forloop.counter == 2 and not is_virtual %} - - Time between sessions: - {% if session.session_time_relation_display %}{{ session.session_time_relation_display }}{% else %}No - preference{% endif %} - - {% endif %} -{% endif %}{% endfor %} \ No newline at end of file diff --git a/ietf/secr/templates/includes/sessions_request_view_session_set.html b/ietf/secr/templates/includes/sessions_request_view_session_set.html deleted file mode 100644 index a434b9d22b5..00000000000 --- a/ietf/secr/templates/includes/sessions_request_view_session_set.html +++ /dev/null @@ -1,32 +0,0 @@ -{% load ams_filters %}{# keep this in sync with sessions_request_view_formset.html #} -{% for sess in session_set %} - - Session {{ forloop.counter }}: - -
    -
    Length
    -
    {{ sess.requested_duration.total_seconds|display_duration }}
    - {% if sess.name %} -
    Name
    -
    {{ sess.name }}
    {% endif %} - {% if sess.purpose.slug != 'regular' %} -
    Purpose
    -
    - {{ sess.purpose }} - {% if sess.purpose.timeslot_types|length > 1 %}({{ sess.type }} - ){% endif %} -
    -
    Onsite tool?
    -
    {{ sess.has_onsite_tool|yesno }}
    - {% endif %} -
    - - - {% if group.features.acts_like_wg and forloop.counter == 2 and not is_virtual %} - - Time between sessions: - {% if session.session_time_relation_display %}{{ session.session_time_relation_display }}{% else %}No - preference{% endif %} - - {% endif %} -{% endfor %} \ No newline at end of file diff --git a/ietf/secr/templates/index.html b/ietf/secr/templates/index.html new file mode 100644 index 00000000000..9ea70212793 --- /dev/null +++ b/ietf/secr/templates/index.html @@ -0,0 +1,31 @@ +{# Copyright The IETF Trust 2007-2025, All Rights Reserved #} +{% extends "base.html" %} +{% load static %} +{% load ietf_filters %} +{% block title %}Secretariat Dashboard{% endblock %} +{% block content %} +

    Secretariat Dashboard

    +
    + {% if user|has_role:"Secretariat" %} +

    IESG

    + + +

    IDs and WGs Process

    + + +

    Meetings and Proceedings

    + + {% else %} + + {% endif %} +
    +{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/main.html b/ietf/secr/templates/main.html deleted file mode 100644 index 455895c76d5..00000000000 --- a/ietf/secr/templates/main.html +++ /dev/null @@ -1,77 +0,0 @@ -{% extends "base_site.html" %} -{% load ietf_filters %} - -{% block content %} -
    - - {% if user|has_role:"Secretariat" %} - - - - - - - - - - - - - - - {% else %} - - - - - - - - - - - - - - - {% endif %} - -
    -{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/meetings/add.html b/ietf/secr/templates/meetings/add.html index 5a782552653..b2cc2617dc3 100644 --- a/ietf/secr/templates/meetings/add.html +++ b/ietf/secr/templates/meetings/add.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Meetings - Add{% endblock %} diff --git a/ietf/secr/templates/meetings/base_rooms_times.html b/ietf/secr/templates/meetings/base_rooms_times.html index f856b1f62c6..263418fabf9 100644 --- a/ietf/secr/templates/meetings/base_rooms_times.html +++ b/ietf/secr/templates/meetings/base_rooms_times.html @@ -1,5 +1,5 @@ {% extends "base_site_bootstrap.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Meetings{% endblock %} diff --git a/ietf/secr/templates/meetings/blue_sheet.html b/ietf/secr/templates/meetings/blue_sheet.html deleted file mode 100644 index d67efd9f636..00000000000 --- a/ietf/secr/templates/meetings/blue_sheet.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} - -{% block title %}Meetings - Blue Sheet{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Meetings - » {{ meeting.number }} - » Blue Sheets -{% endblock %} - -{% block content %} - -
    -

    IETF {{ meeting.number }} - Blue Sheet

    - -

    Use this to generate blue sheets for meeting sessions.

    -
      -
    • -
      {% csrf_token %} - -
      -   Last run: - {% if last_run %} - {{ last_run }} - {% else %} - Never - {% endif %} -
    • -
    -

    Use this to download the blue sheets from the server.

    -
      -
    • - -
    • -
    - -
    -

    - Use the session details page for a group to upload scanned bluesheets. The session details pages for a group can be reached from the meeting's materials page. -

    -
    - -{% endblock %} diff --git a/ietf/secr/templates/meetings/edit_meeting.html b/ietf/secr/templates/meetings/edit_meeting.html index 773536e654a..474373dbee6 100644 --- a/ietf/secr/templates/meetings/edit_meeting.html +++ b/ietf/secr/templates/meetings/edit_meeting.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Meetings - Edit{% endblock %} diff --git a/ietf/secr/templates/meetings/main.html b/ietf/secr/templates/meetings/main.html index 90c38028921..ff110dd9782 100755 --- a/ietf/secr/templates/meetings/main.html +++ b/ietf/secr/templates/meetings/main.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Meetings{% endblock %} diff --git a/ietf/secr/templates/meetings/notifications.html b/ietf/secr/templates/meetings/notifications.html index bf7099577eb..dbe66ff283e 100644 --- a/ietf/secr/templates/meetings/notifications.html +++ b/ietf/secr/templates/meetings/notifications.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Meetings{% endblock %} diff --git a/ietf/secr/templates/meetings/regular_session_edit.html b/ietf/secr/templates/meetings/regular_session_edit.html index fbfba4f967f..9993858be11 100644 --- a/ietf/secr/templates/meetings/regular_session_edit.html +++ b/ietf/secr/templates/meetings/regular_session_edit.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles tz %} +{% load static tz %} {% block title %}Meetings{% endblock %} diff --git a/ietf/secr/templates/meetings/view.html b/ietf/secr/templates/meetings/view.html index d552d38dcae..89bd8f7e03d 100644 --- a/ietf/secr/templates/meetings/view.html +++ b/ietf/secr/templates/meetings/view.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Meetings{% endblock %} @@ -37,7 +37,6 @@

    IETF {{ meeting.number }} - View

    • -
    • diff --git a/ietf/secr/templates/rolodex/add.html b/ietf/secr/templates/rolodex/add.html index 272b844fa30..5adb738f2b0 100644 --- a/ietf/secr/templates/rolodex/add.html +++ b/ietf/secr/templates/rolodex/add.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Rolodex - Add{% endblock %} diff --git a/ietf/secr/templates/rolodex/edit.html b/ietf/secr/templates/rolodex/edit.html index 28a125f1041..ed4c0f97e2e 100644 --- a/ietf/secr/templates/rolodex/edit.html +++ b/ietf/secr/templates/rolodex/edit.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Rolodex - Edit{% endblock %} diff --git a/ietf/secr/templates/rolodex/search.html b/ietf/secr/templates/rolodex/search.html index 8994cfabd17..065b0463f89 100644 --- a/ietf/secr/templates/rolodex/search.html +++ b/ietf/secr/templates/rolodex/search.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Rolodex - Search{% endblock %} diff --git a/ietf/secr/templates/rolodex/view.html b/ietf/secr/templates/rolodex/view.html index 73d1c3f58ba..d1a78cfaa54 100644 --- a/ietf/secr/templates/rolodex/view.html +++ b/ietf/secr/templates/rolodex/view.html @@ -44,7 +44,7 @@

      Roles

      {{ role.name }} {% if role.group.type.slug == "area" %} - {{ role.group.acronym }}{% if role.group.state.slug == "conclude" %} (concluded){% endif %} + {{ role.group.acronym }}{% if role.group.state.slug == "conclude" %} (concluded){% endif %} {% else %} {{ role.group.acronym }}{% if role.group.state.slug == "conclude" %} (concluded){% endif %} {% endif %} diff --git a/ietf/secr/templates/sreq/confirm.html b/ietf/secr/templates/sreq/confirm.html deleted file mode 100755 index 4215c89c309..00000000000 --- a/ietf/secr/templates/sreq/confirm.html +++ /dev/null @@ -1,57 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} - -{% block title %}Sessions - Confirm{% endblock %} - -{% block extrastyle %} - -{% endblock %} - -{% block extrahead %}{{ block.super }} - - {{ form.media }} -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Sessions - » New - » Session Request Confirmation -{% endblock %} - -{% block content %} - -
      -

      Sessions - Confirm

      - - {% include "includes/sessions_request_view.html" %} - - {% if group.features.acts_like_wg and form.session_forms.forms_to_keep|length > 2 %} -
      -

      - - Note: Your request for a third session must be approved by an area director before - being submitted to agenda@ietf.org. Click "Submit" below to email an approval - request to the area directors. - -

      -
      - {% endif %} - -
      - {% csrf_token %} - {{ form }} - {{ form.session_forms.management_form }} - {% for sf in form.session_forms %} - {% include 'meeting/session_details_form.html' with form=sf hidden=True only %} - {% endfor %} - {% include "includes/buttons_submit_cancel.html" %} -
      - -
      - -{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/sreq/edit.html b/ietf/secr/templates/sreq/edit.html deleted file mode 100755 index b0bfbc1e0c1..00000000000 --- a/ietf/secr/templates/sreq/edit.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} -{% block title %}Sessions - Edit{% endblock %} - -{% block extrahead %}{{ block.super }} - - - {{ form.media }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Sessions - » {{ group.acronym }} - » Edit -{% endblock %} - -{% block instructions %} - Instructions -{% endblock %} - -{% block content %} -
      -

      IETF {{ meeting.number }}: Edit Session Request

      - -
      -{% endblock %} - -{% block footer-extras %} - {% include "includes/sessions_footer.html" %} -{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/sreq/locked.html b/ietf/secr/templates/sreq/locked.html deleted file mode 100755 index 5f619f37cb6..00000000000 --- a/ietf/secr/templates/sreq/locked.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} - -{% block title %}Sessions{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Sessions (Locked) -{% endblock %} - -{% block content %} -

      » View list of timeslot requests

      -
      -

      Sessions - Status

      - -

      {{ message }}

      - -
      -
        -
      • -
      -
      - - -
      - -{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/sreq/main.html b/ietf/secr/templates/sreq/main.html deleted file mode 100755 index bdb33bb77d0..00000000000 --- a/ietf/secr/templates/sreq/main.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "base_site.html" %} -{% load ietf_filters %} -{% load staticfiles %} - -{% block title %}Sessions{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Sessions -{% endblock %} -{% block instructions %} - Instructions -{% endblock %} - -{% block content %} -

      » View list of timeslot requests

      -
      -

      - Sessions Request Tool: IETF {{ meeting.number }} - {% if user|has_role:"Secretariat" %} - {% if is_locked %} - Tool Status: Locked - {% else %} - Tool Status: Unlocked - {% endif %} - {% endif %} -

      - -
      - -
      - -{% endblock %} - -{% block footer-extras %} - {% include "includes/sessions_footer.html" %} -{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/sreq/new.html b/ietf/secr/templates/sreq/new.html deleted file mode 100755 index 2c6afb55767..00000000000 --- a/ietf/secr/templates/sreq/new.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} - -{% block title %}Sessions- New{% endblock %} - -{% block extrahead %}{{ block.super }} - - - {{ form.media }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Sessions - » New Session Request -{% endblock %} - -{% block instructions %} - Instructions -{% endblock %} - -{% block content %} -
      -

      IETF {{ meeting.number }}: New Session Request

      - - {% include "includes/sessions_request_form.html" %} - -
      - -{% endblock %} - -{% block footer-extras %} - {% include "includes/sessions_footer.html" %} -{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/sreq/not_meeting_notification.txt b/ietf/secr/templates/sreq/not_meeting_notification.txt deleted file mode 100644 index 1120f8480c1..00000000000 --- a/ietf/secr/templates/sreq/not_meeting_notification.txt +++ /dev/null @@ -1,7 +0,0 @@ -{% load ams_filters %} - -{{ login|smart_login }} {{ group.acronym }} working group, indicated that the {{ group.acronym }} working group does not plan to hold a session at IETF {{ meeting.number }}. - -This message was generated and sent by the IETF Meeting Session Request Tool. - - diff --git a/ietf/secr/templates/sreq/session_approval_notification.txt b/ietf/secr/templates/sreq/session_approval_notification.txt deleted file mode 100644 index 7bb63aa3fa0..00000000000 --- a/ietf/secr/templates/sreq/session_approval_notification.txt +++ /dev/null @@ -1,15 +0,0 @@ -Dear {{ group.parent }} Director(s): - -{{ header }} meeting session request has just been -submitted by {{ requester }}. -The third session requires your approval. - -To approve the session go to the session request view here: -{{ settings.IDTRACKER_BASE_URL }}{% url "ietf.secr.sreq.views.view" acronym=group.acronym %} -and click "Approve Third Session". - -Regards, - -The IETF Secretariat. - -{% include "includes/session_info.txt" %} diff --git a/ietf/secr/templates/sreq/session_cancel_notification.txt b/ietf/secr/templates/sreq/session_cancel_notification.txt deleted file mode 100644 index 3e6dd43f693..00000000000 --- a/ietf/secr/templates/sreq/session_cancel_notification.txt +++ /dev/null @@ -1,4 +0,0 @@ -{% load ams_filters %} - -A request to cancel a meeting session has just been submitted by {{ requester }}. - diff --git a/ietf/secr/templates/sreq/session_request_notification.txt b/ietf/secr/templates/sreq/session_request_notification.txt deleted file mode 100644 index a41f202447a..00000000000 --- a/ietf/secr/templates/sreq/session_request_notification.txt +++ /dev/null @@ -1,5 +0,0 @@ -{% load ams_filters %} - -{% filter wordwrap:78 %}{{ header }} meeting session request has just been submitted by {{ requester }}.{% endfilter %} - -{% include "includes/session_info.txt" %} diff --git a/ietf/secr/templates/sreq/tool_status.html b/ietf/secr/templates/sreq/tool_status.html deleted file mode 100755 index cf5131c2267..00000000000 --- a/ietf/secr/templates/sreq/tool_status.html +++ /dev/null @@ -1,42 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} - -{% block title %}Sessions{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Sessions - » Session Status -{% endblock %} - -{% block content %} - -
      -

      Sessions - Status

      -

      Enter the message that you would like displayed to the WG Chair when this tool is locked.

      -
      {% csrf_token %} - - - - {{ form.as_table }} - -
      -
      -
        - {% if is_locked %} -
      • - {% else %} -
      • - {% endif %} -
      • -
      -
      - -
      - -
      - -{% endblock %} diff --git a/ietf/secr/templates/sreq/view.html b/ietf/secr/templates/sreq/view.html deleted file mode 100644 index c7ae2d27ba7..00000000000 --- a/ietf/secr/templates/sreq/view.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} - -{% block title %}Sessions - View{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block extrastyle %} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Sessions - » {{ group.acronym }} -{% endblock %} - -{% block instructions %} - Instructions -{% endblock %} - -{% block content %} - -
      -

      Sessions - View (meeting: {{ meeting.number }})

      - - {% include "includes/sessions_request_view.html" %} - -
      - - {% include "includes/activities.html" %} - -
      -
        -
      • - {% if show_approve_button %} -
      • - {% endif %} -
      • -
      • -
      -
      -
      - -{% endblock %} - -{% block footer-extras %} - {% include "includes/sessions_footer.html" %} -{% endblock %} diff --git a/ietf/secr/templates/telechat/base_telechat.html b/ietf/secr/templates/telechat/base_telechat.html index 73d42ea71e2..1c8feaff6fd 100644 --- a/ietf/secr/templates/telechat/base_telechat.html +++ b/ietf/secr/templates/telechat/base_telechat.html @@ -1,5 +1,5 @@ {% extends "base_site.html" %} -{% load staticfiles %} +{% load static %} {% block title %}Telechat{% endblock %} diff --git a/ietf/secr/templates/telechat/doc.html b/ietf/secr/templates/telechat/doc.html index 9d37db4cb0e..6727e157f57 100644 --- a/ietf/secr/templates/telechat/doc.html +++ b/ietf/secr/templates/telechat/doc.html @@ -85,13 +85,13 @@

      Ballot Writeup

      {% if downrefs %}

      Downward References

      {% for ref in downrefs %} -

      Add {{ref.target.document.canonical_name}} - ({{ref.target.document.std_level}} - {{ref.target.document.stream.desc}}) +

      Add {{ref.target.name}} + ({{ref.target.std_level}} - {{ref.target.stream.desc}} stream) to downref registry.
      - {% if not ref.target.document.std_level %} + {% if not ref.target.std_level %} +++ Warning: The standards level has not been set yet!!!
      {% endif %} - {% if not ref.target.document.stream %} + {% if not ref.target.stream %} +++ Warning: document stream has not been set yet!!!
      {% endif %} {% endfor %}

      diff --git a/ietf/secr/templates/telechat/group.html b/ietf/secr/templates/telechat/group.html index 890c451e833..4e04f0e16e5 100644 --- a/ietf/secr/templates/telechat/group.html +++ b/ietf/secr/templates/telechat/group.html @@ -3,7 +3,7 @@ Does anyone have an objection to the creation of this working group being sent for EXTERNAL REVIEW?

      External Review APPROVED; "The Secretariat will send a Working Group Review announcement with a copy to new-work and place it back on the agenda for the next telechat."

      External Review NOT APPROVED; -
      +
      The Secretariat will wait for instructions from
      The IESG decides the document needs more time in INTERNAL REVIEW. The Secretariat will put it back on the agenda for the next teleconference in the same category.
      The IESG has made changes since the charter was seen in INTERNAL REVIEW, and decides to send it back to INTERNAL REVIEW the charter again. diff --git a/ietf/secr/urls.py b/ietf/secr/urls.py index 5a3df23d0b9..ab210466544 100644 --- a/ietf/secr/urls.py +++ b/ietf/secr/urls.py @@ -1,13 +1,22 @@ -from django.conf.urls import url, include +# Copyright The IETF Trust 2025, All Rights Reserved + +from django.conf import settings +from django.urls import re_path, include from django.views.generic import TemplateView +from django.views.generic.base import RedirectView urlpatterns = [ - url(r'^$', TemplateView.as_view(template_name='main.html')), - url(r'^announcement/', include('ietf.secr.announcement.urls')), - url(r'^areas/', include('ietf.secr.areas.urls')), - url(r'^console/', include('ietf.secr.console.urls')), - url(r'^meetings/', include('ietf.secr.meetings.urls')), - url(r'^rolodex/', include('ietf.secr.rolodex.urls')), - url(r'^sreq/', include('ietf.secr.sreq.urls')), - url(r'^telechat/', include('ietf.secr.telechat.urls')), + re_path(r'^$', TemplateView.as_view(template_name='index.html'), name='ietf.secr'), + re_path(r'^announcement/', include('ietf.secr.announcement.urls')), + re_path(r'^meetings/', include('ietf.secr.meetings.urls')), + re_path(r'^rolodex/', include('ietf.secr.rolodex.urls')), + # remove these redirects after 125 + re_path(r'^sreq/$', RedirectView.as_view(url='/meeting/session/request/', permanent=True)), + re_path(r'^sreq/%(acronym)s/$' % settings.URL_REGEXPS, RedirectView.as_view(url='/meeting/session/request/%(acronym)s/view/', permanent=True)), + re_path(r'^sreq/%(acronym)s/edit/$' % settings.URL_REGEXPS, RedirectView.as_view(url='/meeting/session/request/%(acronym)s/edit/', permanent=True)), + re_path(r'^sreq/%(acronym)s/new/$' % settings.URL_REGEXPS, RedirectView.as_view(url='/meeting/session/request/%(acronym)s/new/', permanent=True)), + re_path(r'^sreq/(?P[A-Za-z0-9_\-\+]+)/%(acronym)s/view/$' % settings.URL_REGEXPS, RedirectView.as_view(url='/meeting/%(num)s/session/request/%(acronym)s/view/', permanent=True)), + re_path(r'^sreq/(?P[A-Za-z0-9_\-\+]+)/%(acronym)s/edit/$' % settings.URL_REGEXPS, RedirectView.as_view(url='/meeting/%(num)s/session/request/%(acronym)s/edit/', permanent=True)), + # --------------------------------- + re_path(r'^telechat/', include('ietf.secr.telechat.urls')), ] diff --git a/ietf/secr/utils/decorators.py b/ietf/secr/utils/decorators.py index f635bc7eceb..5887c3c9ccd 100644 --- a/ietf/secr/utils/decorators.py +++ b/ietf/secr/utils/decorators.py @@ -1,12 +1,12 @@ # Copyright The IETF Trust 2013-2020, All Rights Reserved from functools import wraps +from urllib.parse import quote as urlquote from django.conf import settings from django.contrib.auth import REDIRECT_FIELD_NAME from django.core.exceptions import ObjectDoesNotExist from django.http import HttpResponseRedirect from django.shortcuts import render, get_object_or_404 -from django.utils.http import urlquote from ietf.ietfauth.utils import has_role from ietf.doc.models import Document diff --git a/ietf/secr/utils/document.py b/ietf/secr/utils/document.py index 0a34512a173..361bf836dfd 100644 --- a/ietf/secr/utils/document.py +++ b/ietf/secr/utils/document.py @@ -13,15 +13,6 @@ def get_full_path(doc): return None return os.path.join(doc.get_file_path(), doc.uploaded_filename) -def get_rfc_num(doc): - qs = doc.docalias.filter(name__startswith='rfc') - return qs[0].name[3:] if qs else None - -def is_draft(doc): - if doc.docalias.filter(name__startswith='rfc'): - return False - else: - return True def get_start_date(doc): ''' diff --git a/ietf/secr/utils/group.py b/ietf/secr/utils/group.py deleted file mode 100644 index a4c1c0f98a9..00000000000 --- a/ietf/secr/utils/group.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright The IETF Trust 2013-2020, All Rights Reserved -# -*- coding: utf-8 -*- - - -# Python imports -import io -import os - -# Django imports -from django.conf import settings -from django.core.exceptions import ObjectDoesNotExist - -# Datatracker imports -from ietf.group.models import Group -from ietf.ietfauth.utils import has_role - - - - -def current_nomcom(): - qs = Group.objects.filter(acronym__startswith='nomcom',state__slug="active").order_by('-time') - if qs.count(): - return qs[0] - else: - return None - -def get_charter_text(group): - ''' - Takes a group object and returns the text or the group's charter as a string - ''' - charter = group.charter - path = os.path.join(settings.CHARTER_PATH, '%s-%s.txt' % (charter.canonical_name(), charter.rev)) - f = io.open(path,'r') - text = f.read() - f.close() - - return text - -def get_my_groups(user,conclude=False): - ''' - Takes a Django user object (from request) - Returns a list of groups the user has access to. Rules are as follows - secretariat - has access to all groups - area director - has access to all groups in their area - wg chair or secretary - has access to their own group - chair of irtf has access to all irtf groups - - If user=None than all groups are returned. - concluded=True means include concluded groups. Need this to upload materials for groups - after they've been concluded. it happens. - ''' - my_groups = set() - states = ['bof','proposed','active'] - if conclude: - states.extend(['conclude','bof-conc']) - - all_groups = Group.objects.filter(type__features__has_meetings=True, state__in=states).order_by('acronym') - if user == None or has_role(user,'Secretariat'): - return all_groups - - try: - person = user.person - except ObjectDoesNotExist: - return list() - - for group in all_groups: - if group.role_set.filter(person=person,name__in=('chair','secr','ad')): - my_groups.add(group) - continue - if group.parent and group.parent.role_set.filter(person=person,name__in=('ad','chair')): - my_groups.add(group) - continue - - return list(my_groups) diff --git a/ietf/settings.py b/ietf/settings.py index 7934a42a750..f8d8a28d650 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2007-2022, All Rights Reserved +# Copyright The IETF Trust 2007-2025, All Rights Reserved # -*- coding: utf-8 -*- @@ -9,24 +9,40 @@ import os import sys import datetime +import pathlib import warnings +from hashlib import sha384 from typing import Any, Dict, List, Tuple # pyflakes:ignore +# DeprecationWarnings are suppressed by default, enable them warnings.simplefilter("always", DeprecationWarning) -warnings.filterwarnings("ignore", message="'urllib3\[secure\]' extra is deprecated") -warnings.filterwarnings("ignore", message="The logout\(\) view is superseded by") + +# Warnings that must be resolved for Django 5.x +warnings.filterwarnings("ignore", "Log out via GET requests is deprecated") # caused by oidc_provider +warnings.filterwarnings("ignore", message="The django.utils.timezone.utc alias is deprecated.", module="oidc_provider") +warnings.filterwarnings("ignore", message="The django.utils.datetime_safe module is deprecated.", module="tastypie") +warnings.filterwarnings("ignore", message="The USE_DEPRECATED_PYTZ setting,") # https://github.com/ietf-tools/datatracker/issues/5635 +warnings.filterwarnings("ignore", message="The USE_L10N setting is deprecated.") # https://github.com/ietf-tools/datatracker/issues/5648 +warnings.filterwarnings("ignore", message="django.contrib.auth.hashers.CryptPasswordHasher is deprecated.") # https://github.com/ietf-tools/datatracker/issues/5663 + +# Other DeprecationWarnings +warnings.filterwarnings("ignore", message="pkg_resources is deprecated as an API", module="pyang.plugin") warnings.filterwarnings("ignore", message="Report.file_reporters will no longer be available in Coverage.py 4.2", module="coverage.report") -warnings.filterwarnings("ignore", message="{% load staticfiles %} is deprecated") -warnings.filterwarnings("ignore", message="Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated", module="bleach") -warnings.filterwarnings("ignore", message="HTTPResponse.getheader\(\) is deprecated", module='selenium.webdriver') -try: - import syslog - syslog.openlog(str("datatracker"), syslog.LOG_PID, syslog.LOG_USER) -except ImportError: - pass +warnings.filterwarnings("ignore", message="currentThread\\(\\) is deprecated", module="coverage.pytracer") +warnings.filterwarnings("ignore", message="co_lnotab is deprecated", module="coverage.parser") +warnings.filterwarnings("ignore", message="datetime.datetime.utcnow\\(\\) is deprecated", module="botocore.auth") +warnings.filterwarnings("ignore", message="datetime.datetime.utcnow\\(\\) is deprecated", module="oic.utils.time_util") +warnings.filterwarnings("ignore", message="datetime.datetime.utcfromtimestamp\\(\\) is deprecated", module="oic.utils.time_util") +warnings.filterwarnings("ignore", message="datetime.datetime.utcfromtimestamp\\(\\) is deprecated", module="pytz.tzinfo") +warnings.filterwarnings("ignore", message="'instantiateVariableFont' is deprecated", module="weasyprint") + + +base_path = pathlib.Path(__file__).resolve().parent +BASE_DIR = str(base_path) -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -sys.path.append(os.path.abspath(BASE_DIR + "/..")) +project_path = base_path.parent +PROJECT_DIR = str(project_path) +sys.path.append(PROJECT_DIR) from ietf import __version__ import debug @@ -59,6 +75,26 @@ 'django.contrib.auth.hashers.CryptPasswordHasher', ] + +PASSWORD_POLICY_MIN_LENGTH = 12 +PASSWORD_POLICY_ENFORCE_AT_LOGIN = False # should turn this on for prod + +AUTH_PASSWORD_VALIDATORS = [ + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + "OPTIONS": { + "min_length": PASSWORD_POLICY_MIN_LENGTH, + } + }, + { + "NAME": "ietf.ietfauth.password_validation.StrongPasswordValidator", + }, +] +# In dev environments, settings_local overrides the password validators. Save +# a handle to the original value so settings_test can restore it so tests match +# production. +ORIG_AUTH_PASSWORD_VALIDATORS = AUTH_PASSWORD_VALIDATORS + ALLOWED_HOSTS = [".ietf.org", ".ietf.org.", "209.208.19.216", "4.31.198.44", "127.0.0.1", "localhost", ] # Server name of the tools server @@ -101,7 +137,27 @@ # to load the internationalization machinery. USE_I18N = False +# Django 4.0 changed the default setting of USE_L10N to True. The setting +# is deprecated and will be removed in Django 5.0. +USE_L10N = False + USE_TZ = True +USE_DEPRECATED_PYTZ = True # supported until Django 5 + +# The DjangoDivFormRenderer is a transitional class that opts in to defaulting to the div.html +# template for formsets. This will become the default behavior in Django 5.0. This configuration +# can be removed at that point. +# See https://docs.djangoproject.com/en/4.2/releases/4.1/#forms +FORM_RENDERER = "django.forms.renderers.DjangoDivFormRenderer" + +# Default primary key field type to use for models that don’t have a field with primary_key=True. +# In the future (relative to 4.2), the default will become 'django.db.models.BigAutoField.' +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' + +# OIDC configuration +_SITE_URL = os.environ.get("OIDC_SITE_URL", None) +if _SITE_URL is not None: + SITE_URL = _SITE_URL if SERVER_MODE == 'production': MEDIA_ROOT = '/a/www/www6s/lib/dt/media/' @@ -137,7 +193,6 @@ # Absolute path to the directory static files should be collected to. # Example: "/var/www/example.com/static/" - SERVE_CDN_PHOTOS = True SERVE_CDN_FILES_LOCALLY_IN_DEV_MODE = True @@ -147,7 +202,7 @@ STATIC_URL = "/static/" STATIC_ROOT = os.path.abspath(BASE_DIR + "/../static/") else: - STATIC_URL = "https://www.ietf.org/lib/dt/%s/"%__version__ + STATIC_URL = "https://static.ietf.org/dt/%s/"%__version__ STATIC_ROOT = "/a/www/www6s/lib/dt/%s/"%__version__ # List of finder classes that know how to find static files in @@ -157,6 +212,19 @@ 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ) +# Client-side static.ietf.org URL +STATIC_IETF_ORG = "https://static.ietf.org" +# Server-side static.ietf.org URL (used in pdfized) +STATIC_IETF_ORG_INTERNAL = STATIC_IETF_ORG + +ENABLE_BLOBSTORAGE = True + +# "standard" retry mode is used, which does exponential backoff with a base factor of 2 +# and a cap of 20. +BLOBSTORAGE_MAX_ATTEMPTS = 5 # boto3 default is 3 (for "standard" retry mode) +BLOBSTORAGE_CONNECT_TIMEOUT = 10 # seconds; boto3 default is 60 +BLOBSTORAGE_READ_TIMEOUT = 10 # seconds; boto3 default is 60 + WSGI_APPLICATION = "ietf.wsgi.application" AUTHENTICATION_BACKENDS = ( 'ietf.ietfauth.backends.CaseInsensitiveModelBackend', ) @@ -209,11 +277,11 @@ def skip_unreadable_post(record): # 'loggers': { 'django': { - 'handlers': ['debug_console', 'mail_admins'], + 'handlers': ['console', 'mail_admins'], 'level': 'INFO', }, 'django.request': { - 'handlers': ['debug_console'], + 'handlers': ['console'], 'level': 'ERROR', }, 'django.server': { @@ -221,13 +289,21 @@ def skip_unreadable_post(record): 'level': 'INFO', }, 'django.security': { - 'handlers': ['debug_console', ], + 'handlers': ['console', ], + 'level': 'INFO', + }, + 'oidc_provider': { + 'handlers': ['console', ], + 'level': 'DEBUG', + }, + 'datatracker': { + 'handlers': ['console'], + 'level': 'INFO', + }, + 'celery': { + 'handlers': ['console'], 'level': 'INFO', }, - 'oidc_provider': { - 'handlers': ['debug_console', ], - 'level': 'DEBUG', - }, }, # # No logger filters @@ -238,13 +314,6 @@ def skip_unreadable_post(record): 'class': 'logging.StreamHandler', 'formatter': 'plain', }, - 'syslog': { - 'level': 'DEBUG', - 'class': 'logging.handlers.SysLogHandler', - 'facility': 'user', - 'formatter': 'plain', - 'address': '/dev/log', - }, 'debug_console': { # Active only when DEBUG=True 'level': 'DEBUG', @@ -298,28 +367,24 @@ def skip_unreadable_post(record): 'style': '{', 'format': '{levelname}: {name}:{lineno}: {message}', }, + 'json' : { + "class": "ietf.utils.jsonlogger.DatatrackerJsonFormatter", + "style": "{", + "format": "{asctime}{levelname}{message}{name}{pathname}{lineno}{funcName}{process}", + } }, } -# This should be overridden by settings_local for any logger where debug (or -# other) custom log settings are wanted. Use "ietf/manage.py showloggers -l" -# to show registered loggers. The content here should match the levels above -# and is shown as an example: -UTILS_LOGGER_LEVELS: Dict[str, str] = { -# 'django': 'INFO', -# 'django.server': 'INFO', -} - # End logging # ------------------------------------------------------------------------ X_FRAME_OPTIONS = 'SAMEORIGIN' CSRF_TRUSTED_ORIGINS = [ - 'ietf.org', - '*.ietf.org', - 'meetecho.com', - '*.meetecho.com', + "https://ietf.org", + "https://*.ietf.org", + 'https://meetecho.com', + 'https://*.meetecho.com', ] CSRF_COOKIE_SAMESITE = 'None' CSRF_COOKIE_SECURE = True @@ -330,11 +395,7 @@ def skip_unreadable_post(record): SESSION_COOKIE_SECURE = True SESSION_EXPIRE_AT_BROWSER_CLOSE = False -# We want to use the JSON serialisation, as it's safer -- but there is /secr/ -# code which stashes objects in the session that can't be JSON serialized. -# Switch when that code is rewritten. -#SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer" -SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' +SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer" SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_SAVE_EVERY_REQUEST = True SESSION_CACHE_ALIAS = 'sessions' @@ -350,6 +411,7 @@ def skip_unreadable_post(record): ], 'OPTIONS': { 'context_processors': [ + 'ietf.context_processors.traceparent_id', 'django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', # makes 'sql_queries' available in templates 'django.template.context_processors.i18n', @@ -382,42 +444,45 @@ def skip_unreadable_post(record): MIDDLEWARE = [ - 'django.middleware.csrf.CsrfViewMiddleware', - 'corsheaders.middleware.CorsMiddleware', # see docs on CORS_REPLACE_HTTPS_REFERER before using it - 'django.middleware.common.CommonMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.http.ConditionalGetMiddleware', - 'simple_history.middleware.HistoryRequestMiddleware', + "ietf.middleware.add_otel_traceparent_header", + "django.middleware.csrf.CsrfViewMiddleware", + "corsheaders.middleware.CorsMiddleware", # see docs on CORS_REPLACE_HTTPS_REFERER before using it + "django.middleware.common.CommonMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.http.ConditionalGetMiddleware", + "simple_history.middleware.HistoryRequestMiddleware", # comment in this to get logging of SQL insert and update statements: - #'ietf.middleware.sql_log_middleware', - 'ietf.middleware.SMTPExceptionMiddleware', - 'ietf.middleware.Utf8ExceptionMiddleware', - 'ietf.middleware.redirect_trailing_period_middleware', - 'django_referrer_policy.middleware.ReferrerPolicyMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', - # 'csp.middleware.CSPMiddleware', - 'ietf.middleware.unicode_nfkc_normalization_middleware', + #"ietf.middleware.sql_log_middleware", + "ietf.middleware.SMTPExceptionMiddleware", + "ietf.middleware.Utf8ExceptionMiddleware", + "ietf.middleware.redirect_trailing_period_middleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + "django.middleware.security.SecurityMiddleware", + "ietf.middleware.unicode_nfkc_normalization_middleware", + "ietf.middleware.is_authenticated_header_middleware", ] ROOT_URLCONF = 'ietf.urls' -DJANGO_VITE_ASSETS_PATH = os.path.join(BASE_DIR, 'static/dist-neue') +# Configure django_vite +DJANGO_VITE: dict = {"default": {}} if DEBUG: - DJANGO_VITE_MANIFEST_PATH = os.path.join(BASE_DIR, 'static/dist-neue/manifest.json') + DJANGO_VITE["default"]["manifest_path"] = os.path.join( + BASE_DIR, 'static/dist-neue/manifest.json' + ) # Additional locations of static files (in addition to each app's static/ dir) STATICFILES_DIRS = ( - DJANGO_VITE_ASSETS_PATH, + os.path.join(BASE_DIR, "static/dist-neue"), # for django_vite os.path.join(BASE_DIR, 'static/dist'), os.path.join(BASE_DIR, 'secr/static/dist'), ) INSTALLED_APPS = [ # Django apps - 'django.contrib.admin', + 'ietf.admin', # replaces django.contrib.admin 'django.contrib.admindocs', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -432,16 +497,20 @@ def skip_unreadable_post(record): 'django_vite', 'django_bootstrap5', 'django_celery_beat', + 'django_celery_results', 'corsheaders', 'django_markup', - 'django_password_strength', - 'form_utils', 'oidc_provider', + 'drf_spectacular', + 'drf_standardized_errors', + 'rest_framework', + 'rangefilter', 'simple_history', 'tastypie', 'widget_tweaks', # IETF apps 'ietf.api', + 'ietf.blobdb', 'ietf.community', 'ietf.dbtemplate', 'ietf.doc', @@ -462,15 +531,14 @@ def skip_unreadable_post(record): 'ietf.release', 'ietf.review', 'ietf.stats', + 'ietf.status', 'ietf.submit', 'ietf.sync', 'ietf.utils', # IETF Secretariat apps 'ietf.secr.announcement', - 'ietf.secr.areas', 'ietf.secr.meetings', 'ietf.secr.rolodex', - 'ietf.secr.sreq', 'ietf.secr.telechat', ] @@ -510,8 +578,6 @@ def skip_unreadable_post(record): CORS_ALLOW_METHODS = ( 'GET', 'OPTIONS', ) CORS_URLS_REGEX = r'^(/api/.*|.*\.json|.*/json/?)$' -# Setting for django_referrer_policy.middleware.ReferrerPolicyMiddleware -REFERRER_POLICY = 'strict-origin-when-cross-origin' # django.middleware.security.SecurityMiddleware SECURE_BROWSER_XSS_FILTER = True @@ -522,6 +588,9 @@ def skip_unreadable_post(record): #SECURE_REDIRECT_EXEMPT #SECURE_SSL_HOST #SECURE_SSL_REDIRECT = True +# Relax the COOP policy to allow Meetecho authentication pop-up +SECURE_CROSS_ORIGIN_OPENER_POLICY = "unsafe-none" +SECURE_REFERRER_POLICY = "strict-origin-when-cross-origin" # Override this in your settings_local with the IP addresses relevant for you: INTERNAL_IPS = ( @@ -530,17 +599,83 @@ def skip_unreadable_post(record): '::1', ) +# django-rest-framework configuration +REST_FRAMEWORK = { + "DEFAULT_AUTHENTICATION_CLASSES": [ + "ietf.api.authentication.ApiKeyAuthentication", + "rest_framework.authentication.SessionAuthentication", + ], + "DEFAULT_PERMISSION_CLASSES": [ + "ietf.api.permissions.HasApiKey", + ], + "DEFAULT_RENDERER_CLASSES": [ + "rest_framework.renderers.JSONRenderer", + ], + "DEFAULT_PARSER_CLASSES": [ + "rest_framework.parsers.JSONParser", + ], + "DEFAULT_SCHEMA_CLASS": "drf_standardized_errors.openapi.AutoSchema", + "EXCEPTION_HANDLER": "drf_standardized_errors.handler.exception_handler", +} + +# DRF OpenApi schema settings +SPECTACULAR_SETTINGS = { + "TITLE": "Datatracker API", + "DESCRIPTION": "Datatracker API", + "VERSION": "1.0.0", + "SCHEMA_PATH_PREFIX": "/api/", + "COMPONENT_SPLIT_REQUEST": True, + "COMPONENT_NO_READ_ONLY_REQUIRED": True, + "SERVERS": [ + {"url": "http://localhost:8000", "description": "local dev server"}, + {"url": "https://datatracker.ietf.org", "description": "production server"}, + ], + # The following settings are needed for drf-standardized-errors + "ENUM_NAME_OVERRIDES": { + "ValidationErrorEnum": "drf_standardized_errors.openapi_serializers.ValidationErrorEnum.choices", + "ClientErrorEnum": "drf_standardized_errors.openapi_serializers.ClientErrorEnum.choices", + "ServerErrorEnum": "drf_standardized_errors.openapi_serializers.ServerErrorEnum.choices", + "ErrorCode401Enum": "drf_standardized_errors.openapi_serializers.ErrorCode401Enum.choices", + "ErrorCode403Enum": "drf_standardized_errors.openapi_serializers.ErrorCode403Enum.choices", + "ErrorCode404Enum": "drf_standardized_errors.openapi_serializers.ErrorCode404Enum.choices", + "ErrorCode405Enum": "drf_standardized_errors.openapi_serializers.ErrorCode405Enum.choices", + "ErrorCode406Enum": "drf_standardized_errors.openapi_serializers.ErrorCode406Enum.choices", + "ErrorCode415Enum": "drf_standardized_errors.openapi_serializers.ErrorCode415Enum.choices", + "ErrorCode429Enum": "drf_standardized_errors.openapi_serializers.ErrorCode429Enum.choices", + "ErrorCode500Enum": "drf_standardized_errors.openapi_serializers.ErrorCode500Enum.choices", + }, + "POSTPROCESSING_HOOKS": ["drf_standardized_errors.openapi_hooks.postprocess_schema_enums"], +} + +# DRF Standardized Errors settings +DRF_STANDARDIZED_ERRORS = { + # enable the standardized errors when DEBUG=True for unhandled exceptions. + # By default, this is set to False so you're able to view the traceback in + # the terminal and get more information about the exception. + "ENABLE_IN_DEBUG_FOR_UNHANDLED_EXCEPTIONS": False, + # ONLY the responses that correspond to these status codes will appear + # in the API schema. + "ALLOWED_ERROR_STATUS_CODES": [ + "400", + # "401", + # "403", + "404", + # "405", + # "406", + # "415", + # "429", + # "500", + ], + +} + # no slash at end IDTRACKER_BASE_URL = "https://datatracker.ietf.org" RFCDIFF_BASE_URL = "https://author-tools.ietf.org/iddiff" IDNITS_BASE_URL = "https://author-tools.ietf.org/api/idnits" +IDNITS3_BASE_URL = "https://author-tools.ietf.org/idnits3/results" IDNITS_SERVICE_URL = "https://author-tools.ietf.org/idnits" -# Content security policy configuration (django-csp) -# (In current production, the Content-Security-Policy header is completely set by nginx configuration, but -# we try to keep this in sync to avoid confusion) -CSP_DEFAULT_SRC = ("'self'", "'unsafe-inline'", f"data: {IDTRACKER_BASE_URL} http://ietf.org/ https://www.ietf.org/ https://analytics.ietf.org/ https://static.ietf.org") - # The name of the method to use to invoke the test suite TEST_RUNNER = 'ietf.utils.test_runner.IetfTestRunner' @@ -550,8 +685,6 @@ def skip_unreadable_post(record): TEST_DIFF_FAILURE_DIR = "/tmp/test/failure/" -TEST_GHOSTDRIVER_LOG_PATH = "ghostdriver.log" - # These are regexes TEST_URL_COVERAGE_EXCLUDE = [ r"^\^admin/", @@ -578,9 +711,10 @@ def skip_unreadable_post(record): "ietf/utils/test_runner.py", "ietf/name/generate_fixtures.py", "ietf/review/import_from_review_tool.py", - "ietf/stats/backfill_data.py", "ietf/utils/patch.py", "ietf/utils/test_data.py", + "ietf/utils/jstest.py", + "ietf/utils/coverage.py", ] # These are code line regex patterns @@ -594,12 +728,15 @@ def skip_unreadable_post(record): ] # These are filename globs. They are used by test_parse_templates() and -# get_template_paths() +# get_template_paths(). Globs are applied via pathlib.Path().match, using +# the path to the template from the project root. TEST_TEMPLATE_IGNORE = [ - ".*", # dot-files - "*~", # tilde temp-files - "#*", # files beginning with a hashmark - "500.html" # isn't loaded by regular loader, but checked by test_500_page() + ".*", # dot-files + "*~", # tilde temp-files + "#*", # files beginning with a hashmark + "500.html", # isn't loaded by regular loader, but checked by test_500_page() + "ietf/templates/admin/meeting/RegistrationTicket/change_list.html", + "ietf/templates/admin/meeting/Registration/change_list.html", ] TEST_COVERAGE_MAIN_FILE = os.path.join(BASE_DIR, "../release-coverage.json") @@ -607,8 +744,8 @@ def skip_unreadable_post(record): TEST_CODE_COVERAGE_CHECKER = None if SERVER_MODE != 'production': - import coverage - TEST_CODE_COVERAGE_CHECKER = coverage.Coverage(source=[ BASE_DIR ], cover_pylib=False, omit=TEST_CODE_COVERAGE_EXCLUDE_FILES) + from ietf.utils.coverage import CoverageManager + TEST_CODE_COVERAGE_CHECKER = CoverageManager() TEST_CODE_COVERAGE_REPORT_PATH = "coverage/" TEST_CODE_COVERAGE_REPORT_URL = os.path.join(STATIC_URL, TEST_CODE_COVERAGE_REPORT_PATH, "index.html") @@ -635,6 +772,7 @@ def skip_unreadable_post(record): "acronym": r"(?P[-a-z0-9]+)", "bofreq": r"(?Pbofreq-[-a-z0-9]+)", "charter": r"(?Pcharter-[-a-z0-9]+)", + "statement": r"(?Pstatement-[-a-z0-9]+)", "date": r"(?P\d{4}-\d{2}-\d{2})", "name": r"(?P[A-Za-z0-9._+-]+?)", "document": r"(?P[a-z][-a-z0-9]+)", # regular document names @@ -643,35 +781,92 @@ def skip_unreadable_post(record): "schedule_name": r"(?P[A-Za-z0-9-:_]+)", } +STORAGES: dict[str, Any] = { + "default": {"BACKEND": "django.core.files.storage.FileSystemStorage"}, + "staticfiles": {"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage"}, +} + +# Storages for artifacts stored as blobs +ARTIFACT_STORAGE_NAMES: list[str] = [ + "active-draft", + "agenda", + "bibxml-ids", + "bluesheets", + "bofreq", + "charter", + "chatlog", + "conflrev", + "draft", + "floorplan", + "indexes", + "liai-att", + "meetinghostlogo", + "minutes", + "narrativeminutes", + "photo", + "polls", + "procmaterials", + "review", + "slides", + "staging", + "statchg", + "statement", +] +for storagename in ARTIFACT_STORAGE_NAMES: + STORAGES[storagename] = { + "BACKEND": "ietf.doc.storage.StoredObjectBlobdbStorage", + "OPTIONS": {"bucket_name": storagename}, + } + +# Buckets / doc types of meeting materials the CF worker is allowed to serve. This +# differs from the list in Session.meeting_related() by the omission of "recording" +MATERIALS_TYPES_SERVED_BY_WORKER = [ + "agenda", + "bluesheets", + "chatlog", + "minutes", + "narrativeminutes", + "polls", + "procmaterials", + "slides", +] + + # Override this in settings_local.py if needed # *_PATH variables ends with a slash/ . -#DOCUMENT_PATH_PATTERN = '/a/www/ietf-ftp/{doc.type_id}/' DOCUMENT_PATH_PATTERN = '/a/ietfdata/doc/{doc.type_id}/' INTERNET_DRAFT_PATH = '/a/ietfdata/doc/draft/repository' INTERNET_DRAFT_PDF_PATH = '/a/www/ietf-datatracker/pdf/' RFC_PATH = '/a/www/ietf-ftp/rfc/' CHARTER_PATH = '/a/ietfdata/doc/charter/' +CHARTER_COPY_PATH = '/a/www/ietf-ftp/ietf' # copy 1wg-charters files here if set +CHARTER_COPY_OTHER_PATH = '/a/ftp/ietf' +CHARTER_COPY_THIRD_PATH = '/a/ftp/charter' +GROUP_SUMMARY_PATH = '/a/www/ietf-ftp/ietf' BOFREQ_PATH = '/a/ietfdata/doc/bofreq/' CONFLICT_REVIEW_PATH = '/a/ietfdata/doc/conflict-review' STATUS_CHANGE_PATH = '/a/ietfdata/doc/status-change' AGENDA_PATH = '/a/www/www6s/proceedings/' MEETINGHOST_LOGO_PATH = AGENDA_PATH # put these in the same place as other proceedings files -IPR_DOCUMENT_PATH = '/a/www/ietf-ftp/ietf/IPR/' -IESG_WG_EVALUATION_DIR = "/a/www/www6/iesg/evaluation" # Move drafts to this directory when they expire INTERNET_DRAFT_ARCHIVE_DIR = '/a/ietfdata/doc/draft/collection/draft-archive/' -# The following directory contains linked copies of all drafts, but don't -# write anything to this directory -- its content is maintained by ghostlinkd: +# The following directory contains copies of all drafts - it used to be +# a set of hardlinks maintained by ghostlinkd, but is now explicitly written to INTERNET_ALL_DRAFTS_ARCHIVE_DIR = '/a/ietfdata/doc/draft/archive' MEETING_RECORDINGS_DIR = '/a/www/audio' DERIVED_DIR = '/a/ietfdata/derived' +FTP_DIR = '/a/ftp' +ALL_ID_DOWNLOAD_DIR = '/a/www/www6s/download' +NFS_METRICS_TMP_DIR = '/a/tmp' DOCUMENT_FORMAT_ALLOWLIST = ["txt", "ps", "pdf", "xml", "html", ] # Mailing list info URL for lists hosted on the IETF servers -MAILING_LIST_INFO_URL = "https://www.ietf.org/mailman/listinfo/%(list_addr)s" +MAILING_LIST_INFO_URL = "https://mailman3.%(domain)s/mailman3/lists/%(list_addr)s.%(domain)s" MAILING_LIST_ARCHIVE_URL = "https://mailarchive.ietf.org" +MAILING_LIST_ARCHIVE_SEARCH_URL = "https://mailarchive.ietf.org/api/v1/message/search/" +MAILING_LIST_ARCHIVE_API_KEY = "changeme" # Liaison Statement Tool settings (one is used in DOC_HREFS below) LIAISON_UNIVERSAL_FROM = 'Liaison Statement Management Tool ' @@ -683,7 +878,7 @@ def skip_unreadable_post(record): DOC_HREFS = { "charter": "https://www.ietf.org/charter/{doc.name}-{doc.rev}.txt", "draft": "https://www.ietf.org/archive/id/{doc.name}-{doc.rev}.txt", - "rfc": "https://www.rfc-editor.org/rfc/rfc{doc.rfcnum}.txt", + "rfc": "https://www.rfc-editor.org/rfc/rfc{doc.rfc_number}.txt", "slides": "https://www.ietf.org/slides/{doc.name}-{doc.rev}", "procmaterials": "https://www.ietf.org/procmaterials/{doc.name}-{doc.rev}", "conflrev": "https://www.ietf.org/cr/{doc.name}-{doc.rev}.txt", @@ -703,44 +898,6 @@ def skip_unreadable_post(record): CACHE_MIDDLEWARE_SECONDS = 300 CACHE_MIDDLEWARE_KEY_PREFIX = '' -# The default with no CACHES setting is 'django.core.cache.backends.locmem.LocMemCache' -# This setting is possibly overridden further down, after the import of settings_local -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', - 'LOCATION': '127.0.0.1:11211', - 'VERSION': __version__, - 'KEY_PREFIX': 'ietf:dt', - }, - 'sessions': { - 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', - 'LOCATION': '127.0.0.1:11211', - # No release-specific VERSION setting. - 'KEY_PREFIX': 'ietf:dt', - }, - 'htmlized': { - 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'LOCATION': '/a/cache/datatracker/htmlized', - 'OPTIONS': { - 'MAX_ENTRIES': 100000, # 100,000 - }, - }, - 'pdfized': { - 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'LOCATION': '/a/cache/datatracker/pdfized', - 'OPTIONS': { - 'MAX_ENTRIES': 100000, # 100,000 - }, - }, - 'slowpages': { - 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'LOCATION': '/a/cache/datatracker/slowpages', - 'OPTIONS': { - 'MAX_ENTRIES': 5000, - }, - }, -} - HTMLIZER_VERSION = 1 HTMLIZER_URL_PREFIX = "/doc/html" HTMLIZER_CACHE_TIME = 60*60*24*14 # 14 days @@ -753,16 +910,14 @@ def skip_unreadable_post(record): SESSION_REQUEST_FROM_EMAIL = 'IETF Meeting Session Request Tool ' SECRETARIAT_SUPPORT_EMAIL = "support@ietf.org" -SECRETARIAT_ACTION_EMAIL = "ietf-action@ietf.org" -SECRETARIAT_INFO_EMAIL = "ietf-info@ietf.org" +SECRETARIAT_ACTION_EMAIL = SECRETARIAT_SUPPORT_EMAIL +SECRETARIAT_INFO_EMAIL = SECRETARIAT_SUPPORT_EMAIL # Put real password in settings_local.py IANA_SYNC_PASSWORD = "secret" IANA_SYNC_CHANGES_URL = "https://datatracker.iana.org:4443/data-tracker/changes" IANA_SYNC_PROTOCOLS_URL = "https://www.iana.org/protocols/" -RFC_TEXT_RSYNC_SOURCE="ftp.rfc-editor.org::rfcs-text-only" - RFC_EDITOR_SYNC_PASSWORD="secret" RFC_EDITOR_SYNC_NOTIFICATION_URL = "https://www.rfc-editor.org/parser/parser.php" RFC_EDITOR_GROUP_NOTIFICATION_EMAIL = "webmaster@rfc-editor.org" @@ -780,7 +935,7 @@ def skip_unreadable_post(record): NOMCOM_FROM_EMAIL = 'nomcom-chair-{year}@ietf.org' OPENSSL_COMMAND = '/usr/bin/openssl' DAYS_TO_EXPIRE_NOMINATION_LINK = '' -NOMINEE_FEEDBACK_TYPES = ['comment', 'questio', 'nomina'] +NOMINEE_FEEDBACK_TYPES = ['comment', 'questio', 'nomina', 'obe'] # SlideSubmission settings SLIDE_STAGING_PATH = '/a/www/www6s/staging/' @@ -835,7 +990,8 @@ def skip_unreadable_post(record): # Max time to allow for validation before a submission is subject to cancellation IDSUBMIT_MAX_VALIDATION_TIME = datetime.timedelta(minutes=20) -IDSUBMIT_MANUAL_STAGING_DIR = '/tmp/' +# Age at which a submission expires if not posted +IDSUBMIT_EXPIRATION_AGE = datetime.timedelta(days=14) IDSUBMIT_FILE_TYPES = ( 'txt', @@ -875,6 +1031,7 @@ def skip_unreadable_post(record): MEETING_DOC_LOCAL_HREFS = { "agenda": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}", "minutes": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}", + "narrativeminutes": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}", "slides": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}", "chatlog": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}", "polls": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}", @@ -886,6 +1043,7 @@ def skip_unreadable_post(record): MEETING_DOC_CDN_HREFS = { "agenda": "https://www.ietf.org/proceedings/{meeting.number}/agenda/{doc.name}-{doc.rev}", "minutes": "https://www.ietf.org/proceedings/{meeting.number}/minutes/{doc.name}-{doc.rev}", + "narrativeminutes": "https://www.ietf.org/proceedings/{meeting.number}/narrative-minutes/{doc.name}-{doc.rev}", "slides": "https://www.ietf.org/proceedings/{meeting.number}/slides/{doc.name}-{doc.rev}", "recording": "{doc.external_url}", "bluesheets": "https://www.ietf.org/proceedings/{meeting.number}/bluesheets/{doc.uploaded_filename}", @@ -897,6 +1055,7 @@ def skip_unreadable_post(record): MEETING_DOC_OLD_HREFS = { "agenda": "/meeting/{meeting.number}/materials/{doc.name}", "minutes": "/meeting/{meeting.number}/materials/{doc.name}", + "narrativeminutes" : "/meeting/{meeting.number}/materials/{doc.name}", "slides": "/meeting/{meeting.number}/materials/{doc.name}", "recording": "{doc.external_url}", "bluesheets": "https://www.ietf.org/proceedings/{meeting.number}/bluesheets/{doc.uploaded_filename}", @@ -906,6 +1065,7 @@ def skip_unreadable_post(record): MEETING_DOC_GREFS = { "agenda": "/meeting/{meeting.number}/materials/{doc.name}", "minutes": "/meeting/{meeting.number}/materials/{doc.name}", + "narrativeminutes": "/meeting/{meeting.number}/materials/{doc.name}", "slides": "/meeting/{meeting.number}/materials/{doc.name}", "recording": "{doc.external_url}", "bluesheets": "https://www.ietf.org/proceedings/{meeting.number}/bluesheets/{doc.uploaded_filename}", @@ -919,6 +1079,7 @@ def skip_unreadable_post(record): MEETING_VALID_UPLOAD_EXTENSIONS = { 'agenda': ['.txt','.html','.htm', '.md', ], 'minutes': ['.txt','.html','.htm', '.md', '.pdf', ], + 'narrativeminutes': ['.txt','.html','.htm', '.md', '.pdf', ], 'slides': ['.doc','.docx','.pdf','.ppt','.pptx','.txt', ], # Note the removal of .zip 'bluesheets': ['.pdf', '.txt', ], 'procmaterials':['.pdf', ], @@ -928,6 +1089,7 @@ def skip_unreadable_post(record): MEETING_VALID_UPLOAD_MIME_TYPES = { 'agenda': ['text/plain', 'text/html', 'text/markdown', 'text/x-markdown', ], 'minutes': ['text/plain', 'text/html', 'application/pdf', 'text/markdown', 'text/x-markdown', ], + 'narrativeminutes': ['text/plain', 'text/html', 'application/pdf', 'text/markdown', 'text/x-markdown', ], 'slides': [], 'bluesheets': ['application/pdf', 'text/plain', ], 'procmaterials':['application/pdf', ], @@ -982,15 +1144,12 @@ def skip_unreadable_post(record): # ============================================================================== -RSYNC_BINARY = '/usr/bin/rsync' YANGLINT_BINARY = '/usr/bin/yanglint' DE_GFM_BINARY = '/usr/bin/de-gfm.ruby2.5' # Account settings DAYS_TO_EXPIRE_REGISTRATION_LINK = 3 MINUTES_TO_EXPIRE_RESET_PASSWORD_LINK = 60 -HTPASSWD_COMMAND = "/usr/bin/htpasswd" -HTPASSWD_FILE = "/www/htpasswd" # Generation of pdf files GHOSTSCRIPT_COMMAND = "/usr/bin/gs" @@ -1001,13 +1160,19 @@ def skip_unreadable_post(record): # Timezone files for iCalendar TZDATA_ICS_PATH = BASE_DIR + '/../vzic/zoneinfo/' -SECR_BLUE_SHEET_PATH = '/a/www/ietf-datatracker/documents/blue_sheet.rtf' -SECR_BLUE_SHEET_URL = IDTRACKER_BASE_URL + '/documents/blue_sheet.rtf' -SECR_INTERIM_LISTING_DIR = '/a/www/www6/meeting/interim' -SECR_MAX_UPLOAD_SIZE = 40960000 -SECR_PROCEEDINGS_DIR = '/a/www/www6s/proceedings/' -SECR_PPT2PDF_COMMAND = ['/usr/bin/soffice','--headless','--convert-to','pdf:writer_globaldocument_pdf_Export','--outdir'] -STATS_REGISTRATION_ATTENDEES_JSON_URL = 'https://registration.ietf.org/{number}/attendees/' +DATATRACKER_MAX_UPLOAD_SIZE = 40960000 +PPT2PDF_COMMAND = [ + "/usr/bin/soffice", + "--headless", # no GUI + "--safe-mode", # use a new libreoffice profile every time (ensures no reliance on accumulated profile config) + "--norestore", # don't attempt to restore files after a previous crash (ensures that one crash won't block future conversions until UI intervention) + "--convert-to", "pdf:writer_globaldocument_pdf_Export", + "--outdir" +] + +REGISTRATION_PARTICIPANTS_API_URL = 'https://registration.ietf.org/api/v1/participants-dt/' +REGISTRATION_PARTICIPANTS_API_KEY = 'changeme' + PROCEEDINGS_VERSION_CHANGES = [ 0, # version 1 97, # version 2: meeting 97 and later (was number was NEW_PROCEEDINGS_START) @@ -1027,7 +1192,6 @@ def skip_unreadable_post(record): # CHAT_ARCHIVE_URL_PATTERN = 'https://www.ietf.org/jabber/logs/{chat_room_name}?C=M;O=D' PYFLAKES_DEFAULT_ARGS= ["ietf", ] -VULTURE_DEFAULT_ARGS= ["ietf", ] # Automatic Scheduling # @@ -1074,16 +1238,6 @@ def skip_unreadable_post(record): TEST_DATA_DIR = os.path.abspath(BASE_DIR + "/../test/data") -# Path to the email alias lists. Used by ietf.utils.aliases -DRAFT_ALIASES_PATH = os.path.join(TEST_DATA_DIR, "draft-aliases") -DRAFT_VIRTUAL_PATH = os.path.join(TEST_DATA_DIR, "draft-virtual") -DRAFT_VIRTUAL_DOMAIN = "virtual.ietf.org" - -GROUP_ALIASES_PATH = os.path.join(TEST_DATA_DIR, "group-aliases") -GROUP_VIRTUAL_PATH = os.path.join(TEST_DATA_DIR, "group-virtual") -GROUP_VIRTUAL_DOMAIN = "virtual.ietf.org" - -POSTCONFIRM_PATH = "/a/postconfirm/wrapper" USER_PREFERENCE_DEFAULTS = { "expires_soon" : "14", @@ -1099,21 +1253,23 @@ def skip_unreadable_post(record): "@ietf.org$", ] +# Configuration for django-markup MARKUP_SETTINGS = { 'restructuredtext': { 'settings_overrides': { + 'report_level': 3, # error (3) or severe (4) only 'initial_header_level': 3, 'doctitle_xform': False, 'footnote_references': 'superscript', 'trim_footnote_reference_space': True, 'default_reference_context': 'view', + 'raw_enabled': False, # critical for security + 'file_insertion_enabled': False, # critical for security 'link_base': '' } } } -MAILMAN_LIB_DIR = '/usr/lib/mailman' - # This is the number of seconds required between subscribing to an ietf # mailing list and datatracker account creation being accepted LIST_ACCOUNT_DELAY = 60*60*25 # 25 hours @@ -1122,14 +1278,13 @@ def skip_unreadable_post(record): SILENCED_SYSTEM_CHECKS = [ "fields.W342", # Setting unique=True on a ForeignKey has the same effect as using a OneToOneField. + "fields.W905", # django.contrib.postgres.fields.CICharField is deprecated. (see https://github.com/ietf-tools/datatracker/issues/5660) ] CHECKS_LIBRARY_PATCHES_TO_APPLY = [ 'patch/change-oidc-provider-field-sizes-228.patch', 'patch/fix-oidc-access-token-post.patch', 'patch/fix-jwkest-jwt-logging.patch', - 'patch/fix-django-password-strength-kwargs.patch', - 'patch/add-django-http-cookie-value-none.patch', 'patch/django-cookie-delete-with-all-settings.patch', 'patch/tastypie-django22-fielderror-response.patch', ] @@ -1172,6 +1327,19 @@ def skip_unreadable_post(record): CELERY_BROKER_URL = 'amqp://mq/' CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' CELERY_BEAT_SYNC_EVERY = 1 # update DB after every event +CELERY_BEAT_CRON_STARTING_DEADLINE = 1800 # seconds after a missed deadline before abandoning a cron task +CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True # the default, but setting it squelches a warning +# Use a result backend so we can chain tasks. This uses the rpc backend, see +# https://docs.celeryq.dev/en/stable/userguide/tasks.html#rpc-result-backend-rabbitmq-qpid +# Results can be retrieved only once and only by the caller of the task. Results will be +# lost if the message broker restarts. +CELERY_RESULT_BACKEND = 'django-cache' # use a Django cache for results +CELERY_CACHE_BACKEND = 'celery-results' # which Django cache to use +CELERY_RESULT_EXPIRES = datetime.timedelta(minutes=5) # how long are results valid? (Default is 1 day) +CELERY_TASK_IGNORE_RESULT = True # ignore results unless specifically enabled for a task +CELERY_TASK_ROUTES = { + "ietf.blobdb.tasks.pybob_the_blob_replicator_task": {"queue": "blobdb"} +} # Meetecho API setup: Uncomment this and provide real credentials to enable # Meetecho conference creation for interim session requests @@ -1181,12 +1349,17 @@ def skip_unreadable_post(record): # 'client_id': 'datatracker', # 'client_secret': 'some secret', # 'request_timeout': 3.01, # python-requests doc recommend slightly > a multiple of 3 seconds +# # How many minutes before/after session to enable slide update API. Defaults to 15. Set to None to disable, +# # or < 0 to _always_ send updates (useful for debugging) +# 'slides_notify_time': 15, +# 'debug': False, # if True, API calls will be echoed as debug instead of sent (only works for slides for now) # } # Meetecho URLs - instantiate with url.format(session=some_session) MEETECHO_ONSITE_TOOL_URL = "https://meetings.conf.meetecho.com/onsite{session.meeting.number}/?session={session.pk}" MEETECHO_VIDEO_STREAM_URL = "https://meetings.conf.meetecho.com/ietf{session.meeting.number}/?session={session.pk}" MEETECHO_AUDIO_STREAM_URL = "https://mp3.conf.meetecho.com/ietf{session.meeting.number}/{session.pk}.m3u" +MEETECHO_SESSION_RECORDING_URL = "https://meetecho-player.ietf.org/playout/?session={session_label}" # Put the production SECRET_KEY in settings_local.py, and also any other # sensitive or site-specific changes. DO NOT commit settings_local.py to svn. @@ -1207,6 +1380,122 @@ def skip_unreadable_post(record): MIDDLEWARE += DEV_MIDDLEWARE TEMPLATES[0]['OPTIONS']['context_processors'] += DEV_TEMPLATE_CONTEXT_PROCESSORS +if "CACHES" not in locals(): + if SERVER_MODE == "production": + MEMCACHED_HOST = os.environ.get("MEMCACHED_SERVICE_HOST", "127.0.0.1") + MEMCACHED_PORT = os.environ.get("MEMCACHED_SERVICE_PORT", "11211") + CACHES = { + "default": { + "BACKEND": "ietf.utils.cache.LenientMemcacheCache", + "LOCATION": f"{MEMCACHED_HOST}:{MEMCACHED_PORT}", + "VERSION": __version__, + "KEY_PREFIX": "ietf:dt", + # Key function is default except with sha384-encoded key + "KEY_FUNCTION": lambda key, key_prefix, version: ( + f"{key_prefix}:{version}:{sha384(str(key).encode('utf8')).hexdigest()}" + ), + }, + "proceedings": { + "BACKEND": "ietf.utils.cache.LenientMemcacheCache", + "LOCATION": f"{MEMCACHED_HOST}:{MEMCACHED_PORT}", + # No release-specific VERSION setting. + "KEY_PREFIX": "ietf:dt:proceedings", + # Key function is default except with sha384-encoded key + "KEY_FUNCTION": lambda key, key_prefix, version: ( + f"{key_prefix}:{version}:{sha384(str(key).encode('utf8')).hexdigest()}" + ), + }, + "sessions": { + "BACKEND": "ietf.utils.cache.LenientMemcacheCache", + "LOCATION": f"{MEMCACHED_HOST}:{MEMCACHED_PORT}", + # No release-specific VERSION setting. + "KEY_PREFIX": "ietf:dt", + }, + "htmlized": { + "BACKEND": "django.core.cache.backends.filebased.FileBasedCache", + "LOCATION": "/a/cache/datatracker/htmlized", + "OPTIONS": { + "MAX_ENTRIES": 100000, # 100,000 + }, + }, + "pdfized": { + "BACKEND": "django.core.cache.backends.filebased.FileBasedCache", + "LOCATION": "/a/cache/datatracker/pdfized", + "OPTIONS": { + "MAX_ENTRIES": 100000, # 100,000 + }, + }, + "slowpages": { + "BACKEND": "django.core.cache.backends.filebased.FileBasedCache", + "LOCATION": "/a/cache/datatracker/slowpages", + "OPTIONS": { + "MAX_ENTRIES": 5000, + }, + }, + "celery-results": { + "BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache", + "LOCATION": f"{MEMCACHED_HOST}:{MEMCACHED_PORT}", + "KEY_PREFIX": "ietf:celery", + }, + } + else: + CACHES = { + "default": { + "BACKEND": "django.core.cache.backends.dummy.DummyCache", + #'BACKEND': 'ietf.utils.cache.LenientMemcacheCache', + #'LOCATION': '127.0.0.1:11211', + #'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', + "VERSION": __version__, + "KEY_PREFIX": "ietf:dt", + }, + "proceedings": { + "BACKEND": "django.core.cache.backends.dummy.DummyCache", + # "BACKEND": "ietf.utils.cache.LenientMemcacheCache", + # "LOCATION": "127.0.0.1:11211", + # No release-specific VERSION setting. + "KEY_PREFIX": "ietf:dt:proceedings", + # Key function is default except with sha384-encoded key + "KEY_FUNCTION": lambda key, key_prefix, version: ( + f"{key_prefix}:{version}:{sha384(str(key).encode('utf8')).hexdigest()}" + ), + }, + "sessions": { + "BACKEND": "django.core.cache.backends.locmem.LocMemCache", + }, + "htmlized": { + "BACKEND": "django.core.cache.backends.dummy.DummyCache", + #'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', + "LOCATION": "/var/cache/datatracker/htmlized", + "OPTIONS": { + "MAX_ENTRIES": 1000, + }, + }, + "pdfized": { + "BACKEND": "django.core.cache.backends.dummy.DummyCache", + #'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', + "LOCATION": "/var/cache/datatracker/pdfized", + "OPTIONS": { + "MAX_ENTRIES": 1000, + }, + }, + "slowpages": { + "BACKEND": "django.core.cache.backends.dummy.DummyCache", + #'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', + "LOCATION": "/var/cache/datatracker/", + "OPTIONS": { + "MAX_ENTRIES": 5000, + }, + }, + "celery-results": { + "BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache", + "LOCATION": "app:11211", + "KEY_PREFIX": "ietf:celery", + }, + } + +PUBLISH_IPR_STATES = ['posted', 'removed', 'removed_objfalse'] + +ADVERTISE_VERSIONS = ["markdown", "pyang", "rfc2html", "xml2rfc"] # We provide a secret key only for test and development modes. It's # absolutely vital that django fails to start in production mode unless a @@ -1217,44 +1506,6 @@ def skip_unreadable_post(record): loaders = TEMPLATES[0]['OPTIONS']['loaders'] loaders = tuple(l for e in loaders for l in (e[1] if isinstance(e, tuple) and "cached.Loader" in e[0] else (e,))) TEMPLATES[0]['OPTIONS']['loaders'] = loaders - - CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', - #'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', - #'LOCATION': '127.0.0.1:11211', - #'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'VERSION': __version__, - 'KEY_PREFIX': 'ietf:dt', - }, - 'sessions': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - }, - 'htmlized': { - 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', - #'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'LOCATION': '/var/cache/datatracker/htmlized', - 'OPTIONS': { - 'MAX_ENTRIES': 1000, - }, - }, - 'pdfized': { - 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', - #'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'LOCATION': '/var/cache/datatracker/pdfized', - 'OPTIONS': { - 'MAX_ENTRIES': 1000, - }, - }, - 'slowpages': { - 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', - #'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'LOCATION': '/var/cache/datatracker/', - 'OPTIONS': { - 'MAX_ENTRIES': 5000, - }, - }, - } SESSION_ENGINE = "django.contrib.sessions.backends.db" if 'SECRET_KEY' not in locals(): @@ -1274,6 +1525,9 @@ def skip_unreadable_post(record): # Cannot have this set to True if we're using http: from the dev-server: CSRF_COOKIE_SECURE = False CSRF_COOKIE_SAMESITE = 'Lax' + CSRF_TRUSTED_ORIGINS += ['http://localhost:8000', 'http://127.0.0.1:8000', 'http://[::1]:8000'] SESSION_COOKIE_SECURE = False SESSION_COOKIE_SAMESITE = 'Lax' - + + +YOUTUBE_DOMAINS = ['www.youtube.com', 'youtube.com', 'youtu.be', 'm.youtube.com', 'youtube-nocookie.com', 'www.youtube-nocookie.com'] diff --git a/ietf/settings_postgrestest.py b/ietf/settings_postgrestest.py deleted file mode 100755 index 450fd9180b6..00000000000 --- a/ietf/settings_postgrestest.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright The IETF Trust 2010-2023, All Rights Reserved -# -*- coding: utf-8 -*- - - -# Standard settings except we use Postgres and skip migrations, this is -# useful for speeding up tests that depend on the test database, try -# for instance: -# -# ./manage.py test --settings=settings_postgrestest doc.ChangeStateTestCase -# - -import os -from ietf.settings import * # pyflakes:ignore -from ietf.settings import TEST_CODE_COVERAGE_CHECKER, BASE_DIR, PHOTOS_DIRNAME -import debug # pyflakes:ignore -debug.debug = True - -# Use a different hostname, to catch hardcoded values -IDTRACKER_BASE_URL = "https://postgrestest.ietf.org" - -# Workaround to avoid spending minutes stepping through the migrations in -# every test run. The result of this is to use the 'syncdb' way of creating -# the test database instead of doing it through the migrations. Taken from -# https://gist.github.com/NotSqrt/5f3c76cd15e40ef62d09 - -class DisableMigrations(object): - - def __contains__(self, item): - return True - - def __getitem__(self, item): - return None - -MIGRATION_MODULES = DisableMigrations() - - -DATABASES = { - 'default': { - 'HOST': 'db', - 'PORT': '5432', - 'NAME': 'test.db', - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'USER': 'django', - 'PASSWORD': 'RkTkDPFnKpko', - }, - } - -if TEST_CODE_COVERAGE_CHECKER and not TEST_CODE_COVERAGE_CHECKER._started: # pyflakes:ignore - TEST_CODE_COVERAGE_CHECKER.start() # pyflakes:ignore - -NOMCOM_PUBLIC_KEYS_DIR=os.path.abspath("tmp-nomcom-public-keys-dir") - -MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'test/media/') # pyflakes:ignore -MEDIA_URL = '/test/media/' -PHOTOS_DIR = MEDIA_ROOT + PHOTOS_DIRNAME # pyflakes:ignore - -# Undo any developer-dependent middleware when running the tests -MIDDLEWARE = [ c for c in MIDDLEWARE if not c in DEV_MIDDLEWARE ] # pyflakes:ignore - -TEMPLATES[0]['OPTIONS']['context_processors'] = [ p for p in TEMPLATES[0]['OPTIONS']['context_processors'] if not p in DEV_TEMPLATE_CONTEXT_PROCESSORS ] # pyflakes:ignore - -REQUEST_PROFILE_STORE_ANONYMOUS_SESSIONS = False diff --git a/ietf/settings_test.py b/ietf/settings_test.py new file mode 100755 index 00000000000..6479069db02 --- /dev/null +++ b/ietf/settings_test.py @@ -0,0 +1,116 @@ +# Copyright The IETF Trust 2010-2023, All Rights Reserved +# -*- coding: utf-8 -*- + + +# Standard settings except we use Postgres and skip migrations, this is +# useful for speeding up tests that depend on the test database, try +# for instance: +# +# ./manage.py test --settings=settings_test doc.ChangeStateTestCase +# + +import atexit +import os +import shutil +import tempfile +from ietf.settings import * # pyflakes:ignore +from ietf.settings import ORIG_AUTH_PASSWORD_VALIDATORS +import debug # pyflakes:ignore +debug.debug = True + +# Use a different hostname, to catch hardcoded values +IDTRACKER_BASE_URL = "https://postgrestest.ietf.org" + +# Workaround to avoid spending minutes stepping through the migrations in +# every test run. The result of this is to use the 'syncdb' way of creating +# the test database instead of doing it through the migrations. Taken from +# https://gist.github.com/NotSqrt/5f3c76cd15e40ef62d09 + +class DisableMigrations(object): + + def __contains__(self, item): + return True + + def __getitem__(self, item): + return None + +MIGRATION_MODULES = DisableMigrations() + + +DATABASES = { + 'default': { + 'HOST': 'db', + 'PORT': '5432', + 'NAME': 'test.db', + 'ENGINE': 'django.db.backends.postgresql', + 'USER': 'django', + 'PASSWORD': 'RkTkDPFnKpko', + }, + } + +# test with a single DB - do not use a DB router +BLOBDB_DATABASE = "default" +DATABASE_ROUTERS = [] # type: ignore + +if TEST_CODE_COVERAGE_CHECKER: # pyflakes:ignore + TEST_CODE_COVERAGE_CHECKER.start() # pyflakes:ignore + +def tempdir_with_cleanup(**kwargs): + """Utility to create a temporary dir and arrange cleanup""" + _dir = tempfile.mkdtemp(**kwargs) + atexit.register(shutil.rmtree, _dir) + return _dir + + +NOMCOM_PUBLIC_KEYS_DIR = tempdir_with_cleanup(suffix="-nomcom-public-keys-dir") + +MEDIA_ROOT = tempdir_with_cleanup(suffix="-media") +PHOTOS_DIRNAME = "photo" +PHOTOS_DIR = os.path.join(MEDIA_ROOT, PHOTOS_DIRNAME) +os.mkdir(PHOTOS_DIR) + +# Undo any developer-dependent middleware when running the tests +MIDDLEWARE = [ c for c in MIDDLEWARE if not c in DEV_MIDDLEWARE ] # pyflakes:ignore + +TEMPLATES[0]['OPTIONS']['context_processors'] = [ p for p in TEMPLATES[0]['OPTIONS']['context_processors'] if not p in DEV_TEMPLATE_CONTEXT_PROCESSORS ] # pyflakes:ignore + +REQUEST_PROFILE_STORE_ANONYMOUS_SESSIONS = False + +# Override loggers with a safer set in case things go to the log during testing. Specifically, +# make sure there are no syslog loggers that might send things to a real syslog. +LOGGING["loggers"] = { # pyflakes:ignore + 'django': { + 'handlers': ['debug_console'], + 'level': 'INFO', + }, + 'django.request': { + 'handlers': ['debug_console'], + 'level': 'ERROR', + }, + 'django.server': { + 'handlers': ['django.server'], + 'level': 'INFO', + }, + 'django.security': { + 'handlers': ['debug_console', ], + 'level': 'INFO', + }, + 'oidc_provider': { + 'handlers': ['debug_console', ], + 'level': 'DEBUG', + }, + 'datatracker': { + 'handlers': ['debug_console'], + 'level': 'INFO', + }, + 'celery': { + 'handlers': ['debug_console'], + 'level': 'INFO', + }, +} + +# Restore AUTH_PASSWORD_VALIDATORS if they were reset in settings_local +try: + AUTH_PASSWORD_VALIDATORS = ORIG_AUTH_PASSWORD_VALIDATORS +except NameError: + pass diff --git a/ietf/settings_testcrawl.py b/ietf/settings_testcrawl.py index a1b5ce8946d..40744a228df 100644 --- a/ietf/settings_testcrawl.py +++ b/ietf/settings_testcrawl.py @@ -27,9 +27,11 @@ 'MAX_ENTRIES': 10000, }, }, + 'proceedings': { + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', + }, 'sessions': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - # No version-specific VERSION setting. }, 'htmlized': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', diff --git a/ietf/static/css/custom-bs-import.scss b/ietf/static/css/custom-bs-import.scss new file mode 100644 index 00000000000..644efdcf108 --- /dev/null +++ b/ietf/static/css/custom-bs-import.scss @@ -0,0 +1,58 @@ +@import "bootstrap/scss/functions"; + +// Enable negative margin classes. +$enable-negative-margins: true; + +// Don't add carets to dropdowns by default. +// $enable-caret: false; + +$popover-max-width: 100%; + +// Override default fonts + +$font-family-sans-serif: "Inter", +system-ui, +-apple-system, +"Segoe UI", +Roboto, +"Helvetica Neue", +"Noto Sans", +"Liberation Sans", +Arial, +sans-serif, +"Apple Color Emoji", +"Segoe UI Emoji", +"Segoe UI Symbol", +"Noto Color Emoji"; +$font-family-monospace: "Noto Sans Mono", +SFMono-Regular, +Menlo, +Monaco, +Consolas, +"Liberation Mono", +"Courier New", +monospace; + +// Enable color modes +$color-mode-type: data; + +@import "bootstrap/scss/variables"; +@import "bootstrap/scss/variables-dark"; + +$h1-font-size: $font-size-base * 2.2; +$h2-font-size: $font-size-base * 1.8; +$h3-font-size: $font-size-base * 1.6; +$h4-font-size: $font-size-base * 1.4; +$h5-font-size: $font-size-base * 1.2; +$h6-font-size: $font-size-base; + +// Default is gray-800, which is the same as the range slider background. +$light-bg-subtle-dark: mix($gray-800, $black); + +@import "bootstrap/scss/maps"; +@import "bootstrap/scss/mixins"; +@import "bootstrap/scss/utilities"; +@import "bootstrap/scss/root"; + + + diff --git a/ietf/static/css/datepicker.scss b/ietf/static/css/datepicker.scss index 21d6aac2469..88f9e835fdb 100644 --- a/ietf/static/css/datepicker.scss +++ b/ietf/static/css/datepicker.scss @@ -1,2 +1,6 @@ -@import "vanillajs-datepicker/sass/index-bs5"; +@import "custom-bs-import"; + +// FIXME: color.scale doesn't seem to work with CSS variables, so avoid those:` +$dp-cell-focus-background-color: $dropdown-link-hover-bg !default; + @import "vanillajs-datepicker/sass/datepicker-bs5"; diff --git a/ietf/static/css/document_html.scss b/ietf/static/css/document_html.scss index 32a1b9e4d15..47ef8d64b47 100644 --- a/ietf/static/css/document_html.scss +++ b/ietf/static/css/document_html.scss @@ -1,22 +1,9 @@ @use "sass:map"; -// FIXME: It's not clear why these three variables remain unset by bs5, but just -// set them to placeholder values so the CSS embedded in the HTML validates. -$btn-font-family: inherit !default; -$nav-link-font-weight: inherit !default; -$tooltip-margin: inherit !default; - -$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -$font-family-monospace: "Noto Sans Mono", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - -@import "bootstrap/scss/functions"; -@import "bootstrap/scss/variables"; -@import "bootstrap/scss/maps"; -@import "bootstrap/scss/mixins"; -@import "bootstrap/scss/utilities"; -@import "bootstrap/scss/root"; +@import "custom-bs-import"; // Layout & components +// Only import what we need: @import "bootstrap/scss/reboot"; @import "bootstrap/scss/type"; // @import "bootstrap/scss/images"; @@ -26,7 +13,7 @@ $font-family-monospace: "Noto Sans Mono", SFMono-Regular, Menlo, Monaco, Consola @import "bootstrap/scss/forms"; @import "bootstrap/scss/buttons"; @import "bootstrap/scss/transitions"; -// @import "bootstrap/scss/dropdown"; +@import "bootstrap/scss/dropdown"; @import "bootstrap/scss/button-group"; @import "bootstrap/scss/nav"; @import "bootstrap/scss/navbar"; @@ -66,12 +53,42 @@ $font-family-monospace: "Noto Sans Mono", SFMono-Regular, Menlo, Monaco, Consola scrollbar-width: none; } -.sidebar-toggle[aria-expanded="true"] { +.sidebar-toggle[aria-expanded="true"] .sidebar-shown { display: none; } -.sidebar-toggle[aria-expanded="false"] { - display: inherit; +.sidebar-toggle[aria-expanded="false"] .sidebar-collapsed { + display: none; +} + +.sidebar-toolbar { + z-index: 1; +} + +// Toggle classes for dark/light modes +[data-bs-theme="dark"] { + .d-dm-none { + display: none; + } + + .d-lm-none { + display: initial; + } +} + +[data-bs-theme="light"] { + .d-dm-none { + display: initial; + } + + .d-lm-none { + display: none; + } +} + +// Show theme toggler checkbox +.dropdown-menu .active .bi { + display: block !important; } @media screen { @@ -141,6 +158,7 @@ $font-family-monospace: "Noto Sans Mono", SFMono-Regular, Menlo, Monaco, Consola pre, code { font-size: 1em; + overflow: visible; } pre { @@ -302,6 +320,11 @@ tbody.meta tr { background-color: $danger; } +.badge-generic { + color: white; + background-color: $danger; +} + #toc-nav { width: inherit; overscroll-behavior-y: none; // Prevent overscrolling from scrolling the main content @@ -333,11 +356,13 @@ tbody.meta tr { page-break-inside: avoid; } + /* a:link, a:visited { // color: inherit; // text-decoration: none; } +*/ .newpage { page-break-before: always !important; diff --git a/ietf/static/css/document_html_txt.scss b/ietf/static/css/document_html_txt.scss index 278a340dbfd..a5991056c96 100644 --- a/ietf/static/css/document_html_txt.scss +++ b/ietf/static/css/document_html_txt.scss @@ -1,8 +1,7 @@ -// Based on https://github.com/martinthomson/rfc-txt-html/blob/db4be92247979541cd26a32b7b2bf0e044ca098b/txt.css -// (Version hash to make future merging easier.) +// Based on https://github.com/martinthomson/rfc-txt-html/blob/main/txt.css :root { - --line: 1.2em; + --line: 1.3em; --block: 0 0 0 3ch; --paragraph: var(--line) 0 var(--line) 3ch; } @@ -70,7 +69,7 @@ figure { blockquote { @include margin-paragraph; // margin: var(--paragraph); padding-left: calc(2ch - 2px); - border-left: 2px solid darkgrey; + border-left: 2px solid var(--bs-border-color); } /* Header junk */ @@ -166,6 +165,7 @@ blockquote { #identifiers dd.authors .author { display: inline-block; margin: 0 2ch 0 1ch; + min-height: calc(2 * var(--line)); } #identifiers dd.authors .author:last-of-type { margin-right: 0; @@ -344,7 +344,7 @@ div:is(.artwork, .sourcecode) pre { flex: 0 0 content; margin: 0; max-width: 72ch; - overflow: auto; + overflow: auto clip; } div:is(.artwork, .sourcecode) .pilcrow { flex: 0 0 1ch; @@ -375,7 +375,7 @@ thead, tfoot { border-bottom-style: double; } td, th { - border: 1px solid black; + border: 1px solid var(--bs-border-color); // padding: var(--half-line) 1ch; padding-top: var(--half-line); padding-right: 1ch; @@ -394,7 +394,7 @@ td, th { /* Links */ a.selfRef, a.pilcrow, .iref + a.internal { - color: black; + color: inherit; text-decoration: none; } a.relref, a.xref { @@ -425,8 +425,8 @@ sup, sub { /* Authors */ address, address.vcard { font-style: normal; - // margin: 2em 0 var(--line) 3ch; - margin-top: 2em; + // margin: var(--line) 0 var(--line) 3ch + margin-top: var(--line); margin-right: 0; margin-bottom: var(--line); margin-left: 3ch; @@ -450,4 +450,19 @@ section > p, section > dl.references > dd { * doesn't break words at '/' like other browsers. */ overflow-wrap: break-word; } + +/* From https://github.com/martinthomson/rfc-css/blob/main/rfc.css */ +/* SVG Trick: a prefix match works because only black and white are allowed */ +svg :is([stroke="black"], [stroke^="#000"]) { + stroke: var(--bs-body-color); +} +svg :is([stroke="white"], [stroke^="#fff"]) { + stroke: var(--bs-body-bg); +} +svg :is([fill="black"], [fill^="#000"], :not([fill])) { + fill: var(--bs-body-color); +} +svg :is([fill="white"], [fill^="#fff"]) { + fill: var(--bs-body-bg); +} } diff --git a/ietf/static/css/highcharts.scss b/ietf/static/css/highcharts.scss new file mode 100644 index 00000000000..d2f5d5e0e74 --- /dev/null +++ b/ietf/static/css/highcharts.scss @@ -0,0 +1,6 @@ +@import "npm:highcharts/css/highcharts.css"; +@import "custom-bs-import"; + +.highcharts-container { + font-family: $font-family-sans-serif; +} diff --git a/ietf/static/css/ietf.scss b/ietf/static/css/ietf.scss index 88c9cbda073..df973863d53 100644 --- a/ietf/static/css/ietf.scss +++ b/ietf/static/css/ietf.scss @@ -1,37 +1,9 @@ @use "sass:map"; -@import "bootstrap/scss/functions"; - -// Enable negative margin classes. -$enable-negative-margins: true; - -// Don't add carets to dropdowns by default. -// $enable-caret: false; - -$popover-max-width: 100%; - -// Override default fonts - -$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -$font-family-monospace: "Noto Sans Mono", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - -// Only import what we need: - -@import "bootstrap/scss/variables"; - -$h1-font-size: $font-size-base * 2.2; -$h2-font-size: $font-size-base * 1.8; -$h3-font-size: $font-size-base * 1.6; -$h4-font-size: $font-size-base * 1.4; -$h5-font-size: $font-size-base * 1.2; -$h6-font-size: $font-size-base; - -@import "bootstrap/scss/maps"; -@import "bootstrap/scss/mixins"; -@import "bootstrap/scss/utilities"; -@import "bootstrap/scss/root"; +@import "custom-bs-import"; // Layout & components +// Only import what we need: @import "bootstrap/scss/reboot"; @import "bootstrap/scss/type"; @import "bootstrap/scss/images"; @@ -75,7 +47,7 @@ url("npm:bootstrap-icons/font/fonts/bootstrap-icons.woff") format("woff"); @import "bootstrap-icons/font/bootstrap-icons"; // Leave room for fixed-top navbar... -body { +body.navbar-offset { padding-top: 60px; } @@ -84,6 +56,55 @@ html { scroll-padding-top: 60px; } +// Toggle classes for dark/light modes +[data-bs-theme="dark"] { + .d-dm-none { + display: none; + } + + .d-lm-none { + display: initial; + } +} + +[data-bs-theme="light"] { + .d-dm-none { + display: initial; + } + + .d-lm-none { + display: none; + } +} + +// Make submenus open on hover. +@include media-breakpoint-up(lg) { + .dropdown-menu>li>ul { + display: none; + } + + .dropdown-menu>li:hover>ul { + display: block; + } + +} + +@include media-breakpoint-up(md) { + .leftmenu .nav>li>ul { + display: none; + } + + .leftmenu .nav>li:hover>ul { + display: block; + } +} + +:is(.dropdown-menu, .leftmenu .nav) .dropdown-menu { + top: 0; + left: 100%; + right: auto; +} + // Make textareas in forms use a monospace font textarea.form-control { font-family: $font-family-code; @@ -132,8 +153,8 @@ pre { --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; + --#{$prefix}dropdown-link-color: #{$nav-link-color}; + --#{$prefix}dropdown-link-hover-color: #{$nav-link-hover-color}; --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; @@ -208,16 +229,20 @@ th, .group-menu .dropdown-menu { height: auto; width: auto; - max-height: 35em; + max-height: 95vh; overflow-x: hidden; overflow-y: auto; } // Helper to constrain the size of the main logo .ietflogo { - width: 75%; + width: 100%; max-width: 300px; } +.ietflogo > img { + min-width: 100px; + width: 100%; +} // Make revision numbers pagination items fixed-width .revision-list { @@ -272,13 +297,13 @@ th, } // Styles for d3.js graphical SVG timelines -#timeline { +#doc-timeline { font-size: small; .axis path, .axis line { fill: none; - stroke: black; + stroke: var(--bs-body-color); } .axis.y path, @@ -295,7 +320,7 @@ th, } .bar text { - fill: black; + fill: var(--bs-body-color); dominant-baseline: central; pointer-events: none; } @@ -334,7 +359,7 @@ th, } .ballot-icon table .my { - border: 2 * $table-border-width solid #000; + border: calc(2 * $table-border-width) solid var(--bs-emphasis-color); } // See https://getbootstrap.com/docs/5.1/customize/color/#all-colors @@ -446,36 +471,64 @@ td.position-recuse { } td.position-norecord { - background-color: $white; // $color-norecord; + background-color: transparent; } td.position-empty { border: none !important; } -tr.position-moretime-row, -tr.position-notready-row, -tr.position-discuss-row, -tr.position-block-row { - background-color: tint-color($color-discuss, 85%); -} +[data-bs-theme="light"] { -tr.position-yes-row { - background-color: tint-color($color-yes, 75%); -} + tr.position-moretime-row, + tr.position-notready-row, + tr.position-discuss-row, + tr.position-block-row { + background-color: tint-color($color-discuss, 85%); + } -tr.position-noobj-row { - background-color: tint-color($color-noobj, 50%); -} + tr.position-yes-row { + background-color: tint-color($color-yes, 75%); + } -tr.position-abstain-row { - background-color: tint-color($color-abstain, 85%); -} + tr.position-noobj-row { + background-color: tint-color($color-noobj, 50%); + } -tr.position-recuse-row { - background-color: tint-color($color-recuse, 85%); + tr.position-abstain-row { + background-color: tint-color($color-abstain, 85%); + } + + tr.position-recuse-row { + background-color: tint-color($color-recuse, 85%); + } } +[data-bs-theme="dark"] { + + tr.position-moretime-row, + tr.position-notready-row, + tr.position-discuss-row, + tr.position-block-row { + background-color: shade-color($color-discuss, 65%); + } + + tr.position-yes-row { + background-color: shade-color($color-yes, 65%); + } + + tr.position-noobj-row { + background-color: shade-color($color-noobj, 65%); + } + + tr.position-abstain-row { + background-color: shade-color($color-abstain, 65%); + } + + tr.position-recuse-row { + background-color: shade-color($color-recuse, 65%); + } +} /* === Edit Meeting Schedule ====================================== */ @@ -513,7 +566,7 @@ tr.position-recuse-row { } .edit-meeting-schedule .edit-grid .day-label .swap-days:hover { - color: #666; + color: var(--bs-secondary-color); } .edit-meeting-schedule #swap-days-modal .modal-body label { @@ -545,15 +598,15 @@ tr.position-recuse-row { } .edit-meeting-schedule .edit-grid .time-header .time-label.would-violate-hint { - background-color: #ffe0e0; - outline: #ffe0e0 solid 0.4em; + background-color: var(--bs-danger-bg-subtle); + outline: var(--bs-danger-bg-subtle) solid 0.4em; } .edit-meeting-schedule .edit-grid .time-header .time-label span { display: inline-block; width: 100%; text-align: center; - color: #444444; + color: var(--bs-secondary-color); } .edit-meeting-schedule .edit-grid .timeslots { @@ -565,7 +618,7 @@ tr.position-recuse-row { .edit-meeting-schedule .edit-grid .timeslot { position: relative; display: inline-block; - background-color: #f4f4f4; + background-color: var(--bs-secondary-bg); height: 100%; overflow: hidden; } @@ -578,7 +631,7 @@ tr.position-recuse-row { width: 100%; align-items: center; justify-content: center; - color: #999; + color: var(--bs-tertiary-color); } .edit-meeting-schedule .edit-grid .timeslot .drop-target { @@ -595,22 +648,22 @@ tr.position-recuse-row { } .edit-meeting-schedule .edit-grid .timeslot.overfull { - border-right: 0.3em dashed #f55000; + border-right: 0.3em dashed var(--bs-danger); /* cut-off illusion */ } .edit-meeting-schedule .edit-grid .timeslot.would-violate-hint { - background-color: #ffe0e0; - outline: #ffe0e0 solid 0.4em; + background-color: var(--bs-danger-bg-subtle); + outline: var(--bs-danger-bg-subtle) solid 0.4em; } .edit-meeting-schedule .edit-grid .timeslot.would-violate-hint.dropping { - background-color: #ccb3b3; + background-color: var(--bs-danger); } .edit-meeting-schedule .constraints .encircled, .edit-meeting-schedule .formatted-constraints .encircled { - border: 1px solid #000; + border: 1px solid var( --bs-body-color); border-radius: 1em; padding: 0 0.3em; text-align: center; @@ -623,7 +676,7 @@ tr.position-recuse-row { /* sessions */ .edit-meeting-schedule .session { - background-color: #fff; + background-color: var(--bs-body-bg); margin: 0.2em; padding-right: 0.2em; padding-left: 0.5em; @@ -635,15 +688,15 @@ tr.position-recuse-row { .edit-meeting-schedule .session.selected { cursor: grabbing; - outline: #0000ff solid 0.2em; - /* blue, width matches margin on .session */ + outline: var(--bs-primary) solid 0.2em; + /* width matches margin on .session */ z-index: 2; /* render above timeslot outlines */ } .edit-meeting-schedule .session.other-session-selected { - outline: #00008b solid 0.2em; - /* darkblue, width matches margin on .session */ + outline: 0.3em solid var(--bs-info); + box-shadow: 0 0 1em var(--bs-info); z-index: 2; /* render above timeslot outlines */ } @@ -654,7 +707,7 @@ tr.position-recuse-row { .edit-meeting-schedule .session.readonly { cursor: default; - background-color: #ddd; + background-color: var(--bs-dark-bg-subtle); } .edit-meeting-schedule .session.hidden-parent * { @@ -668,13 +721,12 @@ tr.position-recuse-row { } .edit-meeting-schedule .session.highlight { - outline-color: #ff8c00; - /* darkorange */ - background-color: #f3f3f3; + outline-color: var(--bs-warning); + background-color: var(--bs-light); } .edit-meeting-schedule .session.would-violate-hint { - outline: 0.3em solid #F55000; + outline: 0.3em solid var(--bs-danger); z-index: 1; /* raise up so the outline is not overdrawn */ } @@ -696,6 +748,7 @@ tr.position-recuse-row { .edit-meeting-schedule .edit-grid, .edit-meeting-schedule .session { + // Removing this font-family style causes selenium tests to fail :-( font-family: arial, helvetica, sans-serif; font-size: 11px; } @@ -767,9 +820,9 @@ tr.position-recuse-row { bottom: 0; left: 0; width: 100%; - border-top: 0.2em solid #ccc; + border-top: 0.2em solid var(--bs-border-color); margin-bottom: 2em; - background-color: #fff; + background-color: var(--bs-body-bg); opacity: 0.95; z-index: 5; /* raise above edit-grid items */ @@ -784,7 +837,7 @@ tr.position-recuse-row { min-height: 4em; max-height: 13em; overflow-y: auto; - background-color: #f4f4f4; + background-color: var(--bs-secondary-bg); } .edit-meeting-schedule .unassigned-sessions.dropping { @@ -841,7 +894,7 @@ tr.position-recuse-row { font-weight: normal; margin-right: 1em; padding: 0 1em; - border: 0.1em solid #eee; + border: 0.1em solid var(--bs-border-color); cursor: pointer; } @@ -907,7 +960,7 @@ tr.position-recuse-row { } .edit-meeting-timeslots-and-misc-sessions .room-row { - border-bottom: 1px solid #ccc; + border-bottom: 1px solid var(--bs-border-color); // height: 20px; display: flex; cursor: pointer; @@ -927,13 +980,13 @@ tr.position-recuse-row { } .edit-meeting-timeslots-and-misc-sessions .timeline.hover { - background: radial-gradient(#999 1px, transparent 1px); + background: radial-gradient(var(--bs-tertiary-color) 1px, transparent 1px); background-size: 20px 20px; } .edit-meeting-timeslots-and-misc-sessions .timeline.selected.hover, .edit-meeting-timeslots-and-misc-sessions .timeline.selected { - background: radial-gradient(#999 2px, transparent 2px); + background: radial-gradient(var(--bs-tertiary-color) 2px, transparent 2px); background-size: 20px 20px; } @@ -949,8 +1002,8 @@ tr.position-recuse-row { white-space: nowrap; cursor: pointer; padding-left: 0.2em; - border-left: 1px solid #999; - border-right: 1px solid #999; + border-left: 1px solid var(--bs-border-color); + border-right: 1px solid var(--bs-border-color); } .edit-meeting-timeslots-and-misc-sessions .timeslot:hover { @@ -970,10 +1023,10 @@ tr.position-recuse-row { bottom: 0; left: 0; width: 100%; - border-top: 0.2em solid #ccc; + border-top: 0.2em solid var(--bs-border-color); padding-top: 0.2em; margin-bottom: 2em; - background-color: #fff; + background-color: var(--bs-body-bg); opacity: 0.95; } @@ -1021,7 +1074,7 @@ tr.position-recuse-row { } .timeslot-edit .tstable div.timeslot { - border: #000000 solid 1px; + border: var(--bs-body-color) solid 1px; border-radius: 0.5em; padding: 0.5em; } @@ -1051,7 +1104,7 @@ tr.position-recuse-row { } .timeslot-edit .tstable .tstype_unavail { - background-color: #666; + background-color: var(--bs-secondary-color); } .timeslot-edit .official-use-warning { @@ -1134,3 +1187,32 @@ tr.position-recuse-row { } } } + +blockquote { + padding-left: 1rem; + border-left: solid 1px var(--bs-body-color); +} + +iframe.status { + background-color:transparent; + border:none; + width:100%; + height:3.5em; +} + +.overflow-shadows { + transition: box-shadow 0.5s; +} + +.overflow-shadows--both { + box-shadow: inset 0px 21px 18px -20px var(--bs-body-color), + inset 0px -21px 18px -20px var(--bs-body-color); +} + +.overflow-shadows--top-only { + box-shadow: inset 0px 21px 18px -20px var(--bs-body-color); +} + +.overflow-shadows--bottom-only { + box-shadow: inset 0px -21px 18px -20px var(--bs-body-color); +} diff --git a/ietf/static/css/list.scss b/ietf/static/css/list.scss index d52fc879a70..595bf360d57 100644 --- a/ietf/static/css/list.scss +++ b/ietf/static/css/list.scss @@ -1,6 +1,4 @@ -// Import bootstrap helpers -@import "bootstrap/scss/functions"; -@import "bootstrap/scss/variables"; +@import "custom-bs-import"; table .sort { cursor: pointer; diff --git a/ietf/static/css/select2.scss b/ietf/static/css/select2.scss index 44824a358a3..c8e3da7adc6 100644 --- a/ietf/static/css/select2.scss +++ b/ietf/static/css/select2.scss @@ -1,5 +1,7 @@ -@import "bootstrap/scss/functions"; -@import "bootstrap/scss/variables"; -@import "bootstrap/scss/mixins"; +@import "custom-bs-import"; + +// FIXME: bs-5.3.0 workaround from https://github.com/apalfrey/select2-bootstrap-5-theme/issues/75#issuecomment-1573265695 +$s2bs5-border-color: $border-color; + @import "select2/src/scss/core"; @import "select2-bootstrap-5-theme/src/include-all"; diff --git a/ietf/static/images/iab-logo-white.svg b/ietf/static/images/iab-logo-white.svg new file mode 100644 index 00000000000..264b7bb842f --- /dev/null +++ b/ietf/static/images/iab-logo-white.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + diff --git a/ietf/static/images/ietf-logo-nor-white.svg b/ietf/static/images/ietf-logo-nor-white.svg index 004e58af807..42c033600fd 100644 --- a/ietf/static/images/ietf-logo-nor-white.svg +++ b/ietf/static/images/ietf-logo-nor-white.svg @@ -1,26 +1,136 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ietf/static/images/ietf-logo-white.svg b/ietf/static/images/ietf-logo-white.svg new file mode 100644 index 00000000000..2417f917ce3 --- /dev/null +++ b/ietf/static/images/ietf-logo-white.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ietf/static/images/irtf-logo-white.svg b/ietf/static/images/irtf-logo-white.svg new file mode 100644 index 00000000000..a67412581e8 --- /dev/null +++ b/ietf/static/images/irtf-logo-white.svg @@ -0,0 +1,65 @@ + + + + + R + + + + + + diff --git a/ietf/static/images/irtf-logo.svg b/ietf/static/images/irtf-logo.svg index be64890b256..10b2a968163 100644 --- a/ietf/static/images/irtf-logo.svg +++ b/ietf/static/images/irtf-logo.svg @@ -6,7 +6,7 @@ version="1.1" id="svg303" sodipodi:docname="irtf-logo.svg" - inkscape:version="1.2.1 (9c6d41e4, 2022-07-14)" + inkscape:version="1.2.2 (b0a84865, 2022-12-01)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" @@ -24,12 +24,12 @@ inkscape:deskcolor="#d1d1d1" showgrid="false" inkscape:zoom="1.0373737" - inkscape:cx="304.1334" - inkscape:cy="446.80136" + inkscape:cx="303.65142" + inkscape:cy="447.76535" inkscape:window-width="1797" inkscape:window-height="1083" inkscape:window-x="951" - inkscape:window-y="445" + inkscape:window-y="417" inkscape:window-maximized="0" inkscape:current-layer="svg303" /> R { + const form = document.getElementById('delete_recordings_form') + const dialog = document.getElementById('delete_confirm_dialog') + const dialog_link = document.getElementById('delete_confirm_link') + const dialog_submit = document.getElementById('delete_confirm_submit') + const dialog_cancel = document.getElementById('delete_confirm_cancel') + + dialog.style.maxWidth = '30vw' + + form.addEventListener('submit', (e) => { + e.preventDefault() + dialog_submit.value = e.submitter.value + const recording_link = e.submitter.closest('tr').querySelector('a') + dialog_link.setAttribute('href', recording_link.getAttribute('href')) + dialog_link.textContent = recording_link.textContent + dialog.showModal() + }) + + dialog_cancel.addEventListener('click', (e) => { + e.preventDefault() + dialog.close() + }) + + document.addEventListener('keydown', (e) => { + if (dialog.open && e.key === 'Escape') { + dialog.close() + } + }) +}) diff --git a/ietf/static/js/announcement.js b/ietf/static/js/announcement.js new file mode 100644 index 00000000000..95465120fa8 --- /dev/null +++ b/ietf/static/js/announcement.js @@ -0,0 +1,57 @@ +const announcementApp = (function() { + 'use strict'; + return { + // functions for Announcement + checkToField: function() { + document.documentElement.scrollTop = 0; // For most browsers + const toField = document.getElementById('id_to'); + const toCustomInput = document.getElementById('id_to_custom'); + const toCustomDiv = toCustomInput.closest('div.row'); + + if (toField.value === 'Other...') { + toCustomDiv.style.display = 'flex'; // Show the custom field + } else { + toCustomDiv.style.display = 'none'; // Hide the custom field + toCustomInput.value = ''; // Optionally clear the input value if hidden + } + } + }; +})(); + +// Extra care is required to ensure the back button +// works properly for the optional to_custom field. +// Take the case when a user selects "Other..." for +// "To" field. The "To custom" field appears and they +// enter a new address there. +// In Chrome, when the form is submitted and then the user +// uses the back button (or browser back), the page loads +// from bfcache then the javascript DOMContentLoaded event +// handler is run, hiding the empty to_custom field, THEN the +// browser autofills the form fields. Because to_submit +// is now hidden it does not get a value. This is a very +// bad experience for the user because the to_custom field +// was unexpectedly cleared and hidden. If they notice this +// they would need to know to first select another "To" +// option, then select "Other..." again just to get the +// to_custom field visible so they can re-enter the custom +// address. +// The solution is to use setTimeout to run checkToField +// after a short delay, giving the browser time to autofill +// the form fields before it checks to see if the to_custom +// field is empty and hides it. + +document.addEventListener('DOMContentLoaded', function() { + // Run the visibility check after allowing cache to populate values + setTimeout(announcementApp.checkToField, 300); + + const toField = document.getElementById('id_to'); + toField.addEventListener('change', announcementApp.checkToField); +}); + +// Handle back/forward navigation with pageshow +window.addEventListener('pageshow', function(event) { + if (event.persisted) { + // Then apply visibility logic after cache restoration + setTimeout(announcementApp.checkToField, 300); + } +}); \ No newline at end of file diff --git a/ietf/static/js/complete-review.js b/ietf/static/js/complete-review.js index a359dac237c..3a58ba97007 100644 --- a/ietf/static/js/complete-review.js +++ b/ietf/static/js/complete-review.js @@ -24,6 +24,8 @@ $(document) .before(mailArchiveSearchTemplate); var mailArchiveSearch = form.find(".mail-archive-search"); + const isReviewer = mailArchiveSearch.data('isReviewer'); + const searchMailArchiveUrl = mailArchiveSearch.data('searchMailArchiveUrl'); var retrievingData = null; @@ -190,4 +192,4 @@ $(document) form.find("[name=review_submission][value=link]") .trigger("click"); } - }); \ No newline at end of file + }); diff --git a/ietf/static/js/custom_striped.js b/ietf/static/js/custom_striped.js new file mode 100644 index 00000000000..480ad7cf828 --- /dev/null +++ b/ietf/static/js/custom_striped.js @@ -0,0 +1,16 @@ +// Copyright The IETF Trust 2025, All Rights Reserved + +document.addEventListener('DOMContentLoaded', () => { + // add stripes + const firstRow = document.querySelector('.custom-stripe .row') + if (firstRow) { + const parent = firstRow.parentElement; + const allRows = Array.from(parent.children).filter(child => child.classList.contains('row')) + allRows.forEach((row, index) => { + row.classList.remove('bg-light') + if (index % 2 === 1) { + row.classList.add('bg-light') + } + }) + } +}) diff --git a/ietf/static/js/document_timeline.js b/ietf/static/js/document_timeline.js index babde0deeb4..d8532c36233 100644 --- a/ietf/static/js/document_timeline.js +++ b/ietf/static/js/document_timeline.js @@ -86,7 +86,7 @@ function scale_x() { } function update_x_axis() { - d3.select("#timeline svg .x.axis") + d3.select("#doc-timeline svg .x.axis") .call(x_axis) .selectAll("text") .style("text-anchor", "end") @@ -96,7 +96,7 @@ function update_x_axis() { function update_timeline() { bar_y = {}; scale_x(); - var chart = d3.select("#timeline svg") + var chart = d3.select("#doc-timeline svg") .attr("width", width); // enter data (skip the last pseudo entry) var bar = chart.selectAll("g") @@ -111,12 +111,12 @@ function draw_timeline() { bar_height = parseFloat($("body") .css("line-height")); - var div = $("#timeline"); + var div = $("#doc-timeline"); div.addClass("my-3"); if (div.is(":empty")) { div.append(""); } - var chart = d3.select("#timeline svg") + var chart = d3.select("#doc-timeline svg") .attr("width", width); var defs = chart.append("defs"); @@ -249,7 +249,7 @@ d3.json("doc.json") published: expiration_date(data[data.length - 1]) }); - width = $("#timeline") + width = $("#doc-timeline") .width(); draw_timeline(); } @@ -258,11 +258,11 @@ d3.json("doc.json") $(window) .on({ resize: function () { - var g = $("#timeline svg"); + var g = $("#doc-timeline svg"); g.remove(); - width = $("#timeline") + width = $("#doc-timeline") .width(); - $("#timeline") + $("#doc-timeline") .append(g); update_timeline(); } diff --git a/ietf/static/js/draft-submit.js b/ietf/static/js/draft-submit.js index 4d813a7fbef..38ac7eb2633 100644 --- a/ietf/static/js/draft-submit.js +++ b/ietf/static/js/draft-submit.js @@ -66,28 +66,31 @@ $(function () { }); - // Reload page periodically if the enableAutoReload checkbox is present and checked - const autoReloadSwitch = document.getElementById("enableAutoReload"); - const timeSinceDisplay = document.getElementById("time-since-uploaded"); - if (autoReloadSwitch) { - const autoReloadTime = 30000; // ms - let autoReloadTimeoutId; - autoReloadSwitch.parentElement.classList.remove("d-none"); - timeSinceDisplay.classList.remove("d-none"); - autoReloadTimeoutId = setTimeout(() => location.reload(), autoReloadTime); - autoReloadSwitch.addEventListener("change", (e) => { - if (e.currentTarget.checked) { - if (!autoReloadTimeoutId) { - autoReloadTimeoutId = setTimeout(() => location.reload(), autoReloadTime); - timeSinceDisplay.classList.remove("d-none"); - } - } else { - if (autoReloadTimeoutId) { - clearTimeout(autoReloadTimeoutId); - autoReloadTimeoutId = null; - timeSinceDisplay.classList.add("d-none"); - } + // If draft is validating, poll until validation is complete, then reload the page + const submissionValidatingAlert = document.getElementById('submission-validating-alert'); + if (submissionValidatingAlert) { + let statusPollTimer; + const statusUrl = submissionValidatingAlert.dataset['submissionStatusUrl']; + let statusPollInterval = 2000; // ms + const maxPollInterval = 32000; // ms + + function checkStatus() { + if (statusPollInterval < maxPollInterval) { + statusPollInterval *= 2; } - }); + const xhr = new XMLHttpRequest(); + xhr.open("GET", statusUrl, true); + xhr.onload = (e) => { + if (xhr.response && xhr.response.state !== 'validating') { + location.reload(); + } else { + statusPollTimer = setTimeout(checkStatus, statusPollInterval); + } + }; + xhr.onerror = (e) => {statusPollTimer = setTimeout(checkStatus, statusPollInterval);}; + xhr.responseType = 'json'; + xhr.send(''); + } + statusPollTimer = setTimeout(checkStatus, statusPollInterval); } }); diff --git a/ietf/static/js/edit-meeting-schedule.js b/ietf/static/js/edit-meeting-schedule.js index 21fc284ca1c..2a73a8c29d4 100644 --- a/ietf/static/js/edit-meeting-schedule.js +++ b/ietf/static/js/edit-meeting-schedule.js @@ -50,6 +50,7 @@ $(function () { let sessionPurposeInputs = schedEditor.find('.session-purpose-toggles input'); let timeSlotGroupInputs = schedEditor.find("#timeslot-group-toggles-modal .modal-body .individual-timeslots input"); let sessionParentInputs = schedEditor.find(".session-parent-toggles input"); + let sessionParentToggleAll = schedEditor.find(".session-parent-toggles .session-parent-toggle-all") const classes_to_hide = '.hidden-timeslot-group,.hidden-timeslot-type'; // hack to work around lack of position sticky support in old browsers, see https://caniuse.com/#feat=css-sticky @@ -487,13 +488,13 @@ $(function () { // Disable a particular swap modal radio input let updateSwapRadios = function (labels, radios, disableValue, datePrecision) { - labels.removeClass('text-muted'); + labels.removeClass('text-body-secondary'); radios.prop('disabled', false); radios.prop('checked', false); // disable the input requested by value let disableInput = radios.filter('[value="' + disableValue + '"]'); if (disableInput) { - disableInput.parent().addClass('text-muted'); + disableInput.parent().addClass('text-body-secondary'); disableInput.prop('disabled', true); } if (officialSchedule) { @@ -502,7 +503,7 @@ $(function () { const past_radios = radios.filter( (_, radio) => parseISOTimestamp(radio.closest('*[data-start]').dataset.start).isSameOrBefore(now, datePrecision) ); - past_radios.parent().addClass('text-muted'); + past_radios.parent().addClass('text-body-secondary'); past_radios.prop('disabled', true); } return disableInput; // return the input that was specifically disabled, if any @@ -769,6 +770,17 @@ $(function () { sessionParentInputs.on("click", updateSessionParentToggling); updateSessionParentToggling(); + // Toggle _all_ session parents + function toggleAllSessionParents() { + if (sessionParentInputs.filter(":checked").length < sessionParentInputs.length) { + sessionParentInputs.prop("checked", true); + } else { + sessionParentInputs.prop("checked", false); + } + updateSessionParentToggling(); + } + sessionParentToggleAll.on("click", toggleAllSessionParents); + // Toggling timeslot types function updateTimeSlotTypeToggling() { const checkedTypes = jQuery.map(timeSlotTypeInputs.filter(":checked"), elt => elt.value); @@ -859,10 +871,10 @@ $(function () { .not('.hidden') .length === 0) { purpose_input.setAttribute('disabled', 'disabled'); - purpose_input.closest('.session-purpose-toggle').classList.add('text-muted'); + purpose_input.closest('.session-purpose-toggle').classList.add('text-body-secondary'); } else { purpose_input.removeAttribute('disabled'); - purpose_input.closest('.session-purpose-toggle').classList.remove('text-muted'); + purpose_input.closest('.session-purpose-toggle').classList.remove('text-body-secondary'); } }); } @@ -1020,4 +1032,4 @@ $(function () { .on("mouseleave", ".other-session", function () { sessions.filter("#session" + this.dataset.othersessionid).removeClass("highlight"); }); -}); \ No newline at end of file +}); diff --git a/ietf/static/js/highcharts.js b/ietf/static/js/highcharts.js index 0b99f87a59f..6c3b68051f0 100644 --- a/ietf/static/js/highcharts.js +++ b/ietf/static/js/highcharts.js @@ -6,6 +6,8 @@ import Highcharts_Export_Data from "highcharts/modules/export-data"; import Highcharts_Accessibility from "highcharts/modules/accessibility"; import Highcharts_Sunburst from "highcharts/modules/sunburst"; +document.documentElement.style.setProperty("--highcharts-background-color", "transparent"); + Highcharts_Exporting(Highcharts); Highcharts_Offline_Exporting(Highcharts); Highcharts_Export_Data(Highcharts); @@ -13,17 +15,9 @@ Highcharts_Accessibility(Highcharts); Highcharts_Sunburst(Highcharts); Highcharts.setOptions({ - // use colors from https://colorbrewer2.org/#type=qualitative&scheme=Paired&n=12 - colors: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', - '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', - '#ffff99', '#b15928' - ], chart: { height: "100%", - style: { - fontFamily: getComputedStyle(document.body) - .getPropertyValue('--bs-body-font-family') - } + styledMode: true, }, credits: { enabled: false @@ -35,7 +29,7 @@ window.Highcharts = Highcharts; window.group_stats = function (url, chart_selector) { $.getJSON(url, function (data) { $(chart_selector) - .each(function (i, e) { + .each(function (_, e) { const dataset = e.dataset.dataset; if (!dataset) { console.log("dataset data attribute not set"); diff --git a/ietf/static/js/highstock.js b/ietf/static/js/highstock.js index e1965acb625..05b1250ed0c 100644 --- a/ietf/static/js/highstock.js +++ b/ietf/static/js/highstock.js @@ -5,9 +5,20 @@ import Highcharts_Offline_Exporting from "highcharts/modules/offline-exporting"; import Highcharts_Export_Data from "highcharts/modules/export-data"; import Highcharts_Accessibility from"highcharts/modules/accessibility"; +document.documentElement.style.setProperty("--highcharts-background-color", "transparent"); + Highcharts_Exporting(Highcharts); Highcharts_Offline_Exporting(Highcharts); Highcharts_Export_Data(Highcharts); Highcharts_Accessibility(Highcharts); +Highcharts.setOptions({ + chart: { + styledMode: true, + }, + credits: { + enabled: false + }, +}); + window.Highcharts = Highcharts; diff --git a/ietf/static/js/ietf.js b/ietf/static/js/ietf.js index d6be021a2bf..09fa324e42c 100644 --- a/ietf/static/js/ietf.js +++ b/ietf/static/js/ietf.js @@ -13,7 +13,7 @@ import "bootstrap/js/dist/scrollspy"; import "bootstrap/js/dist/tab"; // import "bootstrap/js/dist/toast"; import "bootstrap/js/dist/tooltip"; - +import { debounce } from 'lodash-es'; import jquery from "jquery"; window.$ = window.jQuery = jquery; @@ -57,7 +57,7 @@ $(document) var text = $(this) .text(); // insert some at strategic places - var newtext = text.replace(/([@._])/g, "$1"); + var newtext = text.replace(/(\S)([@._+])(\S)/g, "$1$2$3"); if (newtext === text) { return; } @@ -91,20 +91,57 @@ $(document) // }); }); -$(document) - .ready(function () { +function overflowShadows(el) { + function handleScroll(){ + const canScrollUp = el.scrollTop > 0 + const canScrollDown = el.offsetHeight + el.scrollTop < el.scrollHeight + el.classList.toggle("overflow-shadows--both", canScrollUp && canScrollDown) + el.classList.toggle("overflow-shadows--top-only", canScrollUp && !canScrollDown) + el.classList.toggle("overflow-shadows--bottom-only", !canScrollUp && canScrollDown) + } - function dropdown_hover(e) { - var navbar = $(this) - .closest(".navbar"); - if (navbar.length === 0 || navbar.find(".navbar-toggler") - .is(":hidden")) { - $(this) - .children(".dropdown-toggle") - .dropdown(e.type == "mouseenter" ? "show" : "hide"); - } + el.addEventListener("scroll", handleScroll, {passive: true}) + handleScroll() + + const observer = new IntersectionObserver(handleScroll) + observer.observe(el) // el won't have scrollTop etc when hidden, so we need to recalculate when it's revealed + + return () => { + el.removeEventListener("scroll", handleScroll) + observer.unobserve(el) + } +} + +function ensureDropdownOnscreen(elm) { + const handlePlacement = () => { + if(!(elm instanceof HTMLElement)) { + return } + const rect = elm.getBoundingClientRect() + const BUFFER_PX = 5 // additional distance from bottom of viewport + const existingStyleTop = parseInt(elm.style.top, 10) + const offscreenBy = Math.round(window.innerHeight - (rect.top + rect.height) - BUFFER_PX) + if(existingStyleTop === offscreenBy) { + console.log(`Already set top to ${offscreenBy}. Ignoring`) + // already set, nothing to do + return + } + if(offscreenBy < 0) { + elm.style.top = `${offscreenBy}px` + } + } + + const debouncedHandler = debounce(handlePlacement, 100) + + const observer = new MutationObserver(debouncedHandler) + observer.observe(elm, { + attributes: true + }) +} + +$(document) + .ready(function () { // load data for the menu $.ajax({ url: $(document.body) @@ -120,7 +157,7 @@ $(document) } attachTo.find(".dropdown-menu") .remove(); - var menu = ['
    • @@ -241,47 +273,67 @@ {% endif %}
    • - Agenda
    • - Materials
    • - Floor plan
    • - Registration
    • - Important dates
    • - + Request a session
    • + {% if user|can_request_interim %} +
    • + + Request an interim meeting + +
    • + {% endif %}
    • - Session requests
    • + {% if user|matman_groups %} + {% if flavor == 'top' %}
    • {% endif %} +
    • Manage
    • + {% for g in user|matman_groups %} +
    • + + {{ g.acronym }} {{ g.type_id }} meetings + +
    • + {% endfor %} + {% endif %} {% if flavor == 'top' %} {% if flavor == 'top' %}
    • @@ -292,7 +344,7 @@
    • {% endif %}
    • - Upcoming meetings @@ -307,13 +359,13 @@
    • {% endif %}
    • - Past meetings
    • - Meeting proceedings @@ -339,56 +391,64 @@
    • {% endif %}
    • - IPR disclosures
    • - Liaison statements
    • + {% if user|has_role:"Secretariat,IAB,Liaison Manager,Liaison Coordinator" %} +
    • + + List of other SDO groups + +
    • + {% endif %}
    • - IESG agenda
    • - NomComs
    • - Downref registry
    • - Statistics
    • - - Tutorials - -
    • -
    • - API Help
    • - Release notes
    • +
    • + + System status + +
    • {% if flavor == 'top' %}
    • {% endif %}
    • - @@ -432,4 +492,4 @@ {% endif %} {% if flavor == 'top' %} {% include "base/menu_user.html" %} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/ietf/templates/base/menu_user.html b/ietf/templates/base/menu_user.html index bb68855b6eb..fd921638a45 100644 --- a/ietf/templates/base/menu_user.html +++ b/ietf/templates/base/menu_user.html @@ -1,4 +1,4 @@ -{# Copyright The IETF Trust 2015, All Rights Reserved #} +{# Copyright The IETF Trust 2015-2023, All Rights Reserved #} {% load origin %} {% origin %} {% load ietf_filters %} @@ -23,7 +23,7 @@ {% url 'django.contrib.auth.views.logout' as logout_url %} {% if request.get_full_path == logout_url %}
    • - Sign in @@ -32,14 +32,16 @@ {% else %} {% if user.is_authenticated %}
    • - - Sign out - +
      + {% csrf_token %} + +
    • - Account info @@ -47,35 +49,35 @@
    • {% if user and user.person %}
    • - Public profile page
    • {% endif %}
    • - Preferences
    • - API keys
    • - Change password
    • - Change username @@ -83,21 +85,21 @@
    • {% else %}
    • - + href="{% url 'ietf.ietfauth.views.login' %}?next={{ request.get_full_path|removeprefix:'/accounts/login/?next='|urlencode }}"> Sign in
    • - Password reset
    • - Preferences @@ -107,15 +109,46 @@ {% endif %} {% if not request.user.is_authenticated %}
    • - New account
    • {% endif %} +
    • + + List subscriptions + + +
    • {% if user|has_role:"Reviewer" %}
    • - My reviews @@ -125,31 +158,31 @@ {% if flavor == "top" %}
    • {% endif %}
    • AD dashboard
    • - My docs
    • - Next telechat
    • - Discusses
    • - Milestone review
    • - Last Call docs @@ -161,35 +194,29 @@ IETF secretariat
    • - Telechat dates
    • - Management items
    • - Milestones
    • - Sync discrepancies
    • -
    • - - Account allowlist - -
    • {% endif %} {% if user|has_role:"IANA" %} {% if flavor == "top" %} @@ -200,7 +227,7 @@ IANA
    • - Sync discrepancies @@ -215,7 +242,7 @@ RFC Editor
    • - Sync discrepancies diff --git a/ietf/templates/base/menu_wg.html b/ietf/templates/base/menu_wg.html index 3ab7ca399bf..5ca1be8a4e8 100644 --- a/ietf/templates/base/menu_wg.html +++ b/ietf/templates/base/menu_wg.html @@ -2,8 +2,11 @@ {% load origin %} {% origin %} {% for p in parents %} + {% if p.acronym == "iab" %} +
    • IESG
    • + {% endif%}
    • - {{ p.short_name }} diff --git a/ietf/templates/base/status.html b/ietf/templates/base/status.html new file mode 100644 index 00000000000..33e1abf699b --- /dev/null +++ b/ietf/templates/base/status.html @@ -0,0 +1,2 @@ + +
      \ No newline at end of file diff --git a/ietf/templates/community/atom.xml b/ietf/templates/community/atom.xml index 32e3b002923..01dcdfeee7f 100644 --- a/ietf/templates/community/atom.xml +++ b/ietf/templates/community/atom.xml @@ -3,7 +3,7 @@ {{ title }} {{ subtitle }} {{ id }} - {{ updated|date:"Y-m-d\TH:i:sO" }} + {{ updated.isoformat }} @@ -17,11 +17,11 @@ - {{ entry.id }} + urn:datatracker-ietf-org:event:{{ entry.id }} - {{ entry.time|date:"Y-m-d\TH:i:sO" }} + {{ entry.time.isoformat }} - {{ entry.time|date:"Y-m-d\TH:i:sO" }} + {{ entry.time.isoformat }} {{ entry.by }} diff --git a/ietf/templates/community/list_menu.html b/ietf/templates/community/list_menu.html index d54695775fc..009d01152d3 100644 --- a/ietf/templates/community/list_menu.html +++ b/ietf/templates/community/list_menu.html @@ -3,18 +3,18 @@ {% if clist.pk != None %} + href="{% if clist.group %}{% url "ietf.community.views.subscription" acronym=clist.group.acronym %}{% else %}{% url "ietf.community.views.subscription" email_or_name=email_or_name %}{% endif %}"> {% if subscribed %} Change subscription @@ -24,7 +24,7 @@ {% endif %} + href="{% if clist.group %}{% url "ietf.community.views.export_to_csv" acronym=clist.group.acronym %}{% else %}{% url "ietf.community.views.export_to_csv" email_or_name=email_or_name %}{% endif %}"> Export as CSV - \ No newline at end of file + diff --git a/ietf/templates/community/subscription.html b/ietf/templates/community/subscription.html index e8b562a47d7..4b92a610e13 100644 --- a/ietf/templates/community/subscription.html +++ b/ietf/templates/community/subscription.html @@ -32,7 +32,7 @@

      Existing subscriptions

      {% endif %}

      Add new subscription

      -

      +

      The email addresses you can choose between are those registered in your profile.

      diff --git a/ietf/templates/community/untrack_document.html b/ietf/templates/community/untrack_document.html index 985dcad89b1..fe94081a79b 100644 --- a/ietf/templates/community/untrack_document.html +++ b/ietf/templates/community/untrack_document.html @@ -1,17 +1,14 @@ {# Copyright The IETF Trust 2015, All Rights Reserved #} +{% extends "base.html" %} {% load origin %} {% origin %} -{% load django_bootstrap5 %} {% block title %}Remove tracking of document {{ name }}{% endblock %} -{% bootstrap_messages %} -
      - {% csrf_token %} -

      - Remove {{ name }} from the list? -

      - -
      +{% block content %} +
      + {% csrf_token %} +

      + Remove {{ name }} from the list? +

      + +
      +{% endblock %} \ No newline at end of file diff --git a/ietf/templates/community/view_list.html b/ietf/templates/community/view_list.html index 17650beb101..a543eaf7cf8 100644 --- a/ietf/templates/community/view_list.html +++ b/ietf/templates/community/view_list.html @@ -12,7 +12,7 @@

      {{ clist.long_name }}

      {% bootstrap_messages %} {% if can_manage_list %} + href="{% url "ietf.community.views.manage_list" email_or_name=email_or_name %}"> Manage list @@ -22,4 +22,4 @@

      {{ clist.long_name }}

      {% endblock %} {% block js %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/ietf/templates/cookies/settings.html b/ietf/templates/cookies/settings.html index 5ded2f3bd63..3515491c358 100644 --- a/ietf/templates/cookies/settings.html +++ b/ietf/templates/cookies/settings.html @@ -12,7 +12,7 @@

      User settings

      cookies disabled then you will not be able to change the settings (everything still continues to work by using default settings).

      -

      How many days is considered "new"?

      +

      How many days is considered "new"?

      This setting affects how many days are considered "new enough" to get the special highlighting in the documents table. The default setting is {{ defaults.new_enough }} days.

      @@ -60,7 +60,7 @@

      How many days is considered "new"?

      90 days

      -

      How many days is considered "soon"?

      +

      How many days is considered "soon"?

      This setting tells what is considered "soon" when showing documents that are going to be expire soon. The Default setting is {{ defaults.expires_soon }} days.

      @@ -108,7 +108,7 @@

      How many days is considered "soon"?

      90 days

      -

      Show full document text by default?

      +

      Show full document text by default?

      Show the full text immediately on the document page instead of only showing beginning of it. This defaults to {{ defaults.full_draft }}.

      @@ -128,7 +128,7 @@

      Show full document text by default?

      On

      -

      Show the left-hand menu?

      +

      Show the left-hand menu?

      Show the left-hand menu on all regular pages? This defaults to {{ defaults.left_menu }}.

      @@ -148,4 +148,24 @@

      Show the left-hand menu?

      On

      + + +

      Which color mode should be used?

      +

      + Use a light, dark or automatic (as indicated by OS) color mode. +

      +

      + + + Light + + + + Dark + + + + Auto + +

      {% endblock %} \ No newline at end of file diff --git a/ietf/templates/debug.html b/ietf/templates/debug.html index f7788e776c3..c459359d3e7 100644 --- a/ietf/templates/debug.html +++ b/ietf/templates/debug.html @@ -103,7 +103,7 @@
    • - {% endfor %} -
    - {% endif %}" - {% endif %} - {% with label.2 as up_is_good %} - {% if prev < count %} - class="bi bi-arrow-up-right-circle{% if count %}-fill{% endif %} {{ up_is_good|yesno:'text-success,text-danger,text-muted' }}" - {% elif prev > count %} - class="bi bi-arrow-down-right-circle{% if count %}-fill{% endif %} {{ up_is_good|yesno:'text-danger,text-success,text-muted' }}" - {% else %} - class="bi bi-arrow-right-circle text-muted" - {% endif %} - > - {% endwith %} - {% endif %} -{% endif %} \ No newline at end of file diff --git a/ietf/templates/doc/ad_list.html b/ietf/templates/doc/ad_list.html index 189754e8ac7..cac709021ea 100644 --- a/ietf/templates/doc/ad_list.html +++ b/ietf/templates/doc/ad_list.html @@ -3,42 +3,80 @@ {% load origin static %} {% load ietf_filters %} {% block pagehead %} - + + {% endblock %} -{% block title %}Area directors{% endblock %} +{% block morecss %} + table .border-bottom { border-bottom-color: var(--highcharts-neutral-color-80) !important; } + .highcharts-container .highcharts-axis-labels { + font-size: .7rem; + fill: var(--bs-body-color) + } + .highcharts-container .highcharts-graph { stroke-width: 2.5; } + .highcharts-container .highcharts-color-0 { + fill: var(--bs-body-color); + stroke: var(--bs-primary); + } + .highcharts-container .highcharts-data-label text { + font-size: 1rem; + font-weight: inherit; + fill: var(--bs-body-color) + } +{% endblock %} +{% block title %}IESG Dashboard{% endblock %} {% block content %} {% origin %} -

    Area Director Workload

    +

    IESG Dashboard

    {% if user|has_role:"Area Director,Secretariat" %}
    - {{ delta.days }}-day trend indicators + {{ delta }}-day trend graphs are only shown to logged-in Area Directors.
    {% endif %} - {% for group in workload %} -

    {{ group.group_type }} State Counts

    - +

    + Documents in IESG Processing + IESG view of Working Groups +

    + {% for dt in metadata %} +

    {{ dt.type.1 }} State Counts

    +
    - {% for g, desc, up_is_good in group.group_names %} - + {% endif %} + {% for state, state_name in dt.states %} + {% endfor %} - {% for ad, ad_data in group.counts %} + {% for ad in dt.ads %} - {% for label, count, prev, docs_delta in ad_data %} - + {% endif %} + {% for state, state_name in dt.states %} + {% endfor %} @@ -47,9 +85,19 @@

    {{ group.group_type }} Stat

    - {% for label, count, prev in group.sums %} - + {% endif %} + {% for state, state_name in dt.states %} + {% endfor %} @@ -69,4 +117,177 @@

    {{ group.group_type }} Stat }); }); + + {{ data|json_script:"data" }} + + + + + {% endblock %} \ No newline at end of file diff --git a/ietf/templates/doc/add_comment.html b/ietf/templates/doc/add_comment.html index 0783b2486c8..211cb380dbc 100644 --- a/ietf/templates/doc/add_comment.html +++ b/ietf/templates/doc/add_comment.html @@ -2,13 +2,14 @@ {# Copyright The IETF Trust 2015, All Rights Reserved #} {% load origin %} {% load django_bootstrap5 %} -{% block title %}Add comment for {{ doc }}{% endblock %} +{% block title %}Add comment for +{% if review_req %} {{ review_req }} {% else %} {{ doc }} {% endif %} {% endblock %} {% block content %} {% origin %}

    Add comment
    - {{ doc }} + {% if review_req %} {{ review_req }} {% else %} {{ doc }} {% endif %}

    {% csrf_token %} @@ -17,7 +18,12 @@

    The comment will be added to the history trail.

    {% bootstrap_button button_type="submit" content="Submit" %} + {% if review_req %} + Back + {% else %} Back + {% endif %} {% endblock %} \ No newline at end of file diff --git a/ietf/templates/doc/add_sessionpresentation.html b/ietf/templates/doc/add_sessionpresentation.html index a5bcf7096a6..0bd751a4654 100644 --- a/ietf/templates/doc/add_sessionpresentation.html +++ b/ietf/templates/doc/add_sessionpresentation.html @@ -8,7 +8,7 @@

    Add document to session
    - {{ doc.name }} + {{ doc.name }}
    {{ doc.title }}

    diff --git a/ietf/templates/doc/badge/doc-badge-draft.html b/ietf/templates/doc/badge/doc-badge-draft.html new file mode 100644 index 00000000000..f7f66b6c5e6 --- /dev/null +++ b/ietf/templates/doc/badge/doc-badge-draft.html @@ -0,0 +1,16 @@ +{% load origin %} +{% load static %} +{% load ietf_filters %} +{% load person_filters %} +{% origin %} +{# Non-RFC #} + +{% if doc.became_rfc %} + This is an older version of an Internet-Draft that was ultimately published as {{doc.became_rfc.name|prettystdname}}. +{% elif snapshot and doc.rev != latest_rev %} + This is an older version of an Internet-Draft whose latest revision state is "{{ doc.doc.get_state }}". +{% else %} + {% if snapshot and doc.rev == latest_rev %}{{ doc.doc.get_state }}{% else %}{{ doc.get_state }}{% endif %} Internet-Draft + {% if submission %}({{ submission|safe }}){% endif %} + {% if resurrected_by %}- resurrect requested by {{ resurrected_by }}{% endif %} +{% endif %} \ No newline at end of file diff --git a/ietf/templates/doc/badge/doc-badge-rfc.html b/ietf/templates/doc/badge/doc-badge-rfc.html new file mode 100644 index 00000000000..780f14a54fe --- /dev/null +++ b/ietf/templates/doc/badge/doc-badge-rfc.html @@ -0,0 +1,13 @@ +{% load origin %} +{% load static %} +{% load ietf_filters %} +{% load person_filters %} +{% origin %} + +RFC + {% if not document_html %} + - {{ doc.std_level }} + {% else %} + {{ doc.std_level }} + {% endif %} + diff --git a/ietf/templates/doc/ballot/approvaltext.html b/ietf/templates/doc/ballot/approvaltext.html index 1b228ba3759..3cb632b8f8c 100644 --- a/ietf/templates/doc/ballot/approvaltext.html +++ b/ietf/templates/doc/ballot/approvaltext.html @@ -9,7 +9,7 @@

    Approval announcement writeup
    - {{ doc }} + {{ doc }}

    {% csrf_token %} @@ -29,7 +29,7 @@

    href="{% url 'ietf.doc.views_ballot.approve_ballot' name=doc.name %}">Approve ballot {% endif %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/ballot/approve_ballot.html b/ietf/templates/doc/ballot/approve_ballot.html index a146acf4e96..30dd05fa434 100644 --- a/ietf/templates/doc/ballot/approve_ballot.html +++ b/ietf/templates/doc/ballot/approve_ballot.html @@ -8,7 +8,7 @@

    Approve ballot
    - {{ doc }} + {{ doc }}

    {% csrf_token %} @@ -21,7 +21,7 @@

    {% endif %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/ballot/approve_downrefs.html b/ietf/templates/doc/ballot/approve_downrefs.html index 67caf992c74..ad528c67bf3 100644 --- a/ietf/templates/doc/ballot/approve_downrefs.html +++ b/ietf/templates/doc/ballot/approve_downrefs.html @@ -8,20 +8,20 @@

    Approve downward references
    - {{ doc }} + {{ doc }}

    The ballot for - {{ doc }} + {{ doc }} was just approved.

    {% if not downrefs_to_rfc %}

    No downward references for - {{ doc }} + {{ doc }}

    Back + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}">Back {% else %}

    Add downward references to RFCs to the DOWNREF registry, if they were identified in the IETF Last Call and approved by the Sponsoring Area Director. @@ -41,7 +41,7 @@

    {% csrf_token %} {% bootstrap_form approve_downrefs_form %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Add no DOWNREF entries diff --git a/ietf/templates/doc/ballot/ballot_issued.html b/ietf/templates/doc/ballot/ballot_issued.html index 5549cd1189c..dfa03896e9f 100644 --- a/ietf/templates/doc/ballot/ballot_issued.html +++ b/ietf/templates/doc/ballot/ballot_issued.html @@ -7,11 +7,11 @@

    Ballot issued
    - {{ doc }} + {{ doc }}

    Ballot for - {{ doc }} + {{ doc }} has been sent out.

    {% if doc.telechat_date %} @@ -24,5 +24,5 @@

    {% endif %} Back + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}">Back {% endblock %} diff --git a/ietf/templates/doc/ballot/clear_ballot.html b/ietf/templates/doc/ballot/clear_ballot.html index d1f731ba705..09e7dfef1bf 100644 --- a/ietf/templates/doc/ballot/clear_ballot.html +++ b/ietf/templates/doc/ballot/clear_ballot.html @@ -8,20 +8,20 @@

    Clear ballot
    - {{ doc }} + {{ doc }}

    {% csrf_token %}

    Clear the ballot for - {{ doc }}? + {{ doc }}?
    This will clear all ballot positions and discuss entries.

    + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/ballot/defer_ballot.html b/ietf/templates/doc/ballot/defer_ballot.html index 85f887c9ab8..ae7099e9e14 100644 --- a/ietf/templates/doc/ballot/defer_ballot.html +++ b/ietf/templates/doc/ballot/defer_ballot.html @@ -8,20 +8,20 @@

    Defer ballot
    - {{ doc }} + {{ doc }}

    {% csrf_token %}

    Defer the ballot for - {{ doc }}? + {{ doc }}?
    The ballot will then be put on the IESG agenda of {{ telechat_date }}.

    + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/ballot/edit_position.html b/ietf/templates/doc/ballot/edit_position.html index e3cada526bb..b57e9a36522 100644 --- a/ietf/templates/doc/ballot/edit_position.html +++ b/ietf/templates/doc/ballot/edit_position.html @@ -8,7 +8,7 @@

    Change position for {{ balloter.plain_name }}
    - {{ doc }} + {{ doc }}

    {% if ballot.ballot_type.question %}
    @@ -20,24 +20,48 @@

    Ballot deferred by {{ ballot_deferred.by }} on {{ ballot_deferred.time|date:"Y-m-d" }}.

    {% endif %} +
    +
    + {% if form.errors or cc_select_form.errors or additional_cc_form.errors %} +
    + There were errors in the submitted form -- see below. Please correct these and resubmit. +
    + {% if form.errors %} +
    Position entry
    + {% bootstrap_form_errors form %} + {% endif %} + {% if cc_select_form.errors %} +
    CC selection
    + {% bootstrap_form_errors cc_select_form %} + {% endif %} + {% if additional_cc_form.errors %} +
    Additional Cc Addresses
    + {% bootstrap_form_errors additional_cc_form %} + {% endif %} + {% endif %}
    {% csrf_token %} {% for field in form %} {% if field.name == "discuss" %}
    {% endif %} {% bootstrap_field field %} {% if field.name == "discuss" and old_pos and old_pos.discuss_time %} -
    Last edited {{ old_pos.discuss_time }}
    +
    Last saved {{ old_pos.discuss_time }}
    {% elif field.name == "comment" and old_pos and old_pos.comment_time %} -
    Last edited {{ old_pos.comment_time }}
    +
    Last saved {{ old_pos.comment_time }}
    {% endif %} {% if field.name == "discuss" %}
    {% endif %} {% endfor %} + {% bootstrap_form cc_select_form %} + {% bootstrap_form additional_cc_form %}
    + - + {% if doc.type_id == "draft" or doc.type_id == "conflrev" %} {% if doc.stream.slug != "irtf" %} {% if ballot_deferred %} @@ -54,11 +78,28 @@

    {% endif %} {% endif %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back

    - + + + {% endblock %} {% block js %} + + {% endblock %} \ No newline at end of file diff --git a/ietf/templates/doc/ballot/irsg_ballot_approve.html b/ietf/templates/doc/ballot/irsg_ballot_approve.html index 8b28f04c3ab..9eb0cc80bea 100644 --- a/ietf/templates/doc/ballot/irsg_ballot_approve.html +++ b/ietf/templates/doc/ballot/irsg_ballot_approve.html @@ -12,7 +12,7 @@

    Issue ballot
    - {{ doc }} + {{ doc }}

    {{ question }} diff --git a/ietf/templates/doc/ballot/irsg_ballot_close.html b/ietf/templates/doc/ballot/irsg_ballot_close.html index ab49ec79d7b..22405df1c19 100644 --- a/ietf/templates/doc/ballot/irsg_ballot_close.html +++ b/ietf/templates/doc/ballot/irsg_ballot_close.html @@ -8,7 +8,7 @@

    Close ballot
    - {{ doc }} + {{ doc }}

    {{ question }} diff --git a/ietf/templates/doc/ballot/lastcalltext.html b/ietf/templates/doc/ballot/lastcalltext.html index 5b49f6b372a..fe2b884c2b2 100644 --- a/ietf/templates/doc/ballot/lastcalltext.html +++ b/ietf/templates/doc/ballot/lastcalltext.html @@ -9,7 +9,7 @@

    Last call text
    - {{ doc }} + {{ doc }}

    {% csrf_token %} @@ -39,7 +39,7 @@

    href="{% url 'ietf.doc.views_ballot.make_last_call' name=doc.name %}">Issue last call {% endif %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/ballot/rfceditornote.html b/ietf/templates/doc/ballot/rfceditornote.html index ff6ca7078cc..8a6d57379d8 100644 --- a/ietf/templates/doc/ballot/rfceditornote.html +++ b/ietf/templates/doc/ballot/rfceditornote.html @@ -8,7 +8,7 @@

    RFC Editor Note
    - {{ doc }} + {{ doc }}

    {% bootstrap_messages %}
    @@ -31,7 +31,7 @@

    Clear + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/ballot/rsab_ballot_approve.html b/ietf/templates/doc/ballot/rsab_ballot_approve.html index 43f43eafeee..d607348722e 100644 --- a/ietf/templates/doc/ballot/rsab_ballot_approve.html +++ b/ietf/templates/doc/ballot/rsab_ballot_approve.html @@ -9,7 +9,7 @@

    Issue ballot
    - {{ doc }} + {{ doc }}

    {{ question }} diff --git a/ietf/templates/doc/ballot/rsab_ballot_close.html b/ietf/templates/doc/ballot/rsab_ballot_close.html index 2261c070b51..f6da3e052d8 100644 --- a/ietf/templates/doc/ballot/rsab_ballot_close.html +++ b/ietf/templates/doc/ballot/rsab_ballot_close.html @@ -8,7 +8,7 @@

    Close ballot
    - {{ doc }} + {{ doc }}

    {{ question }} diff --git a/ietf/templates/doc/ballot/send_ballot_comment.html b/ietf/templates/doc/ballot/send_ballot_comment.html deleted file mode 100644 index 8f87bf51ad6..00000000000 --- a/ietf/templates/doc/ballot/send_ballot_comment.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{# Copyright The IETF Trust 2015, All Rights Reserved #} -{% load origin %} -{% load django_bootstrap5 %} -{% load ietf_filters %} -{% block title %}Send ballot position for {{ balloter }} on {{ doc }}{% endblock %} -{% block content %} - {% origin %} -

    - Send ballot position for {{ balloter }} -
    - {{ doc }} -

    -
    - {% csrf_token %} -
    - - -
    -
    - - -
    - {% bootstrap_form cc_select_form %} -
    - - -
    Separate email addresses with commas.
    -
    -
    - - -
    -
    -

    Body

    -
    {{ body|maybewordwrap }}
    -
    - - - Back - - -{% endblock %} diff --git a/ietf/templates/doc/ballot/undefer_ballot.html b/ietf/templates/doc/ballot/undefer_ballot.html index df2217fa2ff..4e86698160c 100644 --- a/ietf/templates/doc/ballot/undefer_ballot.html +++ b/ietf/templates/doc/ballot/undefer_ballot.html @@ -8,7 +8,7 @@

    Undefer ballot
    - {{ doc }} + {{ doc }}

    {% csrf_token %} @@ -19,7 +19,7 @@

    + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/ballot/writeupnotes.html b/ietf/templates/doc/ballot/writeupnotes.html index 481e00e134b..8e985c15c79 100644 --- a/ietf/templates/doc/ballot/writeupnotes.html +++ b/ietf/templates/doc/ballot/writeupnotes.html @@ -8,18 +8,23 @@

    Ballot writeup and notes
    - {{ doc }} + {{ doc }}

    {% csrf_token %} {% bootstrap_form ballot_writeup_form %}
    - Technical summary, Working Group summary, document quality, personnel, IRTF note, IESG note, IANA note. This text will be appended to all announcements and messages to the IRTF or RFC Editor. - {% if ballot_issue_danger %} + Technical summary, Working Group summary, document quality, personnel, IANA note. This text will be appended to all announcements and messages to the IRTF or RFC Editor. + {% if warn_lc %}

    This document has not completed IETF Last Call. Please do not issue the ballot early without good reason.

    {% endif %} + {% if warn_unexpected_state %} +

    + This document is in an IESG state of "{{warn_unexpected_state}}". It would be unexpected to issue a ballot while in this state. +

    + {% endif %}
    + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/ietf/templates/doc/ballot_popup.html b/ietf/templates/doc/ballot_popup.html index 2a04ffab690..d2589cd54c2 100644 --- a/ietf/templates/doc/ballot_popup.html +++ b/ietf/templates/doc/ballot_popup.html @@ -27,7 +27,7 @@ {% if editable and user|has_role:"Area Director,Secretariat,IRSG Member,RSAB Member" %} {% if user|can_ballot:doc %} + href="{% url "ietf.doc.views_ballot.edit_position" name=doc.name ballot_id=ballot_id %}?ballot_edit_return_point={{ ballot_edit_return_point|urlencode }}"> Edit position {% endif %} diff --git a/ietf/templates/doc/bofreq/bof_requests.html b/ietf/templates/doc/bofreq/bof_requests.html index 2a806b18a59..19c2e5dd133 100644 --- a/ietf/templates/doc/bofreq/bof_requests.html +++ b/ietf/templates/doc/bofreq/bof_requests.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {# Copyright The IETF Trust 2021 All Rights Reserved #} {% load origin %} -{% load person_filters %} +{% load person_filters ietf_filters %} {% load static %} {% block pagehead %} @@ -26,40 +26,42 @@

    BOF Requests

    {% else %} {% regroup reqs by get_state_slug as grouped_reqs %} {% for req_group in grouped_reqs %} -

    {{ req_group.grouper|capfirst }} BOF Requests

    -
    - - - - - - - - - - - {% for req in req_group.list %} + {% if req_group.grouper != "spam" or request.user|has_role:"Secretariat" %} +

    {{ req_group.grouper|capfirst }} BOF Requests

    +
    NameDateTitleResponsibleEditors
    + - - - - - + + + + + - {% endfor %} - -
    - {{ req.name }}-{{ req.rev }} - {{ req.latest_revision_event.time|date:"Y-m-d" }}{{ req.title }} - {% for person in req.responsible %} - {% person_link person %}{% if not forloop.last %},{% endif %} - {% endfor %} - - {% for person in req.editors %} - {% person_link person %}{% if not forloop.last %},{% endif %} - {% endfor %} - NameDateTitleResponsibleEditors
    + + + {% for req in req_group.list %} + + + {{ req.name }}-{{ req.rev }} + + {{ req.latest_revision_event.time|date:"Y-m-d" }} + {{ req.title }} + + {% for person in req.responsible %} + {% person_link person %}{% if not forloop.last %},{% endif %} + {% endfor %} + + + {% for person in req.editors %} + {% person_link person %}{% if not forloop.last %},{% endif %} + {% endfor %} + + + {% endfor %} + + + {% endif %} {% endfor %} {% endif %} {% endblock %} diff --git a/ietf/templates/doc/bofreq/bofreq_template.md b/ietf/templates/doc/bofreq/bofreq_template.md index 7039e4679b8..49c5e511a52 100644 --- a/ietf/templates/doc/bofreq/bofreq_template.md +++ b/ietf/templates/doc/bofreq/bofreq_template.md @@ -1,16 +1,15 @@ -# Name: Exact MPLS Edges (EXAMPLE) (There's an acronym for anything if you really want one ;-) +# Name: EXAct MPLs Edges (EXAMPLE) (There's an acronym for anything if you really want one ;-) ## Description Replace this with a few paragraphs describing the BOF request. Fill in the details below. Keep items in the order they appear here. ## Required Details -- Status: (not) WG Forming -- Responsible AD: name +- Status: "not WG Forming" or "WG forming" +- Responsible AD: name (or at least area(s) if you know) - BOF proponents: name , name (1-3 people - who are requesting and coordinating discussion for proposal) -- BOF chairs: TBD - Number of people expected to attend: 100 -- Length of session (1 or 2 hours): 2 hours +- Length of session (1 or usually 2 hours): 2 hours - Conflicts (whole Areas and/or WGs) - Chair Conflicts: TBD - Technology Overlap: TBD @@ -28,7 +27,7 @@ To allow evaluation of your proposal, please include the following items: - Items, Internet-Drafts, speakers, timing - Or a URL -## Links to the mailing list, draft charter if any, relevant Internet-Drafts, etc. +## Links to the mailing list, draft charter if any (for WG-forming BoF), relevant Internet-Drafts, etc. - Mailing List: https://www.ietf.org/mailman/listinfo/example - Draft charter: {{ settings.IDTRACKER_BASE_URL }}{% url 'ietf.doc.views_doc.document_main' name='charter-ietf-EXAMPLE' %} - Relevant Internet-Drafts: diff --git a/ietf/templates/doc/bofreq/change_editors.html b/ietf/templates/doc/bofreq/change_editors.html index 546ad7179be..0c30cdecb4a 100644 --- a/ietf/templates/doc/bofreq/change_editors.html +++ b/ietf/templates/doc/bofreq/change_editors.html @@ -9,14 +9,14 @@

    Change editors
    - {{ titletext }} + {{ titletext }}

    {% csrf_token %} {% bootstrap_form form %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back
    diff --git a/ietf/templates/doc/bofreq/change_responsible.html b/ietf/templates/doc/bofreq/change_responsible.html index 79ca29f22b6..8c51c6e1f42 100644 --- a/ietf/templates/doc/bofreq/change_responsible.html +++ b/ietf/templates/doc/bofreq/change_responsible.html @@ -9,14 +9,14 @@

    Change Responsible Leadership
    - {{ titletext }} + {{ titletext }}

    {% csrf_token %} {% bootstrap_form form %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back
    diff --git a/ietf/templates/doc/bofreq/new_bofreq.html b/ietf/templates/doc/bofreq/new_bofreq.html index 9506d9c8e6e..c6aa0054f96 100644 --- a/ietf/templates/doc/bofreq/new_bofreq.html +++ b/ietf/templates/doc/bofreq/new_bofreq.html @@ -6,15 +6,39 @@ {% origin %}

    Start a new BOF Request

    - The IAB will also attempt to provide BoF Shepherds as described in their document on the subject only on request from the IESG. If you feel that your BoF would benefit from an IAB BoF Shepherd, please discuss this with your Area Director. + BoF proponents are strongly encouraged to review the following sources before submitting requests: +

    + + {# The following block needs to be commented out after the BoF deadline and re-opened before next BoF request opening #} +
    +

    + Announcement for IETF 124: The IESG and the IAB have organized Ask Me Anything (AMA) virtual sessions + for the community to help proponents who are interested in putting up BoF proposals for IETF 124 + (see also the IETF-announce email): +

    +
      +
    • 28th of August 13:00-14:00 UTC +
    • +
    • 28th of August 19:00-20:00 UTC +
    • +
    +
    + {# End of the temporary block #} +

    + The IAB will also attempt to provide BoF Shepherds as described in their document on the subject only on request from the IESG. + If you feel that your BoF would benefit from an IAB BoF Shepherd, please discuss this with your Area Director.

    - Choose a short descriptive title for your request. Take time to choose a good initial title - it will be used to make the filename for your request's content. The title can be changed later, but the filename will not change. + Choose a short descriptive title for your request. Take time to choose a good initial title - it will be used to make the filename for your request's content. + The title can be changed later, but the filename will not change.

    For example, a request with a title of "A new important bit" will be saved as bofreq-{{ user.person.last_name|xslugify|slice:"64" }}-a-new-important-bit-00.md.

    -

    All the items in the template MUST be filed in.

    +

    All the items in the template MUST be filed in.

    diff --git a/ietf/templates/doc/bofreq/upload_content.html b/ietf/templates/doc/bofreq/upload_content.html index 902b2900a94..74827dd4854 100644 --- a/ietf/templates/doc/bofreq/upload_content.html +++ b/ietf/templates/doc/bofreq/upload_content.html @@ -7,7 +7,7 @@

    Upload New Revision
    - {{ doc.name }} + {{ doc.name }}

    Change responsible AD
    - {{ titletext }} + {{ titletext }} {% csrf_token %} {% bootstrap_form form %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back
    diff --git a/ietf/templates/doc/change_shepherd.html b/ietf/templates/doc/change_shepherd.html index a102ce24ee9..755bd5d316d 100644 --- a/ietf/templates/doc/change_shepherd.html +++ b/ietf/templates/doc/change_shepherd.html @@ -10,7 +10,7 @@

    Change document shepherd
    - {{ doc.name }}-{{ doc.rev }} + {{ doc.name }}-{{ doc.rev }}

    The shepherd needs to have a Datatracker account. A new account can be diff --git a/ietf/templates/doc/change_shepherd_email.html b/ietf/templates/doc/change_shepherd_email.html index 36a8b44d156..b608c2d09a1 100644 --- a/ietf/templates/doc/change_shepherd_email.html +++ b/ietf/templates/doc/change_shepherd_email.html @@ -8,7 +8,7 @@

    Change document shepherd email
    - {{ doc.name }}-{{ doc.rev }} + {{ doc.name }}-{{ doc.rev }}

    {% csrf_token %} diff --git a/ietf/templates/doc/change_state.html b/ietf/templates/doc/change_state.html index d405e059b35..9d083e2f3ce 100644 --- a/ietf/templates/doc/change_state.html +++ b/ietf/templates/doc/change_state.html @@ -8,7 +8,7 @@

    Change state
    - {{ doc.title }} + {{ doc.title }}

    Help on states diff --git a/ietf/templates/doc/change_title.html b/ietf/templates/doc/change_title.html index 4f419e1dd02..14d7956cfea 100644 --- a/ietf/templates/doc/change_title.html +++ b/ietf/templates/doc/change_title.html @@ -8,14 +8,14 @@

    Change title
    - {{ titletext }} + {{ titletext }}

    {% csrf_token %} {% bootstrap_form form %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back
    diff --git a/ietf/templates/doc/charter/action_announcement_text.html b/ietf/templates/doc/charter/action_announcement_text.html index 5722b342a15..e087b175b4b 100644 --- a/ietf/templates/doc/charter/action_announcement_text.html +++ b/ietf/templates/doc/charter/action_announcement_text.html @@ -11,7 +11,7 @@

    {{ charter.chartered_group.type.name }} action announcement writeup
    - {{ charter.chartered_group.acronym }} + {{ charter.chartered_group.acronym }}

    {% csrf_token %} @@ -21,7 +21,7 @@

    {% if user|has_role:"Secretariat" %} + href="{% url 'ietf.doc.views_charter.approve' name=charter.name %}"> Charter approval page {% endif %} diff --git a/ietf/templates/doc/charter/action_text.txt b/ietf/templates/doc/charter/action_text.txt index fbe9ed3fe1c..9a1e7152229 100644 --- a/ietf/templates/doc/charter/action_text.txt +++ b/ietf/templates/doc/charter/action_text.txt @@ -1,4 +1,4 @@ -{% load ietf_filters %}{% autoescape off %}From: The IESG +{% load ietf_filters %}{% autoescape off %}From: {% if group.type_id == "rg" %}The IRTF {% else %}The IESG {% endif %} To: {{ to }}{% if cc %} Cc: {{ cc }} {% endif %} Subject: {{ group.type.name }} Action: {{ action_type }} {{ group.name }} ({{ group.acronym }}) diff --git a/ietf/templates/doc/charter/approve.html b/ietf/templates/doc/charter/approve.html index f109da6872b..2a8654482eb 100644 --- a/ietf/templates/doc/charter/approve.html +++ b/ietf/templates/doc/charter/approve.html @@ -2,16 +2,16 @@ {# Copyright The IETF Trust 2015, All Rights Reserved #} {% load origin %} {% load django_bootstrap5 %} -{% block title %}Approve {{ charter.canonical_name }}{% endblock %} +{% block title %}Approve {{ charter.name }}{% endblock %} {% block content %} {% origin %} -

    Approve {{ charter.canonical_name }}-{{ charter.rev }}

    +

    Approve {{ charter.name }}-{{ charter.rev }}

    {% csrf_token %}
    {{ announcement }}
    + href="{% url "ietf.doc.views_charter.action_announcement_text" name=charter.name %}?next=approve"> Edit/regenerate announcement Ballot issued
    - {{ doc.name }} + {{ doc.name }}

    Ballot has been sent out. diff --git a/ietf/templates/doc/charter/ballot_writeup.txt b/ietf/templates/doc/charter/ballot_writeup.txt index 552fe65e8d1..bf753bdfaf1 100644 --- a/ietf/templates/doc/charter/ballot_writeup.txt +++ b/ietf/templates/doc/charter/ballot_writeup.txt @@ -36,14 +36,6 @@ RFC Editor Note (Insert RFC Editor Note here or remove section) -IRTF Note - - (Insert IRTF Note here or remove section) - -IESG Note - - (Insert IESG Note here or remove section) - IANA Note (Insert IANA Note here or remove section) diff --git a/ietf/templates/doc/charter/ballot_writeupnotes.html b/ietf/templates/doc/charter/ballot_writeupnotes.html index fa4c12b6176..a202d48b763 100644 --- a/ietf/templates/doc/charter/ballot_writeupnotes.html +++ b/ietf/templates/doc/charter/ballot_writeupnotes.html @@ -8,12 +8,12 @@

    Ballot writeup and notes
    - {{ charter.chartered_group }} + {{ charter.chartered_group }}

    {% csrf_token %} {% bootstrap_form ballot_writeup_form %} -
    Working group summary, personnel, IAB note, IESG note, IANA note.
    +
    Working group summary, personnel, IANA note.
    + href="{% url "ietf.doc.views_doc.document_main" name=charter.name %}"> Back
    diff --git a/ietf/templates/doc/charter/issue_ballot_mail.txt b/ietf/templates/doc/charter/issue_ballot_mail.txt index 12fc44bbbc6..914935bb128 100644 --- a/ietf/templates/doc/charter/issue_ballot_mail.txt +++ b/ietf/templates/doc/charter/issue_ballot_mail.txt @@ -1,6 +1,6 @@ -{% load ietf_filters %}{% autoescape off %}To: {{ to }} {% if cc %} -Cc: {{ cc }} -{% endif %}From: IESG Secretary +{% load ietf_filters %}{% autoescape off %}To: {{ to }}{% if cc %} +Cc: {{ cc }}{% endif %} +From: IESG Secretary Reply-To: IESG Secretary Subject: Evaluation: {{ doc.name }} diff --git a/ietf/templates/doc/charter/review_announcement_text.html b/ietf/templates/doc/charter/review_announcement_text.html index 1e2542edb47..c50f5956bfa 100644 --- a/ietf/templates/doc/charter/review_announcement_text.html +++ b/ietf/templates/doc/charter/review_announcement_text.html @@ -9,7 +9,7 @@

    WG Review announcement writeup
    - {{ charter.chartered_group.acronym }} + {{ charter.chartered_group.acronym }}

    {% csrf_token %} diff --git a/ietf/templates/doc/charter/submit.html b/ietf/templates/doc/charter/submit.html index 54bd68a419f..d3918040712 100644 --- a/ietf/templates/doc/charter/submit.html +++ b/ietf/templates/doc/charter/submit.html @@ -39,7 +39,7 @@

    Charter submission

    State {{ group.state.name }} - {% if requested_close %}
    In the process of being closed
    {% endif %} + {% if requested_close %}
    In the process of being closed
    {% endif %} diff --git a/ietf/templates/doc/conflict_review/approval_text.txt b/ietf/templates/doc/conflict_review/approval_text.txt index 8e211e21ce0..a52ac11a719 100644 --- a/ietf/templates/doc/conflict_review/approval_text.txt +++ b/ietf/templates/doc/conflict_review/approval_text.txt @@ -1,9 +1,9 @@ {% load ietf_filters %}{% load mail_filters %}{% autoescape off %}From: The IESG To: {{ to }} Cc: {{ cc }} -Subject: Results of IETF-conflict review for {{conflictdoc.canonical_name}}-{{conflictdoc.rev}} +Subject: Results of IETF-conflict review for {{conflictdoc.name}}-{{conflictdoc.rev}} -{% filter wordwrap:78 %}The IESG has completed a review of {{conflictdoc.canonical_name}}-{{conflictdoc.rev}} consistent with RFC5742. +{% filter wordwrap:78 %}The IESG has completed a review of {{conflictdoc.name}}-{{conflictdoc.rev}} consistent with RFC5742. {% if review.get_state_slug == 'appr-reqnopub-pend' %} The IESG recommends that '{{ conflictdoc.title }}' {{ conflictdoc.file_tag|safe }} NOT be published as {{ conflictdoc|std_level_prompt_with_article }}. diff --git a/ietf/templates/doc/conflict_review/approve.html b/ietf/templates/doc/conflict_review/approve.html index 5283587f072..ccbac9c4cb0 100644 --- a/ietf/templates/doc/conflict_review/approve.html +++ b/ietf/templates/doc/conflict_review/approve.html @@ -2,10 +2,10 @@ {# Copyright The IETF Trust 2015, All Rights Reserved #} {% load origin %} {% load django_bootstrap5 %} -{% block title %}Approve {{ review.canonical_name }}{% endblock %} +{% block title %}Approve {{ review.name }}{% endblock %} {% block content %} {% origin %} -

    Approve {{ review.canonical_name }}

    +

    Approve {{ review.name }}

    {% csrf_token %} {% bootstrap_form form %} diff --git a/ietf/templates/doc/conflict_review/start.html b/ietf/templates/doc/conflict_review/start.html index f1b33bc6b2f..d8abc2b8114 100644 --- a/ietf/templates/doc/conflict_review/start.html +++ b/ietf/templates/doc/conflict_review/start.html @@ -3,13 +3,13 @@ {% load origin %} {% load django_bootstrap5 %} {% load ietf_filters %} -{% block title %}Begin IETF conflict review for {{ doc_to_review.canonical_name }}-{{ doc_to_review.rev }}{% endblock %} +{% block title %}Begin IETF conflict review for {{ doc_to_review.name }}-{{ doc_to_review.rev }}{% endblock %} {% block content %} {% origin %}

    Begin IETF conflict review
    - {{ doc_to_review.canonical_name }}-{{ doc_to_review.rev }} + {{ doc_to_review.name }}-{{ doc_to_review.rev }}

    {% if user|has_role:"Secretariat" %}

    diff --git a/ietf/templates/doc/conflict_review/submit.html b/ietf/templates/doc/conflict_review/submit.html index a95a3c57764..8259c6b12fb 100644 --- a/ietf/templates/doc/conflict_review/submit.html +++ b/ietf/templates/doc/conflict_review/submit.html @@ -2,16 +2,16 @@ {# Copyright The IETF Trust 2015, All Rights Reserved #} {% load origin %} {% load django_bootstrap5 %} -{% block title %}Edit conflict review for {{ conflictdoc.canonical_name }}-{{ conflictdoc.rev }}{% endblock %} +{% block title %}Edit conflict review for {{ conflictdoc.name }}-{{ conflictdoc.rev }}{% endblock %} {% block content %} {% origin %}

    Edit conflict review
    - {{ conflictdoc.canonical_name }}-{{ conflictdoc.rev }} + {{ conflictdoc.name }}-{{ conflictdoc.rev }}

    - The text will be submitted as {{ review.canonical_name }}-{{ next_rev }} + The text will be submitted as {{ review.name }}-{{ next_rev }}

    {% csrf_token %} @@ -27,7 +27,7 @@

    Reset to template text + href="{% url "ietf.doc.views_doc.document_main" name=review.name %}"> Back diff --git a/ietf/templates/doc/disclaimer.html b/ietf/templates/doc/disclaimer.html new file mode 100644 index 00000000000..db4c42ed687 --- /dev/null +++ b/ietf/templates/doc/disclaimer.html @@ -0,0 +1,34 @@ +{# Copyright The IETF Trust 2016-2023, All Rights Reserved #} +{% load origin %} +{% load ietf_filters %} +{% origin %} +{% if doc.type_id == "rfc" %} + {% if doc.stream.slug != "ietf" and doc.stream.desc != "Legacy" and doc.std_level.slug|default:"unk" not in "bcp,ds,ps,std"|split:"," %} + + {% elif doc.stream.slug != "ietf" and doc.stream.desc == "Legacy" and doc.std_level.slug|default:"unk" not in "bcp,ds,ps,std"|split:"," %} + + {% endif %} +{% elif doc|is_in_stream %} + {% if doc.stream.slug != "ietf" and doc.std_level.slug|default:"unk" not in "bcp,ds,ps,std"|split:"," %} + + {% endif %} +{% else %} + +{% endif %} diff --git a/ietf/templates/doc/document_ballot_content.html b/ietf/templates/doc/document_ballot_content.html index b2255c715a8..e0feb78bc7a 100644 --- a/ietf/templates/doc/document_ballot_content.html +++ b/ietf/templates/doc/document_ballot_content.html @@ -11,10 +11,10 @@

    {% for p in positions %}
    - {% if p.is_old_pos %}({% endif %}{% if p.comment or p.discuss %}{% endif %}{{ p.balloter.plain_name }}{% if p.comment or p.discuss %}{% endif %}{% if p.is_old_pos %}){% endif %} + {% if p.is_old_pos %}({% endif %}{% if p.comment or p.discuss %}{% endif %}{{ p.balloter.plain_name }}{% if p.comment or p.discuss %}{% endif %}{% if p.is_old_pos %}){% endif %}
    {% empty %} - (None) + (None) {% endfor %}
    {% endfor %} @@ -60,7 +60,7 @@ {% if user|can_ballot:doc %} + href="{% url "ietf.doc.views_ballot.edit_position" name=doc.name ballot_id=ballot.pk %}?ballot_edit_return_point={{ request.path|urlencode }}"> Edit position {% endif %} @@ -91,7 +91,7 @@ {{ p.balloter.plain_name }}
    - {% if p.old_positions %}(was {{ p.old_positions|join:", " }}){% endif %} + {% if p.old_positions %}(was {{ p.old_positions|join:", " }}){% endif %} {{ p.pos }} {% if user|has_role:"Secretariat" %} {% if p.pos.blocking and p.discuss %}
    -
    +
    {{ p.pos.name }} ({{ p.discuss_time|date:"Y-m-d" }}{% if not p.for_current_revision and p.get_dochistory.rev %}{% if p.discuss_time %} {% endif %}for -{{ p.get_dochistory.rev }}{% endif %}) @@ -179,11 +179,11 @@ {% if p.is_old_pos %}
    -
    - {{ p.balloter.plain_name }} Former IESG member +
    + {{ p.balloter.plain_name }} Former IESG member
    +
    {% if doc.rev != latest_rev %}
    The information below is for an older version of this BOF request.
    {% endif %} @@ -21,7 +21,7 @@ {{ doc.get_state.slug|capfirst }} BOF request - {% if snapshot %}Snapshot{% endif %} + {% if snapshot %}Snapshot{% endif %} @@ -135,7 +135,7 @@ {% endif %} - {{ doc.notify|default:'(None)' }} + {{ doc.notify|default:'(None)' }} diff --git a/ietf/templates/doc/document_charter.html b/ietf/templates/doc/document_charter.html index a811f26aba2..7564e1d213a 100644 --- a/ietf/templates/doc/document_charter.html +++ b/ietf/templates/doc/document_charter.html @@ -14,7 +14,7 @@ {% origin %} {{ top|safe }} {% include "doc/revisions_list.html" %} -
    +
    {% if doc.rev|charter_major_rev != latest_rev|charter_major_rev %}
    The information below is for an older @@ -59,7 +59,7 @@ {{ group.name }} {{ group.type.name }} ({{ group.acronym }}) - {% if snapshot %}Snapshot{% endif %} + {% if snapshot %}Snapshot{% endif %} @@ -94,8 +94,8 @@ {% else %} No document state {% endif %} - {% if chartering == "initial" %}Initial chartering{% endif %} - {% if chartering == "rechartering" %}Rechartering{% endif %} + {% if chartering == "initial" %}Initial chartering{% endif %} + {% if chartering == "rechartering" %}Rechartering{% endif %} @@ -152,7 +152,7 @@ {% if not telechat %} - (None) + (None) {% else %} On agenda of {{ telechat.telechat_date|date:"Y-m-d" }} IESG telechat {% endif %} @@ -175,7 +175,7 @@ {% endif %} - {{ doc.notify|default:'(None)' }} + {{ doc.notify|default:'(None)' }} @@ -227,10 +227,10 @@ {% if doc.rev != "" %}
    - {{ doc.canonical_name }}-{{ doc.rev }} + {{ doc.name }}-{{ doc.rev }}
    -
    {{ content|maybewordwrap|urlize_ietf_docs|linkify }}
    + {{ content }}
    {% endif %} diff --git a/ietf/templates/doc/document_chatlog.html b/ietf/templates/doc/document_chatlog.html index 1e88810feaa..7c97471e692 100644 --- a/ietf/templates/doc/document_chatlog.html +++ b/ietf/templates/doc/document_chatlog.html @@ -8,7 +8,7 @@ {% origin %} {{ top|safe }} {% include "doc/revisions_list.html" %} -
    +
    {% if doc.rev != latest_rev %}
    The information below is for an old version of the document.
    {% endif %} @@ -26,13 +26,13 @@ ({{ doc.group.acronym }}) {{ doc.group.type.name }} {% endif %} - {% if snapshot %}Snapshot{% endif %} + {% if snapshot %}Snapshot{% endif %} Title - {{ doc.title|default:'(None)' }} + {{ doc.title|default:'(None)' }} Session diff --git a/ietf/templates/doc/document_conflict_review.html b/ietf/templates/doc/document_conflict_review.html index 9e9f78b6856..8a2361832b2 100644 --- a/ietf/templates/doc/document_conflict_review.html +++ b/ietf/templates/doc/document_conflict_review.html @@ -10,7 +10,7 @@ {% origin %} {{ top|safe }} {% include "doc/revisions_list.html" %} -
    +
    {% if doc.rev != latest_rev %}
    The information below is for an old version of the document.
    {% endif %} @@ -27,10 +27,10 @@ - - {% if conflictdoc.get_state_slug == 'rfc' %}{{ conflictdoc.canonical_name|prettystdname }}{% else %}{{ conflictdoc.canonical_name }}-{{ conflictdoc.rev }}{% endif %} - {{ conflictdoc.stream }} stream - {% if snapshot %}Snapshot{% endif %} + + {% if conflictdoc.type_id == 'rfc' %}{{ conflictdoc.name|prettystdname }}{% else %}{{ conflictdoc.name }}-{{ conflictdoc.rev }}{% endif %} + {{ conflictdoc.stream }} stream + {% if snapshot %}Snapshot{% endif %} @@ -54,11 +54,7 @@ {% endif %} - {% if "no-problem" in doc.get_state.name|slugify %} - {{ doc.get_state.name}} - {% else %} - {{ doc.get_state.name }} - {% endif %} + {{ doc.get_state.name|badgeify }} @@ -90,7 +86,7 @@ {% if not telechat %} - (None) + (None) {% else %} On agenda of {{ telechat.telechat_date|date:"Y-m-d" }} IESG telechat {% if doc.returning_item %}(returning item){% endif %} @@ -149,4 +145,4 @@ -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/ietf/templates/doc/document_draft.html b/ietf/templates/doc/document_draft.html index b38225dd4f4..6414538283d 100644 --- a/ietf/templates/doc/document_draft.html +++ b/ietf/templates/doc/document_draft.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{# Copyright The IETF Trust 2016-2020, All Rights Reserved #} +{# Copyright The IETF Trust 2016-2024, All Rights Reserved #} {% load origin %} {% load static %} {% load ietf_filters %} @@ -13,11 +13,11 @@ title="Document changes" href="/feed/document-changes/{{ name }}/"> + content="{{ doc.title }} {% if doc.type_id == 'rfc' and not snapshot %}(RFC {{ rfc_number }}{% if published %}, {{ doc.pub_date|date:'F Y' }}{% endif %}{% if obsoleted_by %}; obsoleted by {% for rel in obsoleted_by %}{{ rel.source.name|prettystdname}}{% if not forloop.last%}, {% endif %}{% endfor %}{% endif %}){% endif %}"> {% endblock %} {% block morecss %}.inline { display: inline; }{% endblock %} {% block title %} - {% if doc.get_state_slug == "rfc" and not snapshot %} + {% if doc.type_id == "rfc" and not snapshot %} RFC {{ rfc_number }} - {{ doc.title }} {% else %} {{ name }}-{{ doc.rev }} - {{ doc.title }} @@ -27,11 +27,12 @@ {% origin %} {{ top|safe }} {% include "doc/revisions_list.html" with document_html=document_html %} -
    + {% include "doc/disclaimer.html" with document_html=document_html %} +
    {% if doc.rev != latest_rev %}
    The information below is for an old version of the document.
    {% else %} - {% if doc.get_state_slug == "rfc" and snapshot %} + {% if doc.became_rfc %}
    The information below is for an old version of the document that is already published as an RFC.
    @@ -47,7 +48,7 @@ {% if doc.stream %} {% if doc.stream.slug != "legacy" %} - + {% if doc.stream_id == 'ietf' %} WG {% else %} @@ -73,7 +74,7 @@ {{ stream_state }} {% else %} - + (None) {% endif %} @@ -85,7 +86,7 @@
    {% endif %} {% if due_date %} - (Due date {{ due_date }}) + (Due date {{ due_date }}) {% endif %} {% else %} @@ -95,7 +96,7 @@ - (No stream defined) + (No stream defined) {% endif %} @@ -166,18 +167,18 @@ {% if pres.rev and pres.rev != doc.rev %}(version -{{ pres.rev }}){% endif %}{% if not forloop.last %},{% endif %} {% endfor %} {% else %} - + (None) {% endif %} {% endif %} - {% if doc.stream_id == 'ietf' or doc.stream_id == 'ise' or doc.stream_id == 'irtf' or doc.stream_id == 'editorial' %} + {% if doc.stream_id == 'ietf' or doc.stream_id == 'ise' or doc.stream_id == 'irtf' or doc.stream_id == 'editorial' or doc.stream_id == 'iab' %} - Document shepherd + {% if doc.stream_id == 'iab' %}IAB shepherd{% else %}Document shepherd{% endif %} {% if can_edit_stream_info and not snapshot %} @@ -196,7 +197,7 @@ {% if doc.shepherd %} {% person_link doc.shepherd.person %} {% else %} - + (None) {% endif %} @@ -224,9 +225,9 @@ href="{% url 'ietf.doc.views_doc.document_shepherd_writeup' name=doc.name %}"> Show - Last changed {{ shepherd_writeup.time|date:"Y-m-d" }} + Last changed {{ shepherd_writeup.time|date:"Y-m-d" }} {% else %} - + (None) {% endif %} @@ -251,7 +252,7 @@ {% if doc.has_rfc_editor_note %} (last changed {{ doc.has_rfc_editor_note|date:"Y-m-d" }}) {% else %} - + (None) {% endif %} @@ -267,19 +268,19 @@ {% endif %} - {% if not doc.stream_id == 'iab' %} + {% if doc.stream_id != 'iab' and doc.stream_id != 'editorial' %} IESG - + IESG state - {% if iesg_state.slug != 'idexists' and can_edit %} + {% if iesg_state.slug != 'idexists' and iesg_state.slug != 'dead' and can_edit or user|has_role:"Secretariat" %} Edit @@ -303,7 +304,7 @@ Action Holder{{ doc.documentactionholder_set.all|pluralize }} - {% if can_edit %} + {% if can_edit_action_holders %} Edit @@ -318,7 +319,7 @@ {% person_link action_holder.person title=action_holder.role_for_doc %} {{ action_holder|action_holder_badge }}
    {% endfor %} - {% if can_edit %} + {% if can_edit_action_holders %} @@ -327,7 +328,7 @@ {% endif %} {% else %} - + (None) {% endif %} @@ -375,7 +376,7 @@ On agenda of {{ telechat.telechat_date }} IESG telechat {% if telechat.returning_item %}(returning item){% endif %} {% else %} - + (None) {% endif %} @@ -402,38 +403,25 @@ {% if doc.ad %} {% person_link doc.ad %} {% else %} - + (None) {% endif %} - {% if iesg_state.slug != 'idexists' %} - {% if doc.note or can_edit %} - - - - IESG note - - - {% if can_edit and not snapshot %} - - Edit - - {% endif %} - - - {% if doc.note %} - {{ doc.note|linebreaksbr }} - {% else %} - - (None) - - {% endif %} - - - {% endif %} + {% if iesg_state.slug != 'idexists' and doc.note %} + + + + IESG note + + + {# IESG Notes are historic and read-only now #} + + + {{ doc.notedoc.note|urlize_ietf_docs|linkify|linebreaksbr }} + + {% endif %} @@ -452,7 +440,7 @@ {% if doc.notify %} {{ doc.notify|linkify }} {% else %} - + (None) {% endif %} @@ -460,125 +448,127 @@ {% endif %} - {% if can_edit_iana_state or iana_review_state or iana_experts_state or iana_experts_comment %} - - {% if iana_review_state or can_edit_iana_state %} - - - IANA - - - - IANA review state - - - - {% if can_edit_iana_state and not snapshot %} - - Edit - - {% endif %} - - - {% if not iana_review_state %} - - (None) - - {% else %} - {{ iana_review_state }} - {% endif %} - - - {% endif %} - {% if iana_action_state or can_edit_iana_state %} - - - {% if not can_edit_iana_state and not iana_review_state %}IANA{% endif %} - - - - IANA action state - - - - {% if can_edit_iana_state and not snapshot %} - - Edit + {% if doc.stream_id != 'editorial' %} + {% if can_edit_iana_state or iana_review_state or iana_experts_state or iana_experts_comment %} + + {% if iana_review_state or can_edit_iana_state %} + + + IANA + + + + IANA review state - {% endif %} - - - {% if not iana_action_state %} - - (None) - - {% else %} - {{ iana_action_state }} - {% endif %} - - - {% endif %} - {% if iana_experts_state or can_edit_iana_state %} - - - {% if not can_edit_iana_state and not iana_review_state and not iana_action_state %}IANA{% endif %} - - - - IANA expert review state - - - - {% if can_edit_iana_state and not snapshot %} - - Edit + + + {% if can_edit_iana_state and not snapshot %} + + Edit + + {% endif %} + + + {% if not iana_review_state %} + + (None) + + {% else %} + {{ iana_review_state }} + {% endif %} + + + {% endif %} + {% if iana_action_state or can_edit_iana_state %} + + + {% if not can_edit_iana_state and not iana_review_state %}IANA{% endif %} + + + + IANA action state - {% endif %} - - - {% if not iana_experts_state %} - - (None) - - {% else %} - {{ iana_experts_state }} - {% endif %} - - - {% endif %} - {% if iana_experts_comment or can_edit_iana_state %} - - - {% if not can_edit_iana_state and not iana_review_state and not iana_action_state and not iana_experts_state %} - IANA - {% endif %} - - - IANA expert review comments - - - {% if can_edit_iana_state and not snapshot %} - - Edit + + + {% if can_edit_iana_state and not snapshot %} + + Edit + + {% endif %} + + + {% if not iana_action_state %} + + (None) + + {% else %} + {{ iana_action_state }} + {% endif %} + + + {% endif %} + {% if iana_experts_state or can_edit_iana_state %} + + + {% if not can_edit_iana_state and not iana_review_state and not iana_action_state %}IANA{% endif %} + + + + IANA expert review state - {% endif %} - - - {% if not iana_experts_comment %} - - (None) - - {% else %} - {{ iana_experts_comment }} - {% endif %} - - - {% endif %} - + + + {% if can_edit_iana_state and not snapshot %} + + Edit + + {% endif %} + + + {% if not iana_experts_state %} + + (None) + + {% else %} + {{ iana_experts_state }} + {% endif %} + + + {% endif %} + {% if iana_experts_comment or can_edit_iana_state %} + + + {% if not can_edit_iana_state and not iana_review_state and not iana_action_state and not iana_experts_state %} + IANA + {% endif %} + + + IANA expert review comments + + + {% if can_edit_iana_state and not snapshot %} + + Edit + + {% endif %} + + + {% if not iana_experts_comment %} + + (None) + + {% else %} + {{ iana_experts_comment }} + {% endif %} + + + {% endif %} + + {% endif %} {% endif %} {% if rfc_editor_state %} @@ -587,7 +577,7 @@ RFC Editor - + RFC Editor state @@ -644,20 +634,20 @@ IPR {% if doc.related_ipr %} - + {{ doc.related_ipr|length }} {% endif %} References @@ -671,70 +661,50 @@ Nits - + {% if user|has_role:"Area Director" %} + {# IDNITS3 is an experimental service, so only show it to Area Directors #} + + + + Nits-v3 (Experimental) + + {% endif %} + + + + Search email archive + {% if user.is_authenticated %} - Untrack - Track {% endif %} - {% if user.review_teams %} - Remove review wishes - @@ -764,10 +734,10 @@ {% endfor %} {% endif %}
    - {% if doc.get_state_slug == "active" or doc.get_state_slug == "rfc" %} + {% if doc.get_state_slug == "active" or doc.type_id == "rfc" or doc.became_rfc %}
    - {% if doc.get_state_slug == "rfc" and not snapshot %} + {% if doc.type_id == "rfc" and not snapshot %} RFC {{ rfc_number }} {% else %} {{ name }}-{{ doc.rev }} @@ -786,7 +756,7 @@ {% endif %} {% else %}
    - {% else %} - (not online) + (not online) {% endif %} \ No newline at end of file diff --git a/ietf/templates/doc/document_history.html b/ietf/templates/doc/document_history.html index 9c76774b88d..78471e08d68 100644 --- a/ietf/templates/doc/document_history.html +++ b/ietf/templates/doc/document_history.html @@ -11,7 +11,7 @@ - + {% endblock %} {% block content %} {% origin %} @@ -20,7 +20,33 @@

    Revision differences

    {% include "doc/document_history_form.html" with doc=doc diff_revisions=diff_revisions action=rfcdiff_base_url snapshot=snapshot only %} {% endif %} + {% if ballot_doc_rev %} +

    + Your most recent ballot position was provided when the document was at version {{ ballot_doc_rev }}. +

    + {% endif %}

    Document history

    + {% if doc.came_from_draft %} +
    + {% endif %} + {% if doc.became_rfc %} + + {% endif %} + {% if can_add_comment %}

    Date - Rev. + {% if doc.type_id not in "rfc,bcp,std,fyi" %}Rev.{% endif %} By Action @@ -45,7 +71,7 @@

    Document history

    {{ e.time|date:"Y-m-d" }}
    - {{ e.rev }} + {% if doc.type_id not in "rfc,bcp,std,fyi" %}{{ e.rev }}{% endif %} {{ e.by|escape }} {{ e.desc|format_history_text }} diff --git a/ietf/templates/doc/document_history_form.html b/ietf/templates/doc/document_history_form.html index 30e0d280009..646da0038be 100644 --- a/ietf/templates/doc/document_history_form.html +++ b/ietf/templates/doc/document_history_form.html @@ -11,7 +11,6 @@
    {% endif %} -{% with prev_rev=doc.rev|add:"-1"|stringformat:"02d" %} + value="{{ mail_archive_query_data.query_value }}">
    @@ -129,7 +133,7 @@

    {% else %} {% endif %} @@ -146,13 +150,5 @@

    {% endblock %} {% block js %} - {% endblock %} \ No newline at end of file diff --git a/ietf/templates/doc/review/edit_request_comment.html b/ietf/templates/doc/review/edit_request_comment.html index b2196cbcb53..50afa19acba 100644 --- a/ietf/templates/doc/review/edit_request_comment.html +++ b/ietf/templates/doc/review/edit_request_comment.html @@ -7,14 +7,14 @@

    Edit review request comment
    - {{ review_req.doc.name }} + {{ review_req.doc.name }}

    {% csrf_token %} {% bootstrap_form form %} + href="{% url "ietf.doc.views_review.review_request" name=review_req.doc.name request_id=review_req.pk %}"> Back
    diff --git a/ietf/templates/doc/review/edit_request_deadline.html b/ietf/templates/doc/review/edit_request_deadline.html index a1ae542bd5b..7706f963962 100644 --- a/ietf/templates/doc/review/edit_request_deadline.html +++ b/ietf/templates/doc/review/edit_request_deadline.html @@ -10,14 +10,14 @@

    Edit review request deadline
    - {{ review_req.doc.name }} + {{ review_req.doc.name }}

    {% csrf_token %} {% bootstrap_form form %} + href="{% url "ietf.doc.views_review.review_request" name=review_req.doc.name request_id=review_req.pk %}"> Back
    diff --git a/ietf/templates/doc/review/mark_reviewer_assignment_no_response.html b/ietf/templates/doc/review/mark_reviewer_assignment_no_response.html index b2e8f1af754..4bc42547856 100644 --- a/ietf/templates/doc/review/mark_reviewer_assignment_no_response.html +++ b/ietf/templates/doc/review/mark_reviewer_assignment_no_response.html @@ -7,7 +7,7 @@

    Review assignment: No-Response
    - {{ assignment.review_request.doc.name }} + {{ assignment.review_request.doc.name }}

    Mark review assignment for {% person_link assignment.reviewer.person %} as No Response. @@ -19,7 +19,7 @@

    name="action" value="noresponse">Mark assignment as no-response + href="{% url "ietf.doc.views_review.review_request" name=assignment.review_request.doc.name request_id=assignment.review_request.pk %}"> Back diff --git a/ietf/templates/doc/review/reject_reviewer_assignment.html b/ietf/templates/doc/review/reject_reviewer_assignment.html index eca22955795..7fbde360cda 100644 --- a/ietf/templates/doc/review/reject_reviewer_assignment.html +++ b/ietf/templates/doc/review/reject_reviewer_assignment.html @@ -7,10 +7,10 @@

    Reject review assignment
    - {{ review_req.doc.name }} + {{ review_req.doc.name }}

    {% include "doc/review/request_info.html" %} - {% if not review_request_past_deadline %} + {% if allow_reject_request %}

    Do you want to reject this assignment?

    @@ -18,7 +18,7 @@

    {% csrf_token %} {% bootstrap_form form %} + href="{% url "ietf.doc.views_review.review_request" name=doc.name request_id=review_req.pk %}"> Back diff --git a/ietf/templates/doc/review/request_info.html b/ietf/templates/doc/review/request_info.html index 55caae9fa7c..9ad126d59e2 100644 --- a/ietf/templates/doc/review/request_info.html +++ b/ietf/templates/doc/review/request_info.html @@ -1,7 +1,7 @@ {# Copyright The IETF Trust 2017, All Rights Reserved #} {% load origin django_bootstrap5 %} {% origin %} -{% load person_filters %} +{% load person_filters ietf_filters %} @@ -27,7 +27,7 @@ No specific revision {% endif %} {% if review_req.reviewed_rev != review_req.doc.rev %} - (document currently at {{ review_req.doc.rev }}) + (document currently at {{ review_req.doc.rev }}) {% endif %} @@ -96,7 +96,7 @@ {% endif %} - {% if doc.time %} + {% if review_req.doc.time %} @@ -104,7 +104,10 @@ I-D last updated {% endif %} @@ -177,6 +180,8 @@
    {% if assignment.state_id == "assigned" %} Assignment not accepted yet + {% elif assignment.state_id == "rejected" %} + Assignment rejected {% else %} Assignment accepted {% endif %} @@ -217,17 +222,29 @@ State
    - {% if assignment.state_id != "withdrawn" and assignment.state_id != "no-response" and assignment.state_id != "rejected" %} + {% if doc == assignment.review %} + + + + + + {% endif %} + {% if assignment.state_id != "withdrawn" and assignment.state_id != "no-response" and assignment.state_id != "rejected" and doc != assignment.review%} @@ -312,8 +329,8 @@ - {% endif %} @@ -339,4 +356,4 @@ Assign reviewer -{% endif %} \ No newline at end of file +{% endif %} diff --git a/ietf/templates/doc/review/request_review.html b/ietf/templates/doc/review/request_review.html index 220ca4fe904..b765871d65d 100644 --- a/ietf/templates/doc/review/request_review.html +++ b/ietf/templates/doc/review/request_review.html @@ -11,7 +11,7 @@

    Request review
    - {{ doc.name }} + {{ doc.name }}

    Submit a request to have the document reviewed. @@ -44,7 +44,7 @@

    {% bootstrap_field form.comment layout="horizontal" %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/review/review_request.html b/ietf/templates/doc/review/review_request.html index 6ae15b08a3c..85335aab6e8 100644 --- a/ietf/templates/doc/review/review_request.html +++ b/ietf/templates/doc/review/review_request.html @@ -10,7 +10,7 @@

    Review request
    - {{ review_req.doc.name }} + {{ review_req.doc.name }}

    {% include "doc/review/request_info.html" %} {% if can_close_request %} @@ -21,6 +21,15 @@

    {% endif %}

    History

    + {% if can_add_comment %} + + {% endif %}
    - {{ doc.time|date:"Y-m-d" }} + {{ review_req.doc.time|date:"Y-m-d" }} + {% if review_req.doc.pub_date %} + (Latest revision {{ review_req.doc.pub_date|date:"Y-m-d" }}) + {% endif %}
    - - {{ assignment.state.name }} - + {{ assignment.state.name|badgeify }} {% if snapshot %} - + Snapshot {% endif %}
    + + Request + + + {{ review_req }} + +
    Result - {{ assignment.result.name }} + + {{ assignment.result.name|badgeify }}
    @@ -30,6 +39,7 @@

    History

    + {% for h in history %} {% if h.history_change_reason %} @@ -39,6 +49,7 @@

    History

    {% endif %} {% endfor %} +
    Description
    {% endblock %} diff --git a/ietf/templates/doc/review/review_wish_add.html b/ietf/templates/doc/review/review_wish_add.html index bd2df52ce8b..73ce549288a 100644 --- a/ietf/templates/doc/review/review_wish_add.html +++ b/ietf/templates/doc/review/review_wish_add.html @@ -7,7 +7,7 @@

    Add review wish
    - {{ doc.name }} + {{ doc.name }}

    You are a reviewer for multiple teams, and need to select a team first. diff --git a/ietf/templates/doc/review/review_wishes_remove.html b/ietf/templates/doc/review/review_wishes_remove.html index aadf3c5deb6..ee30c3cfcc6 100644 --- a/ietf/templates/doc/review/review_wishes_remove.html +++ b/ietf/templates/doc/review/review_wishes_remove.html @@ -8,7 +8,7 @@

    Remove review wish {% if doc.name %}
    - {{ doc.name }} + {{ doc.name }} {% endif %}

    diff --git a/ietf/templates/doc/review/submit_unsolicited_review.html b/ietf/templates/doc/review/submit_unsolicited_review.html index 3f52c2bc755..5db7e9cd62c 100644 --- a/ietf/templates/doc/review/submit_unsolicited_review.html +++ b/ietf/templates/doc/review/submit_unsolicited_review.html @@ -7,7 +7,7 @@

    Submit unsolicited review
    - {{ doc.name }} + {{ doc.name }}

    You are submitting an unsolicited review for this document. @@ -18,7 +18,7 @@

    {% bootstrap_form form layout="horizontal" %} + href="{% url "ietf.doc.views_doc.document_main" name=doc.name %}"> Back diff --git a/ietf/templates/doc/review/withdraw_reviewer_assignment.html b/ietf/templates/doc/review/withdraw_reviewer_assignment.html index 6ff1f926b29..aed48ba78b4 100644 --- a/ietf/templates/doc/review/withdraw_reviewer_assignment.html +++ b/ietf/templates/doc/review/withdraw_reviewer_assignment.html @@ -7,7 +7,7 @@

    Withdraw review assignment
    - {{ assignment.review_request.doc.name }} + {{ assignment.review_request.doc.name }}

    Withdraw review assignment for {% person_link assignment.reviewer.person %}. @@ -16,7 +16,7 @@

    {% csrf_token %} + href="{% url "ietf.doc.views_review.review_request" name=assignment.review_request.doc.name request_id=assignment.review_request.pk %}"> Back diff --git a/ietf/templates/doc/review_assignment_summary.html b/ietf/templates/doc/review_assignment_summary.html index 4685bdf1cd4..6bb42ea074e 100644 --- a/ietf/templates/doc/review_assignment_summary.html +++ b/ietf/templates/doc/review_assignment_summary.html @@ -1,3 +1,4 @@ +{% load ietf_filters %}
    {% if review_assignment.state_id == "completed" or review_assignment.state_id == "part-completed" %} @@ -10,19 +11,17 @@ -{{ review_assignment.reviewed_rev }}){% endif %} by {{ review_assignment.reviewer.person.plain_name }} {% if review_assignment.state_id == "part-completed" %} - Partially completed + Partially completed {% endif %} {% if review_assignment.result %} - - {{ review_assignment.result.name }} - + {{ review_assignment.result.name|badgeify }} {% endif %} {% else %} - - {{ review_assignment.review_request.team.acronym|upper }} {{ review_assignment.review_request.type.name }} Review - - Incomplete, due {{ review_assignment.review_request.deadline|date:"Y-m-d" }} + {{ review_assignment.review_request.team.acronym|upper }} {{ review_assignment.review_request.type.name }} Review due {{ review_assignment.review_request.deadline|date:"Y-m-d" }} + + Incomplete {% endif %}
    \ No newline at end of file diff --git a/ietf/templates/doc/review_request_summary.html b/ietf/templates/doc/review_request_summary.html new file mode 100644 index 00000000000..af4f2d5f7b6 --- /dev/null +++ b/ietf/templates/doc/review_request_summary.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/ietf/templates/doc/revisions_list.html b/ietf/templates/doc/revisions_list.html index cde628ddae2..761d4cd04b3 100644 --- a/ietf/templates/doc/revisions_list.html +++ b/ietf/templates/doc/revisions_list.html @@ -6,31 +6,46 @@

    {{ trigger }} - {{ to|join:', '|unescape|linkify }} - {{ cc|join:', '|unescape|linkify }} + + {% for addr in to %} + {{ addr|linkify }}{% if not forloop.last %}, {% endif %} + {% endfor %} + + + {% for addr in cc %} + {{ addr|linkify }}{% if not forloop.last %}, {% endif %} + {% endfor %} + {% endfor %} diff --git a/ietf/templates/group/email_aliases.html b/ietf/templates/group/email_aliases.html index 415f9950c22..f36be7f0f31 100644 --- a/ietf/templates/group/email_aliases.html +++ b/ietf/templates/group/email_aliases.html @@ -14,7 +14,7 @@

    Group email aliases {% if group %}
    - {{ group.acronym }} + {{ group.acronym }} {% endif %}

    {% regroup aliases|dictsort:"acronym" by acronym as alias_list %} diff --git a/ietf/templates/group/email_open_review_assignments.html b/ietf/templates/group/email_open_review_assignments.html index 4f72e1c80e5..64b9c2e0642 100644 --- a/ietf/templates/group/email_open_review_assignments.html +++ b/ietf/templates/group/email_open_review_assignments.html @@ -9,7 +9,7 @@

    Email summary of assigned review requests
    - {{ group.acronym }} + {{ group.acronym }}

    {% if review_assignments %} diff --git a/ietf/templates/group/group_about.html b/ietf/templates/group/group_about.html index 0ad9813e2fc..cbc2e11536f 100644 --- a/ietf/templates/group/group_about.html +++ b/ietf/templates/group/group_about.html @@ -14,6 +14,7 @@ {% endblock %} {% block pagehead %} + {% endblock %} {% block group_content %} {% origin %} @@ -67,7 +68,7 @@ {{ group.state.name }} - {% if requested_close %}
    Being closed
    {% endif %} + {% if requested_close %}
    Being closed
    {% endif %} {% if group.features.has_chartering_process %} @@ -80,10 +81,10 @@ {{ group.charter.name }}-{{ group.charter.rev }} {% if group.charter.get_state.name %} - {{ group.charter.get_state.name }} + {{ group.charter.get_state.name }} {% endif %} {% else %} - (None) + (None) {% if user|has_role:"Area Director,Secretariat" %} Submit charter {% endif %} @@ -112,11 +113,11 @@ href="{% url "ietf.group.views.group_about_status" acronym=group.acronym %}"> Show - + Changed {{ status_update.time|date:"Y-m-d" }} {% else %} - + (None) {% endif %} @@ -157,7 +158,7 @@