diff --git a/.github/workflows/build-desktop-osx64.yml b/.github/workflows/build-desktop-osx64.yml index eb9c1759897..dfb4a032a77 100644 --- a/.github/workflows/build-desktop-osx64.yml +++ b/.github/workflows/build-desktop-osx64.yml @@ -7,6 +7,13 @@ on: required: false type: boolean default: false + workflow_dispatch: + inputs: + release: + description: 'Set to true to create a release build' + required: false + type: boolean + default: false jobs: build-and-sign: @@ -30,9 +37,6 @@ jobs: p12-file-base64: ${{ secrets.MACOS_CERTIFICATE }} p12-password: ${{ secrets.MACOS_CERTIFICATE_PWD }} - - name: Install OpenSSL - run: brew install openssl - - name: Setup Cargo Cache uses: actions/cache@v4 with: @@ -107,6 +111,10 @@ jobs: desktop/target/release/bundle/macos/*.app.tar.gz desktop/target/release/bundle/macos/*.app.tar.gz.sig - - name: Cleanup Artifacts + - name: Clean old bundle artifacts if: always() - run: cargo clean + run: | + bundlePath="${{ github.workspace }}/desktop/target/release/bundle" + if [ -d "$bundlePath" ]; then + rm -rf "$bundlePath" + fi diff --git a/.github/workflows/build-desktop-osxARM.yml b/.github/workflows/build-desktop-osxARM.yml index b395cfc9c38..1053a4f213c 100644 --- a/.github/workflows/build-desktop-osxARM.yml +++ b/.github/workflows/build-desktop-osxARM.yml @@ -7,6 +7,13 @@ on: required: false type: boolean default: false + workflow_dispatch: + inputs: + release: + description: 'Set to true to create a release build' + required: false + type: boolean + default: false jobs: build-and-sign: @@ -20,20 +27,6 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Debug - List files - run: | - echo "Current directory:" - pwd - echo "Files in current directory:" - ls -la - echo "Files in src-tauri:" - ls -la src-tauri/ - echo "Files in src-tauri/scripts:" - ls -la src-tauri/scripts/ || echo "scripts directory does not exist" - echo "Looking for fix_dylibs.sh:" - find . -name "fix_dylibs.sh" -type f || echo "fix_dylibs.sh not found" - - - name: Import Code Signing Certificate uses: apple-actions/import-codesign-certs@v3 env: @@ -44,9 +37,6 @@ jobs: p12-file-base64: ${{ secrets.MACOS_CERTIFICATE }} p12-password: ${{ secrets.MACOS_CERTIFICATE_PWD }} - - name: Install OpenSSL - run: brew install openssl - - name: Setup Cargo Cache uses: actions/cache@v4 with: @@ -122,6 +112,10 @@ jobs: desktop/target/release/bundle/macos/*.app.tar.gz desktop/target/release/bundle/macos/*.app.tar.gz.sig - - name: Cleanup Artifacts + - name: Clean old bundle artifacts if: always() - run: cargo clean + run: | + bundlePath="${{ github.workspace }}/desktop/target/release/bundle" + if [ -d "$bundlePath" ]; then + rm -rf "$bundlePath" + fi diff --git a/.github/workflows/build-desktop-win64.yml b/.github/workflows/build-desktop-win64.yml index 4c9bc53880f..3b5adfadc69 100644 --- a/.github/workflows/build-desktop-win64.yml +++ b/.github/workflows/build-desktop-win64.yml @@ -7,6 +7,13 @@ on: required: false type: boolean default: false + workflow_dispatch: + inputs: + release: + description: 'Set to true to create a release build' + required: false + type: boolean + default: false jobs: build-and-sign: @@ -40,16 +47,75 @@ jobs: - name: Install OpenSSL using vcpkg working-directory: ${{ github.workspace }} - run: ${{ env.VCPKG_ROOT }}/vcpkg install openssl:x64-windows-static --vcpkg-root ${{ env.VCPKG_ROOT }} + run: ${{ env.VCPKG_ROOT }}/vcpkg install openssl:x64-windows --vcpkg-root ${{ env.VCPKG_ROOT }} env: - VCPKG_DEFAULT_TRIPLET: x64-windows-static + VCPKG_DEFAULT_TRIPLET: x64-windows - name: Set OpenSSL env shell: bash run: | - echo "OPENSSL_DIR=${{ env.VCPKG_ROOT }}/installed/x64-windows-static" >> $GITHUB_ENV - echo "OPENSSL_INCLUDE_DIR=${{ env.VCPKG_ROOT }}/installed/x64-windows-static/include" >> $GITHUB_ENV - echo "OPENSSL_LIB_DIR=${{ env.VCPKG_ROOT }}/installed/x64-windows-static/lib" >> $GITHUB_ENV + echo "OPENSSL_DIR=${{ env.VCPKG_ROOT }}/installed/x64-windows" >> $GITHUB_ENV + echo "OPENSSL_INCLUDE_DIR=${{ env.VCPKG_ROOT }}/installed/x64-windows/include" >> $GITHUB_ENV + echo "OPENSSL_LIB_DIR=${{ env.VCPKG_ROOT }}/installed/x64-windows/lib" >> $GITHUB_ENV + + - name: Copy SSL DLLs + shell: pwsh + run: | + # Verify OpenSSL DLLs exist + $opensslBinDir = "${{ env.VCPKG_ROOT }}/installed/x64-windows/bin" + $libcryptoPath = Join-Path $opensslBinDir "libcrypto-3-x64.dll" + $libsslPath = Join-Path $opensslBinDir "libssl-3-x64.dll" + + if (-not (Test-Path $libcryptoPath)) { + Write-Error "Error: libcrypto-3-x64.dll not found at $libcryptoPath" + exit 1 + } + if (-not (Test-Path $libsslPath)) { + Write-Error "Error: libssl-3-x64.dll not found at $libsslPath" + exit 1 + } + + # Copy DLLs to src-tauri folder + Copy-Item -Path $libcryptoPath -Destination "src-tauri/" -Force + Copy-Item -Path $libsslPath -Destination "src-tauri/" -Force + Write-Host "Successfully copied OpenSSL DLLs to src-tauri/" + Get-ChildItem -Path "src-tauri/" + + - name: Create temp directory for signing DLLs + shell: pwsh + run: New-Item -ItemType Directory -Force -Path "${{ github.workspace }}/desktop/temp-sign-dlls" + + - name: Sign libcrypto DLL + uses: sslcom/esigner-codesign@develop + with: + command: sign + username: ${{ secrets.ESIGNER_USERNAME }} + password: ${{ secrets.ESIGNER_PASSWORD }} + credential_id: ${{ secrets.ESIGNER_CREDENTIAL_ID }} + totp_secret: ${{ secrets.ESIGNER_TOTP_SECRET }} + file_path: ${{ github.workspace }}/desktop/src-tauri/libcrypto-3-x64.dll + output_path: ${{ github.workspace }}/desktop/temp-sign-dlls + malware_block: false + + - name: Sign libssl DLL + uses: sslcom/esigner-codesign@develop + with: + command: sign + username: ${{ secrets.ESIGNER_USERNAME }} + password: ${{ secrets.ESIGNER_PASSWORD }} + credential_id: ${{ secrets.ESIGNER_CREDENTIAL_ID }} + totp_secret: ${{ secrets.ESIGNER_TOTP_SECRET }} + file_path: ${{ github.workspace }}/desktop/src-tauri/libssl-3-x64.dll + output_path: ${{ github.workspace }}/desktop/temp-sign-dlls + malware_block: false + + - name: Replace unsigned DLLs with signed ones + shell: pwsh + run: | + Copy-Item -Path "${{ github.workspace }}/desktop/temp-sign-dlls/libcrypto-3-x64.dll" -Destination "${{ github.workspace }}/desktop/src-tauri/libcrypto-3-x64.dll" -Force + Copy-Item -Path "${{ github.workspace }}/desktop/temp-sign-dlls/libssl-3-x64.dll" -Destination "${{ github.workspace }}/desktop/src-tauri/libssl-3-x64.dll" -Force + Write-Host "Successfully replaced unsigned DLLs with signed versions" + Get-ChildItem -Path "${{ github.workspace }}/desktop/src-tauri/*.dll" - name: Set up Node.js uses: actions/setup-node@v4 @@ -60,10 +126,7 @@ jobs: run: npm install -g @cyclonedx/cyclonedx-npm - name: Set up Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - profile: minimal + uses: dtolnay/rust-toolchain@stable - name: Cache cargo registry uses: actions/cache@v4 @@ -97,6 +160,14 @@ jobs: Move-Item "src-tauri/openbb-platform.cdx.xml" "src-tauri/open-data-platform-SBOM-cargo.cdx.xml" -Force } + - name: Clean old bundle artifacts + shell: pwsh + run: | + $bundlePath = "${{ github.workspace }}/desktop/target/x86_64-pc-windows-msvc/release/bundle" + if (Test-Path $bundlePath) { + Remove-Item -Path $bundlePath -Recurse -Force + } + - name: Build Tauri App (without bundling) run: npm run tauri build -- --target x86_64-pc-windows-msvc --no-bundle env: @@ -112,7 +183,7 @@ jobs: run: New-Item -ItemType Directory -Force -Path "${{ github.workspace }}/desktop/temp-sign" - name: Sign the executable - uses: sslcom/esigner-codesign@v1.3.1 + uses: sslcom/esigner-codesign@develop with: command: sign username: ${{ secrets.ESIGNER_USERNAME }} @@ -162,11 +233,21 @@ jobs: shell: pwsh run: | $version = (Get-Content src-tauri/tauri.conf.json | ConvertFrom-Json).version - $sigFile = (Get-ChildItem -Path "${{ github.workspace }}/desktop/target/x86_64-pc-windows-msvc/release/bundle/nsis/*.sig").FullName - Copy-Item -Path $sigFile -Destination "${{ github.workspace }}/desktop/signed-installer/" - cd ${{ github.workspace }}/desktop/signed-installer - Get-ChildItem -Path "*.exe" | Rename-Item -NewName "Open-Data-Platform_${version}_x86_64.exe" - Get-ChildItem -Path "*.sig" | Rename-Item -NewName "Open-Data-Platform_${version}_x86_64.exe.sig" + $signedInstaller = Get-ChildItem -Path "${{ github.workspace }}/desktop/signed-installer/*.exe" | Select-Object -First 1 + Rename-Item -Path $signedInstaller.FullName -NewName "Open-Data-Platform_${version}_x86_64.exe" + + - name: Regenerate updater signature + shell: pwsh + env: + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} + run: | + $version = (Get-Content src-tauri/tauri.conf.json | ConvertFrom-Json).version + $installerPath = Join-Path "${{ github.workspace }}/desktop/signed-installer" "Open-Data-Platform_${version}_x86_64.exe" + npm exec -- tauri signer sign ` + $installerPath ` + --private-key $env:TAURI_SIGNING_PRIVATE_KEY ` + --password $env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD - name: Upload Artifacts uses: actions/upload-artifact@v4 diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml index fc55b42cf79..eedf4c38d98 100644 --- a/.github/workflows/draft-release.yml +++ b/.github/workflows/draft-release.yml @@ -1,54 +1,76 @@ -name: 📝 Draft release changelog +name: Build Desktop Draft Release on: workflow_dispatch: inputs: - release_pr_number: - description: "Previous Release PR Number" - required: true - default: "" - tag: - description: "Tag for release (manual input)" - required: true - default: "" + draft: + description: "Create as draft release" + required: false + default: true + type: boolean jobs: - update_release_draft: + build-windows: + uses: ./.github/workflows/build-desktop-win64.yml + with: + release: true + secrets: inherit + permissions: + contents: write + + build-macos-arm: + uses: ./.github/workflows/build-desktop-osxARM.yml + with: + release: true + secrets: inherit + permissions: + contents: write + + build-macos-x64: + uses: ./.github/workflows/build-desktop-osx64.yml + with: + release: true + secrets: inherit + permissions: + contents: write + + publish: + needs: [build-windows, build-macos-arm, build-macos-x64] runs-on: ubuntu-latest permissions: contents: write - pull-requests: read steps: - - name: 📟 Checkout code - uses: actions/checkout@v4 - - - name: 📝 Release Drafter - id: release-drafter - uses: release-drafter/release-drafter@v6.0.0 - # with: - # config-name: platform-drafter.yml - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: 💾 Save Changelog - run: | - cat << 'EOF' > CHANGELOG.md - ${{ steps.release-drafter.outputs.body }} - EOF - - - name: 🧬 Process Changelog - run: | - pip install requests openai - python .github/scripts/process_changelog.py CHANGELOG.md ${{ github.event.inputs.release_pr_number }} - python .github/scripts/summarize_changelog.py ${{ secrets.GITHUB_TOKEN }} ${{ secrets.OPENAI_API_KEY }} - cat CHANGELOG.md - - - name: 🛫 Create Release - uses: mikepenz/action-gh-release@v1 + - name: Download all artifacts + uses: actions/download-artifact@v4 with: - body_path: "CHANGELOG.md" - tag_name: ${{ github.event.inputs.tag }} - prerelease: false + path: artifacts + + - name: Sanitize artifact filenames + run: | + find ./artifacts -depth -name "* *" | while read -r file; do mv "$file" "$(echo "$file" | tr ' ' '-')"; done + + - name: Extract Version and Tag + id: extract_version + run: | + INSTALLER_FILE=$(find ./artifacts -name "*.exe" -o -name "*.dmg" | head -n 1) + VERSION=$(basename "$INSTALLER_FILE" | sed -n 's/.*_\([0-9]\+\.[0-9]\+\.[0-9]\+\)_.*/\1/p') + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "release_name=ODP Desktop v$VERSION" >> $GITHUB_OUTPUT + echo "versioned_tag=Open-Data-Platform-v$VERSION" >> $GITHUB_OUTPUT + + - name: Prepare assets + id: prep_assets + run: | + mkdir ./release_assets + find ./artifacts -type f -print -exec cp {} ./release_assets/ \; + echo "assets_path=./release_assets" >> $GITHUB_OUTPUT + + - name: Create VERSIONED release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ steps.extract_version.outputs.versioned_tag }} + name: ${{ steps.extract_version.outputs.release_name }} + files: ${{ steps.prep_assets.outputs.assets_path }}/* draft: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + prerelease: false + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index 0c4bca52287..3c2c5d57fe4 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -1,180 +1,17 @@ -name: Release ODP Desktop +name: Update ODP Tag Release on: - workflow_call: - inputs: - tag: - required: true - type: string - draft: - required: true - type: boolean release: types: [published] workflow_dispatch: inputs: - tag: - description: "Tag for release" - required: false - default: "" - draft: - description: "Create as draft release" - required: false - default: "false" + tag_name: + description: "Tag name of the release to process (e.g., Open-Data-Platform-v0.6.0)" + required: true + type: string jobs: - build-windows: - uses: ./.github/workflows/build-desktop-win64.yml - with: - release: true - secrets: inherit - permissions: - contents: write - - build-macos-arm: - uses: ./.github/workflows/build-desktop-osxARM.yml - with: - release: true - secrets: inherit - permissions: - contents: write - - build-macos-x64: - uses: ./.github/workflows/build-desktop-osx64.yml - with: - release: true - secrets: inherit - permissions: - contents: write - - publish: - needs: [build-windows, build-macos-arm, build-macos-x64] - runs-on: ubuntu-latest - permissions: - contents: write - outputs: - version: ${{ steps.extract_version.outputs.version }} - tag: ${{ steps.extract_version.outputs.tag }} - steps: - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: Sanitize artifact filenames - run: | - find ./artifacts -depth -name "* *" | while read -r file; do mv "$file" "$(echo "$file" | tr ' ' '-')"; done - - - name: Extract Version and Tag - id: extract_version - run: | - # Use input tag if provided, otherwise extract from artifacts - if [ -n "${{ github.event.inputs.tag }}" ]; then - TAG="${{ github.event.inputs.tag }}" - VERSION=$(echo "$TAG" | sed 's/^[^0-9]*//') - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "release_name=Open Data Platform $TAG" >> $GITHUB_OUTPUT - echo "tag=$TAG" >> $GITHUB_OUTPUT - else - INSTALLER_FILE=$(find ./artifacts -name "*.exe" -o -name "*.dmg" | head -n 1) - if [ -z "$INSTALLER_FILE" ]; then - echo "::error::No installer file found in artifacts." - exit 1 - fi - VERSION=$(basename "$INSTALLER_FILE" | sed -n 's/.*_\([0-9]\+\.[0-9]\+\.[0-9]\+\)_.*/\1/p') - if [ -z "$VERSION" ]; then - echo "::error::Could not extract version from filename: $(basename "$INSTALLER_FILE")" - exit 1 - fi - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "release_name=Open Data Platform v$VERSION" >> $GITHUB_OUTPUT - echo "tag=Open-Data-Platform-v$VERSION" >> $GITHUB_OUTPUT - fi - - - name: Prepare assets and generate release.json - id: prep_assets - run: | - mkdir ./release_assets - find ./artifacts -type f -print -exec cp {} ./release_assets/ \; - cd ./release_assets - VERSION="${{ steps.extract_version.outputs.version }}" - RELEASE_NAME="${{ steps.extract_version.outputs.release_name }}" - TAG="${{ steps.extract_version.outputs.tag }}" - cat << EOF > release.json - { - "version": "$VERSION", - "notes": "Release for $RELEASE_NAME", - "pub_date": "$(date -u +'%Y-%m-%dT%H:%M:%SZ')", - "platforms": { - EOF - WIN_EXE=$(find . -name "*_x86_64.exe" | head -n 1) - if [ -n "$WIN_EXE" ]; then - WIN_SIG_FILE="${WIN_EXE}.sig" - WIN_SIG=$(cat "$WIN_SIG_FILE") - WIN_URL="https://github.com/${{ github.repository }}/releases/download/${TAG}/$(basename "$WIN_EXE")" - cat << EOF >> release.json - "windows-x86_64": { - "signature": "$WIN_SIG", - "url": "$WIN_URL" - } - EOF - fi - MAC_ARM_TAR=$(find . -name "*_aarch64.app.tar.gz" | head -n 1) - if [ -n "$MAC_ARM_TAR" ]; then - if [ -n "$WIN_EXE" ]; then - echo "," >> release.json - fi - MAC_ARM_SIG=$(cat "${MAC_ARM_TAR}.sig") - MAC_ARM_URL="https://github.com/${{ github.repository }}/releases/download/${TAG}/$(basename "$MAC_ARM_TAR")" - cat << EOF >> release.json - "darwin-aarch64": { - "signature": "$MAC_ARM_SIG", - "url": "$MAC_ARM_URL" - } - EOF - fi - MAC_X64_TAR=$(find . -name "*_x86_64.app.tar.gz" | head -n 1) - if [ -n "$MAC_X64_TAR" ]; then - if [ -n "$WIN_EXE" ] || [ -n "$MAC_ARM_TAR" ]; then - echo "," >> release.json - fi - MAC_X64_SIG=$(cat "${MAC_X64_TAR}.sig") - MAC_X64_URL="https://github.com/${{ github.repository }}/releases/download/${TAG}/$(basename "$MAC_X64_TAR")" - cat << EOF >> release.json - "darwin-x86_64": { - "signature": "$MAC_X64_SIG", - "url": "$MAC_X64_URL" - } - EOF - fi - cat << EOF >> release.json - } - } - EOF - echo "Generated release.json:" - cat release.json - cd .. - echo "assets_path=./release_assets" >> $GITHUB_OUTPUT - - - name: Upload release assets - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ steps.extract_version.outputs.tag }} - name: ${{ steps.extract_version.outputs.release_name }} - files: ${{ steps.prep_assets.outputs.assets_path }}/* - draft: ${{ github.event.inputs.draft == 'true' }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload release.json as artifact for odp job - uses: actions/upload-artifact@v4 - with: - name: release-json - path: ./release_assets/release.json - - update-latest-tag: - needs: publish - # Only run this job if not a draft release - if: github.event.inputs.draft != 'true' + update-odp-release: runs-on: ubuntu-latest permissions: contents: write @@ -182,36 +19,144 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Download release artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: Delete existing odp tag and release - continue-on-error: true + - name: Set release tag + id: set_tag run: | - gh release delete odp --yes || true - git push origin :refs/tags/odp || true + if [ "${{ github.event_name }}" == "release" ]; then + echo "tag=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT + else + echo "tag=${{ github.event.inputs.tag_name }}" >> $GITHUB_OUTPUT + fi + + - name: Download release artifacts from published release + run: | + mkdir -p artifacts + gh release download "${{ steps.set_tag.outputs.tag }}" --dir artifacts --repo ${{ github.repository }} --pattern "*" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Prepare latest assets + - name: Extract Version and Tag from release + id: extract_version + run: | + INSTALLER_FILE=$(find ./artifacts -name "*.exe" -o -name "*.dmg" | head -n 1) + if [ -z "$INSTALLER_FILE" ]; then + echo "::error::No installer file found in artifacts." + exit 1 + fi + VERSION=$(basename "$INSTALLER_FILE" | sed -n 's/.*_\([0-9]\+\.[0-9]\+\.[0-9]\+\)_.*/\1/p') + if [ -z "$VERSION" ]; then + echo "::error::Could not extract version from filename: $(basename "$INSTALLER_FILE")" + exit 1 + fi + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "release_name=ODP Desktop v$VERSION" >> $GITHUB_OUTPUT + echo "versioned_tag=${{ steps.set_tag.outputs.tag }}" >> $GITHUB_OUTPUT + + - name: Delete existing ODP tag and release + continue-on-error: true + run: | + gh release delete ODP --yes || true + git push origin :refs/tags/ODP || true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Prepare ODP assets and generate latest.json for ODP release run: | mkdir ./odp_assets - find ./artifacts -name "*.exe" -exec cp {} ./odp_assets/ \; - find ./artifacts -name "*.dmg" -exec cp {} ./odp_assets/ \; - if [ -f ./artifacts/release-json/release.json ]; then - cp ./artifacts/release-json/release.json ./odp_assets/latest.json + + for file in $(find ./artifacts -name "*.exe"); do + BASENAME=$(basename "$file") + NEW_NAME=$(echo "$BASENAME" | sed -E 's/_[0-9]+\.[0-9]+\.[0-9]+_/_latest_/') + cp "$file" "./odp_assets/$NEW_NAME" + done + + for file in $(find ./artifacts -name "*.dmg"); do + BASENAME=$(basename "$file") + NEW_NAME=$(echo "$BASENAME" | sed -E 's/_[0-9]+\.[0-9]+\.[0-9]+_/_latest_/') + cp "$file" "./odp_assets/$NEW_NAME" + done + + VERSION="${{ steps.extract_version.outputs.version }}" + RELEASE_NAME="${{ steps.extract_version.outputs.release_name }}" + VERSIONED_TAG="${{ steps.extract_version.outputs.versioned_tag }}" + + cd ./odp_assets + + cat << EOF > latest.json + { + "version": "$VERSION", + "notes": "Latest stable release - $RELEASE_NAME", + "pub_date": "$(date -u +'%Y-%m-%dT%H:%M:%SZ')", + "platforms": { + EOF + + FIRST_PLATFORM=true + + WIN_EXE=$(find ../artifacts -name "*_x86_64.exe" | head -n 1) + if [ -n "$WIN_EXE" ]; then + WIN_SIG_FILE="${WIN_EXE}.sig" + WIN_SIG=$(cat "$WIN_SIG_FILE") + WIN_URL="https://github.com/${{ github.repository }}/releases/download/${VERSIONED_TAG}/$(basename "$WIN_EXE")" + cat << EOF >> latest.json + "windows-x86_64": { + "signature": "$WIN_SIG", + "url": "$WIN_URL" + } + EOF + FIRST_PLATFORM=false fi - - name: Create latest release + MAC_ARM_TAR=$(find ../artifacts -name "*_aarch64.app.tar.gz" | head -n 1) + if [ -n "$MAC_ARM_TAR" ]; then + if [ "$FIRST_PLATFORM" = false ]; then + echo "," >> latest.json + fi + MAC_ARM_SIG=$(cat "${MAC_ARM_TAR}.sig") + MAC_ARM_URL="https://github.com/${{ github.repository }}/releases/download/${VERSIONED_TAG}/$(basename "$MAC_ARM_TAR")" + cat << EOF >> latest.json + "darwin-aarch64": { + "signature": "$MAC_ARM_SIG", + "url": "$MAC_ARM_URL" + } + EOF + FIRST_PLATFORM=false + fi + + MAC_X64_TAR=$(find ../artifacts -name "*_x86_64.app.tar.gz" | head -n 1) + if [ -n "$MAC_X64_TAR" ]; then + if [ "$FIRST_PLATFORM" = false ]; then + echo "," >> latest.json + fi + MAC_X64_SIG=$(cat "${MAC_X64_TAR}.sig") + MAC_X64_URL="https://github.com/${{ github.repository }}/releases/download/${VERSIONED_TAG}/$(basename "$MAC_X64_TAR")" + cat << EOF >> latest.json + "darwin-x86_64": { + "signature": "$MAC_X64_SIG", + "url": "$MAC_X64_URL" + } + EOF + fi + + cat << EOF >> latest.json + } + } + EOF + + echo "Generated latest.json for ODP release:" + cat latest.json + + - name: Create ODP release uses: softprops/action-gh-release@v1 with: - tag_name: odp - name: Latest Release + tag_name: ODP + name: ODP Desktop (Latest Stable) body: | - This is the latest stable release. - For version-specific details, see the corresponding versioned release. + **This is the latest stable release (v${{ steps.extract_version.outputs.version }})** + + This release always points to the most recent stable version. + For version-specific details and release notes, see: [${{ steps.extract_version.outputs.release_name }}](https://github.com/${{ github.repository }}/releases/tag/${{ steps.extract_version.outputs.versioned_tag }}) + + The `latest.json` file in this release is used by the auto-updater to check for new versions. files: ./odp_assets/* prerelease: false draft: false diff --git a/.github/workflows/test-unit-desktop-winARM.yml b/.github/workflows/test-unit-desktop-winARM.yml new file mode 100644 index 00000000000..df36e584174 --- /dev/null +++ b/.github/workflows/test-unit-desktop-winARM.yml @@ -0,0 +1,116 @@ +name: Test Windows ARM64 + +on: + pull_request: + branches: + - develop + paths: + - 'desktop/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + +jobs: + test-windows-arm64: + runs-on: windows-11-arm + permissions: + contents: read + defaults: + run: + working-directory: desktop + env: + VCPKG_ROOT: ${{ github.workspace }}/vcpkg + steps: + - uses: actions/checkout@v4 + + - name: Cache vcpkg + uses: actions/cache@v4 + with: + path: ${{ env.VCPKG_ROOT }} + key: ${{ runner.os }}-vcpkg-arm64-${{ hashFiles('desktop/**/vcpkg.json') }} + restore-keys: | + ${{ runner.os }}-vcpkg-arm64- + + - name: Bootstrap vcpkg + working-directory: ${{ github.workspace }} + run: | + if (-not (Test-Path ${{ env.VCPKG_ROOT }})) { + git clone https://github.com/microsoft/vcpkg.git ${{ env.VCPKG_ROOT }} + } + ${{ env.VCPKG_ROOT }}/bootstrap-vcpkg.bat + shell: pwsh + + - name: Install OpenSSL using vcpkg + working-directory: ${{ github.workspace }} + run: ${{ env.VCPKG_ROOT }}/vcpkg install openssl:arm64-windows-static --vcpkg-root ${{ env.VCPKG_ROOT }} + env: + VCPKG_DEFAULT_TRIPLET: arm64-windows-static + + - name: Set OpenSSL env + shell: bash + run: | + echo "OPENSSL_DIR=${{ env.VCPKG_ROOT }}/installed/arm64-windows-static" >> $GITHUB_ENV + echo "OPENSSL_INCLUDE_DIR=${{ env.VCPKG_ROOT }}/installed/arm64-windows-static/include" >> $GITHUB_ENV + echo "OPENSSL_LIB_DIR=${{ env.VCPKG_ROOT }}/installed/arm64-windows-static/lib" >> $GITHUB_ENV + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + + - name: Set up Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + components: clippy, rustfmt + override: true + target: aarch64-pc-windows-msvc + + - name: Cache cargo registry + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: windows-arm64-cargo-registry-${{ hashFiles('desktop/**/Cargo.lock') }} + restore-keys: | + windows-arm64-cargo-registry- + + - name: Cache cargo build + uses: actions/cache@v4 + with: + path: desktop/target + key: windows-arm64-cargo-build-${{ hashFiles('desktop/**/Cargo.lock') }} + restore-keys: | + windows-arm64-cargo-build- + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run clippy linter + run: cargo clippy --all-targets --all-features --target aarch64-pc-windows-msvc -- -D warnings + + - name: Run tests + run: cargo test --all --target aarch64-pc-windows-msvc + + - name: Cache node_modules + uses: actions/cache@v4 + with: + path: desktop/node_modules + key: windows-arm64-node-modules-${{ hashFiles('desktop/**/package-lock.json') }} + restore-keys: | + windows-arm64-node-modules- + + - name: Install frontend dependencies + run: npm ci + + - name: Lint frontend code + run: npm run lint + + - name: Type check + run: ./node_modules/.bin/tsc --noEmit + + - name: Run frontend tests + run: npm run test -- --watch=false diff --git a/desktop/.gitignore b/desktop/.gitignore index 35bd2ae6be9..ace51950130 100644 --- a/desktop/.gitignore +++ b/desktop/.gitignore @@ -31,4 +31,8 @@ node_modules/ # Logs npm-debug.log* yarn-debug.log* -yarn-error.log* \ No newline at end of file +yarn-error.log* + +src-tauri/*.dll + +src-tauri/frameworks/*.dylib diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock index 45eb7f19e8f..53235bf775f 100644 --- a/desktop/Cargo.lock +++ b/desktop/Cargo.lock @@ -5673,7 +5673,7 @@ dependencies = [ [[package]] name = "openbb-platform" -version = "0.4.0" +version = "1.0.0" dependencies = [ "cc", "chrono", diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 164596775de..ddcb5725b07 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "openbb-platform", - "version": "0.4.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openbb-platform", - "version": "0.4.0", + "version": "1.0.0", "license": "AGPL-3.0", "dependencies": { "@heroicons/react": "^2.2.0", @@ -35,7 +35,7 @@ "tailwindcss": "^3.4.17", "taurpc": "^1.8.1", "tiny-invariant": "^1.3.3", - "vite-plugin-static-copy": "^2.3.2", + "vite-plugin-static-copy": "^3.1.4", "zod": "^3.25.76" }, "devDependencies": { @@ -59,7 +59,7 @@ "jsdom": "^26.1.0", "typescript": "^5.9.2", "typescript-eslint": "^8.40.0", - "vite": "^6.3.6", + "vite": "^7.1.11", "vite-plugin-svgr": "^4.3.0", "vitest": "^3.2.4" } @@ -3198,109 +3198,6 @@ "react-dom": ">=18.0.0 || >=19.0.0" } }, - "node_modules/@tanstack/react-router-devtools/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@tanstack/react-router-devtools/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@tanstack/react-router-devtools/node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/@tanstack/react-store": { "version": "0.7.7", "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.7.tgz", @@ -3399,212 +3296,6 @@ } } }, - "node_modules/@tanstack/router-devtools-core/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-devtools-core/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@tanstack/router-devtools-core/node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-devtools/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-devtools/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@tanstack/router-devtools/node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/@tanstack/router-generator": { "version": "1.132.47", "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.132.47.tgz", @@ -6624,20 +6315,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -6875,12 +6552,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "license": "ISC" - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -7759,18 +7430,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -10967,15 +10626,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unplugin": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz", @@ -11176,23 +10826,23 @@ } }, "node_modules/vite": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", - "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -11201,14 +10851,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -11273,22 +10923,21 @@ } }, "node_modules/vite-plugin-static-copy": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.2.tgz", - "integrity": "sha512-iwrrf+JupY4b9stBttRWzGHzZbeMjAHBhkrn67MNACXJVjEMRpCI10Q3AkxdBkl45IHaTfw/CNVevzQhP7yTwg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.4.tgz", + "integrity": "sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==", "license": "MIT", "dependencies": { - "chokidar": "^3.5.3", - "fast-glob": "^3.2.11", - "fs-extra": "^11.1.0", + "chokidar": "^3.6.0", "p-map": "^7.0.3", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1", + "tinyglobby": "^0.2.15" }, "engines": { "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/vite-plugin-svgr": { diff --git a/desktop/package.json b/desktop/package.json index 870374355d2..6ae0c27801b 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,7 +1,7 @@ { "name": "openbb-platform", "private": true, - "version": "0.4.0", + "version": "1.0.0", "type": "module", "license": "AGPL-3.0", "scripts": { @@ -40,7 +40,7 @@ "tailwindcss": "^3.4.17", "taurpc": "^1.8.1", "tiny-invariant": "^1.3.3", - "vite-plugin-static-copy": "^2.3.2", + "vite-plugin-static-copy": "^3.1.4", "zod": "^3.25.76" }, "devDependencies": { @@ -64,7 +64,7 @@ "jsdom": "^26.1.0", "typescript": "^5.9.2", "typescript-eslint": "^8.40.0", - "vite": "^6.3.6", + "vite": "^7.1.11", "vite-plugin-svgr": "^4.3.0", "vitest": "^3.2.4" } diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index 4e4925596a5..7da038f54f3 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "openbb-platform" -version = "0.4.0" -description = "Open Data Platform - by OpenBB - Desktop Application for managing virtual environments, application backend servers." +version = "1.0.0" +description = "Open Data Platform by OpenBB. A desktop application for managing virtual environments, application backend servers." authors = ["OpenBB, Inc."] license = "AGPL-3.0" repository = "https://github.com/OpenBB-finance/OpenBB/" @@ -49,9 +49,6 @@ tauri-plugin-opener = "2" which = "8.0.0" fix-path-env = { git = "https://github.com/tauri-apps/fix-path-env-rs" } -[target.'cfg(linux)'.dependencies] -glib = "^0.21.1" - [target.'cfg(target_os= "macos")'.dependencies] objc_exception = "0.1" objc = { version = "0.2.7", features = ["exception"] } @@ -66,6 +63,9 @@ winapi = { version = "0.3", features = ["winuser", "objbase", "shobjidl_core", " tauri-plugin-single-instance = "2" tauri-plugin-updater = "2" +[target.'cfg(linux)'.dependencies] +glib = "^0.21.1" + [features] # This feature depends on the Tauri CLI & CLI plugin for updater # By default Tauri runs in production mode diff --git a/desktop/src-tauri/open-data-platform-SBOM-cargo.cdx.xml b/desktop/src-tauri/open-data-platform-SBOM-cargo.cdx.xml index cc2e16bfb19..fca91d6e836 100644 --- a/desktop/src-tauri/open-data-platform-SBOM-cargo.cdx.xml +++ b/desktop/src-tauri/open-data-platform-SBOM-cargo.cdx.xml @@ -1,7 +1,7 @@ - + - 2025-10-13T19:39:16.565038000Z + 2025-10-22T15:34:16.482852000Z CycloneDX @@ -14,26 +14,26 @@ OpenBB, Inc. - + OpenBB, Inc. openbb-platform - 0.3.0 - Tray icon application for managing virtual environments, application backend servers, and the OpenBB Platform. + 1.0.0 + Open Data Platform by OpenBB. A desktop application for managing virtual environments, application backend servers. required AGPL-3.0 - pkg:cargo/openbb-platform@0.3.0?download_url=file://. + pkg:cargo/openbb-platform@1.0.0?download_url=file://. https://github.com/OpenBB-finance/OpenBB/ - + openbb-platform - 0.3.0 - pkg:cargo/openbb-platform@0.3.0?download_url=file://.#src/main.rs + 1.0.0 + pkg:cargo/openbb-platform@1.0.0?download_url=file://.#src/main.rs @@ -1243,6 +1243,28 @@ + + Steven Sheldon, Mads Marquart <mads@marquart.dk> + block2 + 0.5.1 + Apple's C language extension of blocks + required + + 2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f + + + MIT + + pkg:cargo/block2@0.5.1 + + + https://docs.rs/block2/ + + + https://github.com/madsmtm/objc2 + + + Mads Marquart <mads@marquart.dk> block2 @@ -8206,6 +8228,31 @@ + + Mads Marquart <mads@marquart.dk> + objc-sys + 0.3.5 + Raw bindings to the Objective-C runtime and ABI + required + + cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310 + + + MIT + + pkg:cargo/objc-sys@0.3.5 + + + https://docs.rs/objc-sys/ + + + objc_0_3 + + + https://github.com/madsmtm/objc2 + + + objc2-app-kit 0.3.2 @@ -8391,6 +8438,24 @@ + + objc2-foundation + 0.2.2 + Bindings to the Foundation framework + required + + 0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8 + + + MIT + + pkg:cargo/objc2-foundation@0.2.2 + + + https://github.com/madsmtm/objc2 + + + objc2-foundation 0.3.2 @@ -8517,6 +8582,28 @@ + + Steven Sheldon, Mads Marquart <mads@marquart.dk> + objc2 + 0.5.2 + Objective-C interface and runtime bindings + required + + 46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804 + + + MIT + + pkg:cargo/objc2@0.5.2 + + + https://docs.rs/objc2/ + + + https://github.com/madsmtm/objc2 + + + Mads Marquart <mads@marquart.dk> objc2 @@ -17752,7 +17839,7 @@ - + @@ -17765,9 +17852,9 @@ - + - + @@ -18101,6 +18188,9 @@ + + + @@ -19480,6 +19570,7 @@ + @@ -19538,6 +19629,12 @@ + + + + + + @@ -19580,6 +19677,10 @@ + + + + diff --git a/desktop/src-tauri/open-data-platform-SBOM-npm.cdx.xml b/desktop/src-tauri/open-data-platform-SBOM-npm.cdx.xml index 38b6f6792bc..7f481d22f5a 100644 --- a/desktop/src-tauri/open-data-platform-SBOM-npm.cdx.xml +++ b/desktop/src-tauri/open-data-platform-SBOM-npm.cdx.xml @@ -1,7 +1,7 @@ - + - 2025-10-13T19:37:29.548Z + 2025-10-22T15:34:01.615Z @@ -62,15 +62,15 @@ - + openbb-platform - 0.3.0 + 1.0.0 AGPL-3.0 - pkg:npm/openbb-platform@0.3.0 + pkg:npm/openbb-platform@1.0.0 true @@ -86,7 +86,7 @@ - + @eslint js 9.37.0 @@ -112,10 +112,14 @@ https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8da4be349fa1c629acc011baa63357d2e109664ad3d33c29562dc1037bd7db66851a32639a04934a63e964244a9a804be5563f33aa74c6c489c7bae4eeccb982 + + true node_modules/@eslint/js @@ -127,7 +131,7 @@ - + @heroicons react 2.2.0 @@ -152,7 +156,10 @@ https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2cc71ea6f45a4bd2d81c91ac174cf39a02825229bf5f737f0d029ce237a901727b97c4312753e6c49ceaa65176677144e0fa810081b224043fc3807976ca9bb5 + @@ -167,7 +174,7 @@ - + bluebill1049 @hookform resolvers @@ -194,7 +201,10 @@ https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + efd0effb798317b8bed9a8e3ed2932a52287865d5c6e59f53866afaabb05ee9ea66d4bf5d71a6aa5a70fb060c24d1bc24a310421ecf679fd4dbde4952f76f402 + @@ -209,7 +219,7 @@ - + @openbb ui-pro 0.6.10 @@ -217,7 +227,10 @@ https://registry.npmjs.org/@openbb/ui-pro/-/ui-pro-0.6.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f5a85e8fef0e758759adb1bb271baa17dee2861b36c4d111b1d0610db0127c0b85bfa2e867b0d8089c52d4fe0c47de910f807000aa8160c128314f2d25d6fee2 + @@ -225,7 +238,7 @@ - + Tanner Linsley @tanstack react-router @@ -252,7 +265,10 @@ https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.132.47.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9a308dd6e7952c704e2b582a2de69c0ab50f05989eb4c29392bef16650b7d9d0869f87bef37ccc4a54534b64eb125efec041fe6ea8e7a32c7c00b6134a24350a + @@ -267,7 +283,7 @@ - + Tanner Linsley @tanstack router-core @@ -294,7 +310,10 @@ https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.132.47.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f182851e61ba554a97696009cc4aa3c96eb0df5740452d9449dda6b48e5979972286a31bb242b6f0de22a2d057367fac48a2673d18dcec0e234e79c47fc327f1 + @@ -309,7 +328,7 @@ - + Tanner Linsley @tanstack router-devtools @@ -336,137 +355,15 @@ https://registry.npmjs.org/@tanstack/router-devtools/-/router-devtools-1.132.47.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 08b9544fa7dc1ba13bb621bf386e61ef6302fe8c010d29279636cd2bbb05af7b5ab890afe81d59a24e2365d11bf157b13397406b4031dabc9234b1eba4906a8b + node_modules/@tanstack/router-devtools - - - Evan You - vite - 7.1.9 - Native-ESM powered web dev build tool - - - MIT - - - pkg:npm/vite@7.1.9#packages/vite - - - git+https://github.com/vitejs/vite.git#packages/vite - as detected from PackageJson property "repository.url" and "repository.directory" - - - https://vite.dev - as detected from PackageJson property "homepage" - - - https://github.com/vitejs/vite/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/vite/-/vite-7.1.9.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/router-devtools/node_modules/vite - - - - - file: LICENSE.md - IyBWaXRlIGNvcmUgbGljZW5zZQpWaXRlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKCk1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTktcHJlc2VudCwgVm9pZFplcm8gSW5jLiBhbmQgVml0ZSBjb250cmlidXRvcnMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgojIExpY2Vuc2VzIG9mIGJ1bmRsZWQgZGVwZW5kZW5jaWVzClRoZSBwdWJsaXNoZWQgVml0ZSBhcnRpZmFjdCBhZGRpdGlvbmFsbHkgY29udGFpbnMgY29kZSB3aXRoIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CkJTRC0yLUNsYXVzZSwgQ0MwLTEuMCwgSVNDLCBNSVQKCiMgQnVuZGxlZCBkZXBlbmRlbmNpZXM6CiMjIEBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nLCBAanJpZGdld2VsbC9yZW1hcHBpbmcsIEBqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYywgQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZwpMaWNlbnNlOiBNSVQKQnk6IEp1c3RpbiBSaWRnZXdlbGwKUmVwb3NpdG9yaWVzOiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvc291cmNlbWFwcy5naXQsIGdpdCtodHRwczovL2dpdGh1Yi5jb20vanJpZGdld2VsbC9zb3VyY2VtYXBzLmdpdCwgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3NvdXJjZW1hcHMuZ2l0LCBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvc291cmNlbWFwcy5naXQKCj4gQ29weXJpZ2h0IDIwMjQgSnVzdGluIFJpZGdld2VsbCA8anVzdGluQHJpZGdld2VsbC5uYW1lPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQGpyaWRnZXdlbGwvcmVzb2x2ZS11cmkKTGljZW5zZTogTUlUCkJ5OiBKdXN0aW4gUmlkZ2V3ZWxsClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3Jlc29sdmUtdXJpCgo+IENvcHlyaWdodCAyMDE5IEp1c3RpbiBSaWRnZXdlbGwgPGpyaWRnZXdlbGxAZ29vZ2xlLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBwb2xrYS9jb21wcmVzc2lvbgpMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogbHVrZWVkL3BvbGthCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBwb2xrYS91cmwKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL3BvbGthCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEByb2xsZG93bi9wbHVnaW51dGlscwpMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9yb2xsZG93bi9yb2xsZG93bi5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjQtcHJlc2VudCBWb2lkWmVybyBJbmMuICYgQ29udHJpYnV0b3JzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgo+IAo+IGVuZCBvZiB0ZXJtcyBhbmQgY29uZGl0aW9ucwo+IAo+IFRoZSBsaWNlbnNlcyBvZiBleHRlcm5hbGx5IG1haW50YWluZWQgbGlicmFyaWVzIGZyb20gd2hpY2ggcGFydHMgb2YgdGhlIFNvZnR3YXJlIGlzIGRlcml2ZWQgYXJlIGxpc3RlZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL3JvbGxkb3duL3JvbGxkb3duL2Jsb2IvbWFpbi9USElSRC1QQVJUWS1MSUNFTlNFKS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQHJvbGx1cC9wbHVnaW4tYWxpYXMsIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzLCBAcm9sbHVwL3BsdWdpbi1keW5hbWljLWltcG9ydC12YXJzLCBAcm9sbHVwL3BsdWdpbnV0aWxzCkxpY2Vuc2U6IE1JVApCeTogSm9oYW5uZXMgU3RlaW4KUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogTGFyc0RlbkJha2tlcgpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgUm9sbHVwSlMgUGx1Z2luIENvbnRyaWJ1dG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL2dyYXBocy9jb250cmlidXRvcnMpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBhbnltYXRjaApMaWNlbnNlOiBJU0MKQnk6IEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXRjaC9hbnltYXRjaAoKPiBUaGUgSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgRWxhbiBTaGFua2VyLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGFydGljaG9raWUKTGljZW5zZTogTUlUCkJ5OiBzYXBwaGktcmVkLCBFdmFuIFlvdQpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3NhcHBoaS1yZWQvYXJ0aWNob2tpZS5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAtcHJlc2VudCwgWXV4aSAoRXZhbikgWW91Cj4gQ29weXJpZ2h0IChjKSAyMDIzLXByZXNlbnQsIHNhcHBoaS1yZWQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGJpbmFyeS1leHRlbnNpb25zCkxpY2Vuc2U6IE1JVApCeTogU2luZHJlIFNvcmh1cwpSZXBvc2l0b3J5OiBzaW5kcmVzb3JodXMvYmluYXJ5LWV4dGVuc2lvbnMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gQ29weXJpZ2h0IChjKSBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgYnJhY2VzLCBmaWxsLXJhbmdlLCBpcy1udW1iZXIKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIEVsYW4gU2hhbmtlciwgRXVnZW5lIFNoYXJ5Z2luLCBoZW1hbnRoLmhtClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvYnJhY2VzCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBFZG8gUml2YWksIFBhdWwgTWlsbGVyLCBSb3V2ZW4gV2XDn2xpbmcKUmVwb3NpdG9yeTogam9uc2NobGlua2VydC9maWxsLXJhbmdlCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBPbHN0ZW4gTGFyY2ssIFJvdXZlbiBXZcOfbGluZwpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L2lzLW51bWJlcgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBidW5kbGUtbmFtZSwgZGVmYXVsdC1icm93c2VyLCBkZWZhdWx0LWJyb3dzZXItaWQsIGRlZmluZS1sYXp5LXByb3AsIGlzLWRvY2tlciwgaXMtaW5zaWRlLWNvbnRhaW5lciwgaXMtd3NsLCBvcGVuLCBydW4tYXBwbGVzY3JpcHQsIHdzbC11dGlscwpMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvYnVuZGxlLW5hbWUsIHNpbmRyZXNvcmh1cy9kZWZhdWx0LWJyb3dzZXIsIHNpbmRyZXNvcmh1cy9kZWZhdWx0LWJyb3dzZXItaWQsIHNpbmRyZXNvcmh1cy9kZWZpbmUtbGF6eS1wcm9wLCBzaW5kcmVzb3JodXMvaXMtZG9ja2VyLCBzaW5kcmVzb3JodXMvaXMtaW5zaWRlLWNvbnRhaW5lciwgc2luZHJlc29yaHVzL2lzLXdzbCwgc2luZHJlc29yaHVzL29wZW4sIHNpbmRyZXNvcmh1cy9ydW4tYXBwbGVzY3JpcHQsIHNpbmRyZXNvcmh1cy93c2wtdXRpbHMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjYWMKTGljZW5zZTogTUlUCkJ5OiBlZ29pc3QKUmVwb3NpdG9yeTogZWdvaXN0L2NhYwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEVHT0lTVCA8MHgxNDI4NTdAZ21haWwuY29tPiAoaHR0cHM6Ly9naXRodWIuY29tL2Vnb2lzdCkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNob2tpZGFyCkxpY2Vuc2U6IE1JVApCeTogUGF1bCBNaWxsZXIsIEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9jaG9raWRhci5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgUGF1bCBNaWxsZXIgKGh0dHBzOi8vcGF1bG1pbGxyLmNvbSksIEVsYW4gU2hhbmtlcgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg4oCcQVMgSVPigJ0sIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb21tb25kaXIsIHNoZWxsLXF1b3RlCkxpY2Vuc2U6IE1JVApCeTogSmFtZXMgSGFsbGlkYXkKUmVwb3NpdG9yaWVzOiBodHRwOi8vZ2l0aHViLmNvbS9zdWJzdGFjay9ub2RlLWNvbW1vbmRpci5naXQsIGh0dHA6Ly9naXRodWIuY29tL2xqaGFyYi9zaGVsbC1xdW90ZS5naXQKCj4gVGhlIE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEphbWVzIEhhbGxpZGF5IChtYWlsQHN1YnN0YWNrLm5ldCkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgCj4gdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIAo+IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byAKPiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIAo+IG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSAKPiB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCAKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAKPiBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiAKPiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNvbm5lY3QKTGljZW5zZTogTUlUCkJ5OiBUSiBIb2xvd2F5Y2h1aywgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24sIEpvbmF0aGFuIE9uZywgVGltIENhc3dlbGwKUmVwb3NpdG9yeTogc2VuY2hhbGFicy9jb25uZWN0Cgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEwIFNlbmNoYSBJbmMuCj4gQ29weXJpZ2h0IChjKSAyMDExIExlYXJuQm9vc3QKPiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUSiBIb2xvd2F5Y2h1awo+IENvcHlyaWdodCAoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb252ZXJ0LXNvdXJjZS1tYXAKTGljZW5zZTogTUlUCkJ5OiBUaG9yc3RlbiBMb3JlbnoKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS90aGxvcmVuei9jb252ZXJ0LXNvdXJjZS1tYXAuZ2l0Cgo+IENvcHlyaWdodCAyMDEzIFRob3JzdGVuIExvcmVuei4gCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNvcnMKTGljZW5zZTogTUlUCkJ5OiBUcm95IEdvb2RlClJlcG9zaXRvcnk6IGV4cHJlc3Nqcy9jb3JzCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIFRyb3kgR29vZGUgPHRyb3lnb29kZUBnbWFpbC5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNyb3NzLXNwYXduCkxpY2Vuc2U6IE1JVApCeTogQW5kcsOpIENydXoKUmVwb3NpdG9yeTogZ2l0QGdpdGh1Yi5jb206bW94eXN0dWRpby9ub2RlLWNyb3NzLXNwYXduLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTggTWFkZSBXaXRoIE1PWFkgTGRhIDxoZWxsb0Btb3h5LnN0dWRpbz4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNzc2VzYwpMaWNlbnNlOiBNSVQKQnk6IE1hdGhpYXMgQnluZW5zClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL2Nzc2VzYy5naXQKCj4gQ29weXJpZ2h0IE1hdGhpYXMgQnluZW5zIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCj4gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgo+IE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgo+IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkZWJ1ZwpMaWNlbnNlOiBNSVQKQnk6IEpvc2ggSnVub24sIFRKIEhvbG93YXljaHVrLCBOYXRoYW4gUmFqbGljaCwgQW5kcmV3IFJoeW5lClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vZGVidWctanMvZGVidWcuZ2l0Cgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT4KPiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMSBKb3NoIEp1bm9uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCj4gYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAo+IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCj4gcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UCj4gTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkb3RlbnYKTGljZW5zZTogQlNELTItQ2xhdXNlClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vbW90ZG90bGEvZG90ZW52LmdpdAoKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNjb3R0IE1vdHRlCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKPiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKPiAKPiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwo+ICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCj4gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCj4gICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KPiAKPiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKPiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCj4gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCj4gRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQo+IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCj4gREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKPiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgo+IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCj4gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKPiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkb3RlbnYtZXhwYW5kCkxpY2Vuc2U6IEJTRC0yLUNsYXVzZQpCeTogbW90ZG90bGEKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL21vdGRvdGxhL2RvdGVudi1leHBhbmQKCj4gQ29weXJpZ2h0IChjKSAyMDE2LCBTY290dCBNb3R0ZQo+IEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gCj4gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cj4gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Cj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKPiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgo+IAo+ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAo+ICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgo+ICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCj4gCj4gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCj4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQo+IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQo+IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKPiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAo+IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCj4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKPiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAo+IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCj4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZWUtZmlyc3QKTGljZW5zZTogTUlUCkJ5OiBKb25hdGhhbiBPbmcsIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IGpvbmF0aGFub25nL2VlLWZpcnN0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBKb25hdGhhbiBPbmcgbWVAam9uZ2xlYmVycnkuY29tCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlbmNvZGV1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgpSZXBvc2l0b3J5OiBwaWxsYXJqcy9lbmNvZGV1cmwKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZW50aXRpZXMKTGljZW5zZTogQlNELTItQ2xhdXNlCkJ5OiBGZWxpeCBCb2VobQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2ZiNTUvZW50aXRpZXMuZ2l0Cgo+IENvcHlyaWdodCAoYykgRmVsaXggQsO2aG0KPiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+IAo+IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKPiAKPiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCj4gCj4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgo+IAo+IFRISVMgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMsCj4gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZXMtbW9kdWxlLWxleGVyCkxpY2Vuc2U6IE1JVApCeTogR3V5IEJlZGZvcmQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ndXliZWRmb3JkL2VzLW1vZHVsZS1sZXhlci5naXQKCj4gTUlUIExpY2Vuc2UKPiAtLS0tLS0tLS0tLQo+IAo+IENvcHlyaWdodCAoQykgMjAxOC0yMDIyIEd1eSBCZWRmb3JkCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlc2NhcGUtaHRtbApMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogY29tcG9uZW50L2VzY2FwZS1odG1sCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNodWsKPiBDb3B5cmlnaHQgKGMpIDIwMTUgQW5kcmVhcyBMdWJiZQo+IENvcHlyaWdodCAoYykgMjAxNSBUaWFuY2hlbmcgIlRpbW90aHkiIEd1Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGVzdHJlZS13YWxrZXIKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vUmljaC1IYXJyaXMvZXN0cmVlLXdhbGtlcgoKPiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAgW3RoZXNlIHBlb3BsZV0oaHR0cHM6Ly9naXRodWIuY29tL1JpY2gtSGFycmlzL2VzdHJlZS13YWxrZXIvZ3JhcGhzL2NvbnRyaWJ1dG9ycykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGV0YWcKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgRGF2aWQgQmrDtnJrbHVuZApSZXBvc2l0b3J5OiBqc2h0dHAvZXRhZwoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGZpbmFsaGFuZGxlcgpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHBpbGxhcmpzL2ZpbmFsaGFuZGxlcgoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBmb2xsb3ctcmVkaXJlY3RzCkxpY2Vuc2U6IE1JVApCeTogUnViZW4gVmVyYm9yZ2gsIE9saXZpZXIgTGFsb25kZSwgSmFtZXMgVGFsbWFnZQpSZXBvc2l0b3J5OiBnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vZm9sbG93LXJlZGlyZWN0cy9mb2xsb3ctcmVkaXJlY3RzLmdpdAoKPiBDb3B5cmlnaHQgMjAxNOKAk3ByZXNlbnQgT2xpdmllciBMYWxvbmRlIDxvbGFsb25kZUBnbWFpbC5jb20+LCBKYW1lcyBUYWxtYWdlIDxqYW1lc0B0YWxtYWdlLmlvPiwgUnViZW4gVmVyYm9yZ2gKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKPiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KPiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBnZW5lcmljLW5hbWVzCkxpY2Vuc2U6IE1JVApCeTogQWxleGV5IExpdHZpbm92ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvZ2VuZXJpYy1uYW1lcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1IEFsZXhleSBMaXR2aW5vdgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZ2xvYi1wYXJlbnQKTGljZW5zZTogSVNDCkJ5OiBHdWxwIFRlYW0sIEVsYW4gU2hhbmtlciwgQmxhaW5lIEJ1YmxpdHoKUmVwb3NpdG9yeTogZ3VscGpzL2dsb2ItcGFyZW50Cgo+IFRoZSBJU0MgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgMjAxOSBFbGFuIFNoYW5rZXIKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBob3N0LXZhbGlkYXRpb24tbWlkZGxld2FyZQpMaWNlbnNlOiBNSVQKQnk6IHNhcHBoaS1yZWQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9zYXBwaGktcmVkL2hvc3QtdmFsaWRhdGlvbi1taWRkbGV3YXJlLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyNSBzYXBwaGktcmVkCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBodHRwLXByb3h5LTMKTGljZW5zZTogTUlUCkJ5OiBXaWxsaWFtIFN0ZWluLCBDaGFybGllIFJvYmJpbnMsIEppbWIgRXNzZXIsIGpjcnVnenoKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL3NhZ2VtYXRoaW5jL2h0dHAtcHJveHktMy5naXQKCj4gbm9kZS1odHRwLTMKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNSBXaWxsaWFtIFN0ZWluLCBDaGFybGllIFJvYmJpbnMsIEphcnJldHQgQ3J1Z2VyICYgdGhlIENvbnRyaWJ1dG9ycy4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQo+IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KPiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KPiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaWNzcy11dGlscwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL2ljc3MtdXRpbHMuZ2l0Cgo+IElTQyBMaWNlbnNlIChJU0MpCj4gQ29weXJpZ2h0IDIwMTggR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBpcy1iaW5hcnktcGF0aApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yeTogc2luZHJlc29yaHVzL2lzLWJpbmFyeS1wYXRoCgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE5IFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtZXh0Z2xvYgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0ClJlcG9zaXRvcnk6IGpvbnNjaGxpbmtlcnQvaXMtZXh0Z2xvYgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgSm9uIFNjaGxpbmtlcnQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzLWdsb2IKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIERhbmllbCBQZXJlegpSZXBvc2l0b3J5OiBtaWNyb21hdGNoL2lzLWdsb2IKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0Lgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtcmVmZXJlbmNlCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9SaWNoLUhhcnJpcy9pcy1yZWZlcmVuY2UuZ2l0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzZXhlLCB3aGljaApMaWNlbnNlOiBJU0MKQnk6IElzYWFjIFouIFNjaGx1ZXRlcgpSZXBvc2l0b3JpZXM6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL2lzZXhlLmdpdCwgZ2l0Oi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS13aGljaC5naXQKCj4gVGhlIElTQyBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBJc2FhYyBaLiBTY2hsdWV0ZXIgYW5kIENvbnRyaWJ1dG9ycwo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGpzLXRva2VucwpMaWNlbnNlOiBNSVQKQnk6IFNpbW9uIEx5ZGVsbApSZXBvc2l0b3J5OiBseWRlbGwvanMtdG9rZW5zCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCBTaW1vbiBMeWRlbGwKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxhdW5jaC1lZGl0b3IsIGxhdW5jaC1lZGl0b3ItbWlkZGxld2FyZQpMaWNlbnNlOiBNSVQKQnk6IEV2YW4gWW91ClJlcG9zaXRvcmllczogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS95eXg5OTA4MDMvbGF1bmNoLWVkaXRvci5naXQsIGdpdCtodHRwczovL2dpdGh1Yi5jb20veXl4OTkwODAzL2xhdW5jaC1lZGl0b3IuZ2l0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNy1wcmVzZW50LCBZdXhpIChFdmFuKSBZb3UKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxpbGNvbmZpZwpMaWNlbnNlOiBNSVQKQnk6IGFudG9uazUyClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnRvbms1Mi9saWxjb25maWcKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjIgQW50b24gS2FzdHJpdHNraXkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxvYWRlci11dGlscwpMaWNlbnNlOiBNSVQKQnk6IFRvYmlhcyBLb3BwZXJzIEBzb2tyYQpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay9sb2FkZXItdXRpbHMuZ2l0Cgo+IENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbG9kYXNoLmNhbWVsY2FzZQpMaWNlbnNlOiBNSVQKQnk6IEpvaG4tRGF2aWQgRGFsdG9uLCBCbGFpbmUgQnVibGl0eiwgTWF0aGlhcyBCeW5lbnMKUmVwb3NpdG9yeTogbG9kYXNoL2xvZGFzaAoKPiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz4KPiAKPiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzLCBjb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLAo+IERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9ycyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvPgo+IAo+IFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Cj4gaW5kaXZpZHVhbHMuIEZvciBleGFjdCBjb250cmlidXRpb24gaGlzdG9yeSwgc2VlIHRoZSByZXZpc2lvbiBoaXN0b3J5Cj4gYXZhaWxhYmxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoCj4gCj4gVGhlIGZvbGxvd2luZyBsaWNlbnNlIGFwcGxpZXMgdG8gYWxsIHBhcnRzIG9mIHRoaXMgc29mdHdhcmUgZXhjZXB0IGFzCj4gZG9jdW1lbnRlZCBiZWxvdzoKPiAKPiA9PT09Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAo+IE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKPiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCj4gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCj4gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCj4gCj4gPT09PQo+IAo+IENvcHlyaWdodCBhbmQgcmVsYXRlZCByaWdodHMgZm9yIHNhbXBsZSBjb2RlIGFyZSB3YWl2ZWQgdmlhIENDMC4gU2FtcGxlCj4gY29kZSBpcyBkZWZpbmVkIGFzIGFsbCBzb3VyY2UgY29kZSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBwcm9zZSBvZiB0aGUKPiBkb2N1bWVudGF0aW9uLgo+IAo+IENDMDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLwo+IAo+ID09PT0KPiAKPiBGaWxlcyBsb2NhdGVkIGluIHRoZSBub2RlX21vZHVsZXMgYW5kIHZlbmRvciBkaXJlY3RvcmllcyBhcmUgZXh0ZXJuYWxseQo+IG1haW50YWluZWQgbGlicmFyaWVzIHVzZWQgYnkgdGhpcyBzb2Z0d2FyZSB3aGljaCBoYXZlIHRoZWlyIG93bgo+IGxpY2Vuc2VzOyB3ZSByZWNvbW1lbmQgeW91IHJlYWQgdGhlbSwgYXMgdGhlaXIgdGVybXMgbWF5IGRpZmZlciBmcm9tIHRoZQo+IHRlcm1zIGFib3ZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtYWdpYy1zdHJpbmcKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcmljaC1oYXJyaXMvbWFnaWMtc3RyaW5nLmdpdAoKPiBDb3B5cmlnaHQgMjAxOCBSaWNoIEhhcnJpcwo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbWxseSwgdWZvCkxpY2Vuc2U6IE1JVApSZXBvc2l0b3JpZXM6IHVuanMvbWxseSwgdW5qcy91Zm8KCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFBvb3lhIFBhcnNhIDxwb295YUBwaTAuaW8+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtcm1pbWUKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL21ybWltZQoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAoaHR0cHM6Ly9sdWtlZWQuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbXMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IHZlcmNlbC9tcwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAgVmVyY2VsLCBJbmMuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBub3JtYWxpemUtcGF0aApMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBCbGFpbmUgQnVibGl0egpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L25vcm1hbGl6ZS1wYXRoCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCBKb24gU2NobGlua2VydC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIG9iamVjdC1hc3NpZ24KTGljZW5zZTogTUlUCkJ5OiBTaW5kcmUgU29yaHVzClJlcG9zaXRvcnk6IHNpbmRyZXNvcmh1cy9vYmplY3QtYXNzaWduCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKHNpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBvbi1maW5pc2hlZApMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL29uLWZpbmlzaGVkCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNCBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiA8ZG91Z0Bzb21ldGhpbmdkb3VnLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2U1CkxpY2Vuc2U6IE1JVApCeTogSXZhbiBOaWt1bGluLCBodHRwczovL2dpdGh1Yi5jb20vaW5pa3VsaW4vcGFyc2U1L2dyYXBocy9jb250cmlidXRvcnMKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9pbmlrdWxpbi9wYXJzZTUuZ2l0Cgo+IENvcHlyaWdodCAoYykgMjAxMy0yMDE5IEl2YW4gTmlrdWxpbiAoaWZhYWFuQGdtYWlsLmNvbSwgaHR0cHM6Ly9naXRodWIuY29tL2luaWt1bGluKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2V1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgSm9uYXRoYW4gT25nClJlcG9zaXRvcnk6IHBpbGxhcmpzL3BhcnNldXJsCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwYXRoLWtleSwgc2hlYmFuZy1yZWdleApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvcGF0aC1rZXksIHNpbmRyZXNvcmh1cy9zaGViYW5nLXJlZ2V4Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBlcmlzY29waWMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IFJpY2gtSGFycmlzL3BlcmlzY29waWMKCj4gQ29weXJpZ2h0IChjKSAyMDE5IFJpY2ggSGFycmlzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwaWNvY29sb3JzCkxpY2Vuc2U6IElTQwpCeTogQWxleGV5IFJhc3BvcG92ClJlcG9zaXRvcnk6IGFsZXhleXJhc3BvcG92L3BpY29jb2xvcnMKCj4gSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyNCBPbGVrc2lpIFJhc3BvcG92LCBLb3N0aWFudHluIERlbnlzb3YsIEFudG9uIFZlcmlub3YKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKPiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLWltcG9ydApMaWNlbnNlOiBNSVQKQnk6IE1heGltZSBUaGlyb3VpbgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcG9zdGNzcy9wb3N0Y3NzLWltcG9ydC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IE1heGltZSBUaGlyb3VpbiwgSmFzb24gQ2FtcGJlbGwgJiBLZXZpbiBNw6VydGVuc3Nvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbG9hZC1jb25maWcKTGljZW5zZTogTUlUCkJ5OiBNaWNoYWVsIENpbmlhd2t5LCBSeWFuIER1bmNrZWwsIE1hdGV1c3ogRGVya3MsIERhbHRvbiBTYW50b3MsIFBhdHJpY2sgR2lsZGF5LCBGcmFuw6dvaXMgV291dHMKUmVwb3NpdG9yeTogcG9zdGNzcy9wb3N0Y3NzLWxvYWQtY29uZmlnCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCBNaWNoYWVsIENpbmlhd3NreSA8bWljaGFlbC5jaW5pYXdza3lAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcwpMaWNlbnNlOiBNSVQKQnk6IEFsZXhhbmRlciBNYWR5YW5raW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL3Bvc3Rjc3MtbW9kdWxlcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUtcHJlc2VudCBBbGV4YW5kZXIgTWFkeWFua2luIDxhbGV4YW5kZXJAbWFkeWFua2luLm5hbWU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgo+IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCj4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwo+IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCj4gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAo+IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwo+IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgo+IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgo+IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCj4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cy5naXQKCj4gQ29weXJpZ2h0IDIwMTUgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdApMaWNlbnNlOiBNSVQKQnk6IE1hcmsgRGFsZ2xlaXNoClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9jc3MtbW9kdWxlcy9wb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUgTWFyayBEYWxnbGVpc2ggPG1hcmsuam9obi5kYWxnbGVpc2hAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcy1zY29wZQpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXNjb3BlLmdpdAoKPiBJU0MgTGljZW5zZSAoSVNDKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtdmFsdWVzCkxpY2Vuc2U6IElTQwpCeTogR2xlbiBNYWRkZXJuClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXZhbHVlcy5naXQKCj4gSVNDIExpY2Vuc2UgKElTQykKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdsZW4gTWFkZGVybgo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1zZWxlY3Rvci1wYXJzZXIKTGljZW5zZTogTUlUCkJ5OiBCZW4gQnJpZ2dzLCBDaHJpcyBFcHBzdGVpbgpSZXBvc2l0b3J5OiBwb3N0Y3NzL3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyCgo+IENvcHlyaWdodCAoYykgQmVuIEJyaWdncyA8YmVuZWIuaW5mb0BnbWFpbC5jb20+IChodHRwOi8vYmVuZWIuaW5mbykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtdmFsdWUtcGFyc2VyCkxpY2Vuc2U6IE1JVApCeTogQm9nZGFuIENoYWRraW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL1RyeVNvdW5kL3Bvc3Rjc3MtdmFsdWUtcGFyc2VyLmdpdAoKPiBDb3B5cmlnaHQgKGMpIEJvZ2RhbiBDaGFka2luIDx0cnlzb3VuZEB5YW5kZXgucnU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyByZWFkZGlycApMaWNlbnNlOiBNSVQKQnk6IFRob3JzdGVuIExvcmVueiwgUGF1bCBNaWxsZXIKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvcmVhZGRpcnAuZ2l0Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgVGhvcnN0ZW4gTG9yZW56LCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcmVzb2x2ZS5leHBvcnRzLCB0b3RhbGlzdApMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3JpZXM6IGx1a2VlZC9yZXNvbHZlLmV4cG9ydHMsIGx1a2VlZC90b3RhbGlzdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAobHVrZWVkLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHNoZWJhbmctY29tbWFuZApMaWNlbnNlOiBNSVQKQnk6IEtldmluIE3DpXJ0ZW5zc29uClJlcG9zaXRvcnk6IGtldnZhL3NoZWJhbmctY29tbWFuZAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgS2V2aW4gTcOlcnRlbnNzb24gPGtldmlubWFydGVuc3NvbkBnbWFpbC5jb20+IChnaXRodWIuY29tL2tldnZhKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgc2lydgpMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3J5OiBsdWtlZWQvc2lydgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzdGF0dXNlcwpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL3N0YXR1c2VzCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBKb25hdGhhbiBPbmcgPG1lQGpvbmdsZWJlcnJ5LmNvbT4KPiBDb3B5cmlnaHQgKGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24gPGRvdWdAc29tZXRoaW5nZG91Zy5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzdHJpbmctaGFzaApMaWNlbnNlOiBDQzAtMS4wCkJ5OiBUaGUgRGFyayBTa3kgQ29tcGFueQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2Rhcmtza3lhcHAvc3RyaW5nLWhhc2guZ2l0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHN0cmlwLWxpdGVyYWwKTGljZW5zZTogTUlUCkJ5OiBBbnRob255IEZ1ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vYW50ZnUvc3RyaXAtbGl0ZXJhbC5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjIgQW50aG9ueSBGdSA8aHR0cHM6Ly9naXRodWIuY29tL2FudGZ1Pgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdG8tcmVnZXgtcmFuZ2UKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgUm91dmVuIFdlw59saW5nClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvdG8tcmVnZXgtcmFuZ2UKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0Lgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdHNjb25mY2sKTGljZW5zZTogTUlUCkJ5OiBkb21pbmlrZwpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWtnL3RzY29uZmNrLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyMS1wcmVzZW50IGRvbWluaWtnIGFuZCBbY29udHJpYnV0b3JzXShodHRwczovL2dpdGh1Yi5jb20vZG9taW5pa2cvdHNjb25mY2svZ3JhcGhzL2NvbnRyaWJ1dG9ycykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCj4gCj4gLS0gTGljZW5zZXMgZm9yIDNyZC1wYXJ0eSBjb2RlIGluY2x1ZGVkIGluIHRzY29uZmNrIC0tCj4gCj4gIyBzdHJpcC1ib20gYW5kIHN0cmlwLWpzb24tY29tbWVudHMKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKGh0dHBzOi8vc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHVucGlwZQpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHN0cmVhbS11dGlscy91bnBpcGUKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24gPGRvdWdAc29tZXRoaW5nZG91Zy5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHV0aWwtZGVwcmVjYXRlCkxpY2Vuc2U6IE1JVApCeTogTmF0aGFuIFJhamxpY2gKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9Ub29UYWxsTmF0ZS91dGlsLWRlcHJlY2F0ZS5naXQKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQgTmF0aGFuIFJhamxpY2ggPG5hdGhhbkB0b290YWxsbmF0ZS5uZXQ+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB1dGlscy1tZXJnZQpMaWNlbnNlOiBNSVQKQnk6IEphcmVkIEhhbnNvbgpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2phcmVkaGFuc29uL3V0aWxzLW1lcmdlLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBKYXJlZCBIYW5zb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKPiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCj4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCj4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCj4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KPiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB2YXJ5CkxpY2Vuc2U6IE1JVApCeTogRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KUmVwb3NpdG9yeToganNodHRwL3ZhcnkKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB3cwpMaWNlbnNlOiBNSVQKQnk6IEVpbmFyIE90dG8gU3Rhbmd2aWsKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzLmdpdAoKPiBDb3B5cmlnaHQgKGMpIDIwMTEgRWluYXIgT3R0byBTdGFuZ3ZpayA8ZWluYXJvc0BnbWFpbC5jb20+Cj4gQ29weXJpZ2h0IChjKSAyMDEzIEFybm91dCBLYXplbWllciBhbmQgY29udHJpYnV0b3JzCj4gQ29weXJpZ2h0IChjKSAyMDE2IEx1aWdpIFBpbmNhIGFuZCBjb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKPiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCj4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCj4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCj4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KPiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo= - - - - - - thecodrr - fdir - 6.5.0 - The fastest directory crawler & globbing alternative to glob, fast-glob, & tiny-glob. Crawls 1m files in < 1s - - - MIT - - - pkg:npm/fdir@6.5.0 - - - git+https://github.com/thecodrr/fdir.git - as detected from PackageJson property "repository.url" - - - https://github.com/thecodrr/fdir#readme - as detected from PackageJson property "homepage" - - - https://github.com/thecodrr/fdir/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/router-devtools/node_modules/fdir - - - - - file: LICENSE - Q29weXJpZ2h0IDIwMjMgQWJkdWxsYWggQXR0YQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K - - - - - - Jon Schlinkert - picomatch - 4.0.3 - Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. - - - MIT - - - pkg:npm/picomatch@4.0.3 - - - git+https://github.com/micromatch/picomatch.git - as detected from PackageJson property "repository.url" - - - https://github.com/micromatch/picomatch - as detected from PackageJson property "homepage" - - - https://github.com/micromatch/picomatch/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/router-devtools/node_modules/picomatch - - - - - file: LICENSE - VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTctcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgo= - - - - - @@ -476,7 +373,7 @@ - + Tanner Linsley @tanstack router-vite-plugin @@ -503,10 +400,14 @@ https://registry.npmjs.org/@tanstack/router-vite-plugin/-/router-vite-plugin-1.132.47.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4c7a7bfe53eb07002c7d9ba2d73f6b436207914741c448155be75a80a3486214e76054010db4a00fa52851f2ec7239e230c133831868d54dc1fc82b6f6f3c20a + + true node_modules/@tanstack/router-vite-plugin @@ -518,7 +419,7 @@ - + @tauri-apps api 2.8.0 @@ -542,7 +443,10 @@ https://registry.npmjs.org/@tauri-apps/api/-/api-2.8.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 81aef37616d2d865ce313219453d26623289b51f5f8afb17ceccaae54def8c32f4b3a0d33306119b4507363cd3639761e3e2d20baf129bfed61228a66d035897 + @@ -557,7 +461,7 @@ - + @tauri-apps cli 2.8.4 @@ -581,10 +485,14 @@ https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.8.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7a3519073b9045c8c557ebff81d8ff0dc6f25ffe93e2e9d9423312059c0bccffc2ca612329c736f8573cc533914e179b1c352faa85cc76c099b7cafe872375e6 + + true node_modules/@tauri-apps/cli @@ -596,7 +504,7 @@ - + @tauri-apps plugin-app 2.0.0-alpha.1 @@ -609,14 +517,17 @@ https://registry.npmjs.org/@tauri-apps/plugin-app/-/plugin-app-2.0.0-alpha.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0ca95b1b8ca6a1af310ca74adfa69d3e5658798f3070341f8bf5c91b8ab184ae980b818baccd6c1b979082354a85e0c8eb00d00b90a2523867bdd75754550f4e + node_modules/@tauri-apps/plugin-app - + @tauri-apps api 2.0.0-alpha.6 @@ -640,7 +551,10 @@ https://registry.npmjs.org/@tauri-apps/api/-/api-2.0.0-alpha.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 64c39cddebbd6a6c2f902e8cebd877856b78fc4b056805e6b648b0e317762cde7dfe54dbe1942255fab640a95172ed6b8f79ff4dcafb537d19a29bc7c1704622 + @@ -658,7 +572,7 @@ - + @tauri-apps plugin-dialog 2.4.0 @@ -681,7 +595,10 @@ https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3af5e4ac405f5b0b5df2dcd50845c8bd17cd117f3baacda3bfa4aa9953e21dc263061485fc652f8ea50d20398a0726f937c9ef0ea55433bfa0d6c5f0742fd2f7 + @@ -689,7 +606,7 @@ - + @tauri-apps plugin-fs 2.4.2 @@ -713,7 +630,10 @@ https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 60686662e4e05c6b22e808e857ee6687636f89c81605f5491c785eb9c93aa070fe1c2f5b5563da1ef08fd3f030e291c37a3c2bbd3f21137fb36406967fe86b8a + @@ -721,7 +641,7 @@ - + @tauri-apps plugin-http 2.5.2 @@ -744,7 +664,10 @@ https://registry.npmjs.org/@tauri-apps/plugin-http/-/plugin-http-2.5.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c7599028748b0e4e264b64bddfc3937b293c2fb4322e90ab2990997239258c6b2f4ef44ca230af23d49e27591ac5ceedf314a29640bb59d21df31111f532062e + @@ -752,7 +675,7 @@ - + @tauri-apps plugin-log 2.7.0 @@ -776,7 +699,10 @@ https://registry.npmjs.org/@tauri-apps/plugin-log/-/plugin-log-2.7.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f355d0d9ff77c78be6201e4e6345e5600c72eb47077582ecd0a8bc429dfcb4d013462b818adf8eae1ddfae9637a9f6109ea12f615c91b9bed84495a5996d9144 + @@ -784,7 +710,7 @@ - + @tauri-apps plugin-opener 2.5.0 @@ -808,7 +734,10 @@ https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0742d284e61a7b80998cdf257a23436e77e34ab4f0a196a4a8a696a5fa07ea75e2270b7a4608fa4675487df1b70e82622ac7df4613248e6055f557a29526f84c + @@ -816,7 +745,7 @@ - + @tauri-apps plugin-process 2.3.0 @@ -839,7 +768,10 @@ https://registry.npmjs.org/@tauri-apps/plugin-process/-/plugin-process-2.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d03363eaefbd72c383895e2c792c7145b9cba5e1987688e571cb42b8b3828291fd5f7f9c915648123e87eed450ef3a96afb9124c45a7af1b407416f415bb6b99 + @@ -847,7 +779,7 @@ - + @tauri-apps plugin-shell 2.3.1 @@ -870,15 +802,19 @@ https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8e3b365860ceffdcf6a63365c9d63f179c9884db2c72ff7d2b9942994e6e2a3b15bd0ddd4650e186d558a1ae0e2c39a4b4bb50be0bdb42308589b325ead8067f + + true node_modules/@tauri-apps/plugin-shell - + @tauri-apps plugin-updater 2.9.0 @@ -901,7 +837,10 @@ https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.9.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8fefac818f17a5e0efcc8993af3580d3c3aaa86aa090dcb17332c3ec58cd249c7fb97c4c645cf99c371f932a08feb0a362e8f6d74d53722febfc71663a6a310a + @@ -909,7 +848,7 @@ - + @tauri-apps plugin-window 2.0.0-alpha.1 @@ -922,14 +861,18 @@ https://registry.npmjs.org/@tauri-apps/plugin-window/-/plugin-window-2.0.0-alpha.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 74538081a97fdd3c73dd243e2cd42ad002b510f0be69c75a165c0f541ffa29751962668595e225ce0c4356824243eff13a1c6f62b7506852de7e1d08fca95d6e + + true node_modules/@tauri-apps/plugin-window - + @tauri-apps api 2.0.0-alpha.6 @@ -953,10 +896,14 @@ https://registry.npmjs.org/@tauri-apps/api/-/api-2.0.0-alpha.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 64c39cddebbd6a6c2f902e8cebd877856b78fc4b056805e6b648b0e317762cde7dfe54dbe1942255fab640a95172ed6b8f79ff4dcafb537d19a29bc7c1704622 + + true node_modules/@tauri-apps/plugin-window/node_modules/@tauri-apps/api @@ -971,7 +918,7 @@ - + Ernesto Garcia @testing-library jest-dom @@ -998,14 +945,18 @@ https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cc870e35afa156d55249ea7d513de3679ae2ce8d81b318320d853b5850f978808113b9e8dfcf351c679bfd09067ec26ce894e4635690853eeb20f0bb7bed279c + + true node_modules/@testing-library/jest-dom - + dom-accessibility-api 0.6.3 Implements https://w3c.github.io/accname/ @@ -1030,10 +981,14 @@ https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ed982881e4e78ee1dba3e72dd741bd15fa749a27f5ee2762d08c9635503fc1cc1c9bb34f383fd610754fde7ee7dcc857ab1a08626f1de8cb99a21616219e13df + + true node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api @@ -1055,7 +1010,7 @@ - + Kent C. Dodds @testing-library react @@ -1082,10 +1037,14 @@ https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9054b2c62103c2fd562e5d9f82cabaa4f05bc396962abb18dbf9e88b521dd132b450f6ab485eb6a054051875c8c9a1b8a69dad12e6ff6657a5f9f8e36482c3b3 + + true node_modules/@testing-library/react @@ -1097,7 +1056,7 @@ - + @types node 20.19.19 @@ -1123,10 +1082,14 @@ https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a5bd54aa3e5624fef0adc6cb53b46ee10b40d3ede4017ae4bad1a20f6eb050acd232034d68f0114d40d09849545e9eb8921ddc59da2edd0d02eeac30c6a4859a + + true node_modules/@types/node @@ -1138,7 +1101,7 @@ - + @types react-dom 18.3.7 @@ -1164,10 +1127,14 @@ https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3047b751ea043585455f3a17116b2f72983a66f96b14d94e43b10eb2f848dc27c05f0ccf7cef10c2ec5de349dea6c60aab2c954274dd11fbfaf2af75c8b70aad + + true node_modules/@types/react-dom @@ -1179,7 +1146,7 @@ - + @types react 18.3.26 @@ -1205,7 +1172,10 @@ https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 44503f6d446470acf1fd7f68ba63c6f55a770f725482eb3f7746faeca074b794bfada722ca68a590e6baea8961efc31423dd902db1097af3bbaefa94fe48f028 + @@ -1220,7 +1190,7 @@ - + @typescript-eslint eslint-plugin 8.46.0 @@ -1246,10 +1216,14 @@ https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 840f20c41ab8ba4a275573f2d0e2a189a521ffaf03d04f3c1929ad0b588012719a89eb838b7f0b852ee37421d12e2e84ac904d0c60b3be1e449f374fc147340c + + true node_modules/@typescript-eslint/eslint-plugin @@ -1261,7 +1235,7 @@ - + @typescript-eslint parser 8.46.0 @@ -1287,10 +1261,14 @@ https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9f51fa21c0e19a65041bb4cd552b291a68871eeb6dee254ab59c11a690fb7b4e3085ae4cae4575877a6d8bdc502dc08cb7a616b27729a13d07323907d4537059 + + true node_modules/@typescript-eslint/parser @@ -1302,7 +1280,7 @@ - + Evan You @vitejs plugin-react @@ -1329,10 +1307,14 @@ https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 814bbd8707d6bef1030419a0b40a30402a23c19989e6670b9f76ae7de0ac8ad8a3b37f9fd8db2b3ed94058847a38f8aa96397de8654251b2ded07caa22955aa0 + + true node_modules/@vitejs/plugin-react @@ -1344,7 +1326,7 @@ - + Andrey Sitnik autoprefixer 10.4.21 @@ -1370,10 +1352,14 @@ https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3be03a2d65792c31d2243dcb8c7628362e152ec8ff5a18bb93acc6d76c5361a538710f28c5019c917357f1c4472b9c8e67fa695477b46415c6cd257d8d77556d + + true node_modules/autoprefixer @@ -1385,7 +1371,7 @@ - + Luke Edwards clsx 2.1.1 @@ -1411,7 +1397,10 @@ https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7989b441606d52b0566561b4777f3a386030d7a67df793e2395a3607b6e35926c779d1a5e5ed1959aabae6438681448d7ac1080e407d2126d383f24af5d84264 + @@ -1426,7 +1415,7 @@ - + Fredrik Nicol csstype 3.1.3 @@ -1452,7 +1441,10 @@ https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 335b9090c97cad02bfb330f42cd86dab120f2e98a61a6f2c381c14ee52e70a949b4f2637c9e53555cee5e0a4f9cd3e2cff23b11c7e4eeed22eb8b3829cb00347 + @@ -1467,7 +1459,7 @@ - + date-fns 4.1.0 Modern JavaScript date utility library @@ -1492,7 +1484,10 @@ https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 524ab4a306d05f16bf537106b6c755064475c3b28e43980806a747da192f927cd93d8bc1c5bfda6ba13c2fbb668c5b64c1906edd45c16e32203e8fc4cf8c5a36 + @@ -1507,7 +1502,7 @@ - + Yannick Croissant eslint-plugin-react 7.37.5 @@ -1533,14 +1528,18 @@ https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 42d7aea744aa535e6476871ec4534024cbc22447dadb150a355e020b5c6c54cac822a132dd243faeacb10963737eb777fe5772e873250f67b42435690e0daa20 + + true node_modules/eslint-plugin-react - + Isaac Z. Schlueter minimatch 3.1.2 @@ -1566,10 +1565,14 @@ https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 27ba7ade1462023c35343130c355bb8b7efe07222b3963b95d0400cd9dd539c2f43cdc9bc297e657f374e73140cf043d512c84717eaddd43be2b96aa0503881f + + true node_modules/eslint-plugin-react/node_modules/minimatch @@ -1581,7 +1584,7 @@ - + Julian Gruber brace-expansion 1.1.12 @@ -1607,10 +1610,14 @@ https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f53f548d6debd145b973543b193c25969b57c21bd8984cc587331f67d1fb1505adfae65e3e364f8c13ff5b5644c99d6dc065a89b9ff9e9317894f72a8e70c772 + + true node_modules/eslint-plugin-react/node_modules/brace-expansion @@ -1632,7 +1639,7 @@ - + Nicholas C. Zakas eslint 9.37.0 @@ -1658,14 +1665,18 @@ https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5f22e644e9c0096a92c6219802b75e7f57c8b50778ef07aa07b8b0b5fafd247c11aea21765d70532fbc470bf711c298bd1236c3af174738da55b23355397608a + + true node_modules/eslint - + Toru Nagashima eslint-visitor-keys 4.2.1 @@ -1691,10 +1702,14 @@ https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 521764e6c7ea71e7bff47feb08e262918cfaee8d1ad93c3684644f386d98d51d9d83b6eb45ed6e1b4c9a3500c7bbe4cefee40f17fe5e09aa6f612987523b7b25 + + true node_modules/eslint/node_modules/eslint-visitor-keys @@ -1706,7 +1721,7 @@ - + Gulp Team glob-parent 6.0.2 @@ -1732,10 +1747,14 @@ https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5f1c08f043a1550816a7a8832feddbd2bf3a7f877a017eb3494e791df078c9d084b972d773915c61e3aefa79c67ed4b84c48eeff5d6bb782893d33206df9afe0 + + true node_modules/eslint/node_modules/glob-parent @@ -1747,7 +1766,7 @@ - + kael ignore 5.3.2 @@ -1773,10 +1792,14 @@ https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 86c053354a904c3c245ad71d608da2d3a63f9d4044b0d10324a8d676280bbde832f240ee2404bcb91969924710a721172f467fa630f2e4706632344227682afa + + true node_modules/eslint/node_modules/ignore @@ -1788,7 +1811,7 @@ - + Isaac Z. Schlueter minimatch 3.1.2 @@ -1814,10 +1837,14 @@ https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 27ba7ade1462023c35343130c355bb8b7efe07222b3963b95d0400cd9dd539c2f43cdc9bc297e657f374e73140cf043d512c84717eaddd43be2b96aa0503881f + + true node_modules/eslint/node_modules/minimatch @@ -1829,7 +1856,7 @@ - + Julian Gruber brace-expansion 1.1.12 @@ -1855,10 +1882,14 @@ https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f53f548d6debd145b973543b193c25969b57c21bd8984cc587331f67d1fb1505adfae65e3e364f8c13ff5b5644c99d6dc065a89b9ff9e9317894f72a8e70c772 + + true node_modules/eslint/node_modules/brace-expansion @@ -1880,7 +1911,7 @@ - + jsdom 26.1.0 A JavaScript implementation of many web standards @@ -1905,10 +1936,14 @@ https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0af73d59487148c128e0c7044b73fba0add069795d09f356a7ba65d8d35e8881650a82ebde47eaf646f57f17ed8b093514b57b0afa6f0dfa27c6dcd40de48e3e + + true node_modules/jsdom @@ -1920,7 +1955,7 @@ - + Andrey Sitnik postcss 8.5.6 @@ -1946,7 +1981,10 @@ https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + dd86e2d6d02ec003fdb34af5510d89e27e58d06d396c99295083b4fdb23d321c260fbd12e5a4d66d7181c311eb7a54fe5ccd64e9d334a64f92c0d9294d137b3e + @@ -1961,7 +1999,7 @@ - + react-dom 18.3.1 React package for working with the DOM. @@ -1986,7 +2024,10 @@ https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e66e2740aa7ead945bd3d2cd1f9f463380714e1f76e75ff295b2886e97bb4e91b17c9fbd92fe812e42c15c88e3b296e06e720136a948db7b519d3593d2c9d423 + @@ -2001,7 +2042,7 @@ - + Beier react-hook-form 7.64.0 @@ -2027,7 +2068,10 @@ https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.64.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7e737ebef4e230b9d1a8a3535610f2b1dad46b2d245140329909c52339e6803bdaa63bde51638e3ea30dccf83e03ed327fd0ee13687ac73063375b3e431f3072 + @@ -2042,7 +2086,7 @@ - + Espen Hovlandsdal react-markdown 8.0.7 @@ -2068,14 +2112,17 @@ https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6ef59bcc6e0cb4e53ad97a81c775f1fb3076ada68516cab8998880cdf8d724c133dac8b181e01fada037b6fcd42c5d3665d38c50e29304515a6490c3aeaf8125 + node_modules/react-markdown - + react-is 18.3.1 Brand checking of React Elements. @@ -2100,7 +2147,10 @@ https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fcb2cc5726acd258e302da1888fa9888bf15597cd451d4e1ae6539fa7db40d9bfe6be0a54687af533c3927153e21e879fdcf3bcada13055f46d4588a7cd25d9a + @@ -2125,7 +2175,7 @@ - + Jed Watson react-select 5.10.2 @@ -2151,7 +2201,10 @@ https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 677de71dd1055aaf6d7e77d55da88cd76adb26693e423144ced58bb665ea421cfa025e14659f71734c226ad986b543820a71cdd168b32f7b42318444357e2b55 + @@ -2166,7 +2219,7 @@ - + react 18.3.1 React is a JavaScript library for building user interfaces. @@ -2191,7 +2244,10 @@ https://registry.npmjs.org/react/-/react-18.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c12fa1020252851d0a844bcf240adfb8f54dd7e1f3d6dd18ea7e632eb1906e46f8bab80f13fd11bdefb590c075bffa16807826e1621c57e8bb176a53563fb689 + @@ -2206,7 +2262,7 @@ - + tailwindcss 3.4.18 A utility-first CSS framework for rapidly building custom user interfaces. @@ -2231,14 +2287,17 @@ https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e80dab9e65b9c5931dc35d4b62385c239f38eabb7da5b2d269b6395cfc68f9759dc7065a1449f8ec6a383731621eef6c34d9abfe45e2bcfd6f4ad7ef31a2b519 + node_modules/tailwindcss - + Gulp Team glob-parent 6.0.2 @@ -2264,7 +2323,10 @@ https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5f1c08f043a1550816a7a8832feddbd2bf3a7f877a017eb3494e791df078c9d084b972d773915c61e3aefa79c67ed4b84c48eeff5d6bb782893d33206df9afe0 + @@ -2279,7 +2341,7 @@ - + Michael Ciniawky postcss-load-config 6.0.1 @@ -2305,7 +2367,10 @@ https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a0fb53338a1eacbf945e6c7ef77cad65537cd91ae563fc0f515f08783c45af32235ce2c5d6937e12628f2dbb9bbca1d3d870b6d315ec0801f667e08a57a3b3fe + @@ -2320,7 +2385,7 @@ - + James Halliday resolve 1.22.10 @@ -2346,7 +2411,10 @@ https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 34f472fbf9dc20c78395302cbaac0a2227deae26b085e7c526d90d496d2a64912a3046fea81b7fefb07f8c679e7a4f85d2e39e374e420dae875db6c882d557e3 + @@ -2371,7 +2439,7 @@ - + MatsDK taurpc 1.8.1 @@ -2396,7 +2464,10 @@ https://registry.npmjs.org/taurpc/-/taurpc-1.8.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a9f4757a48570298db9d602ac84e6aa436bfa0c98a0708cd343baa8d89fbb0ef82848e6ac10e09fdf4bed347552c4dc8d256d90e2cf263c39b485073dcc45ead + @@ -2404,7 +2475,7 @@ - + Alex Reardon tiny-invariant 1.3.3 @@ -2430,7 +2501,10 @@ https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f856c13c4d68f50018bef89abbfa82e5213771ac36d6adf192f58a06d8dae6f82a3962071c9de2a1aab554f7e7fd2cea72dcf66d4fe861e29df7fcf904bf8f56 + @@ -2445,7 +2519,7 @@ - + typescript-eslint 8.46.0 Tooling which enables you to use TypeScript with ESLint @@ -2470,10 +2544,14 @@ https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ebe66b07acb66d3d835f72be41df6f9fb38538947ec522c38fe030fcddf307052ddbbb93c36b30d93136f94718d518b205991a19b4e4560f5249d3cd506e9a53 + + true node_modules/typescript-eslint @@ -2485,7 +2563,7 @@ - + Microsoft Corp. typescript 5.9.3 @@ -2511,10 +2589,14 @@ https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8e5d6f6733c38a72ebf5e52ddc9feded5e8580d130f508ef04f772b33f4a7d00c3e357d0ac2d98e2f290762694a454f86d795bd511e12e9a7cc2d9ba3394e04b + + true node_modules/typescript @@ -2526,17 +2608,17 @@ - + sapphi-red vite-plugin-static-copy - 2.3.2 + 3.1.4 rollup-plugin-copy for vite with dev server support. MIT - pkg:npm/vite-plugin-static-copy@2.3.2 + pkg:npm/vite-plugin-static-copy@3.1.4 git+https://github.com/sapphi-red/vite-plugin-static-copy.git @@ -2551,8 +2633,11 @@ as detected from PackageJson property "bugs.url" - https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.2.tgz - as detected from npm-ls property "resolved" + https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 8829abe064b0e1e4a7681f86f337367f87714ae0e36e48f0a6e04b2c6bd0611f485bbae70f37ed9d48ce1f9a7845847e7781ac881a9746fcee161b396e7cd5cb + @@ -2567,7 +2652,7 @@ - + Rongjian Zhang vite-plugin-svgr 4.5.0 @@ -2593,10 +2678,14 @@ https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.5.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5beba84a999591298d3863d2b03096556fc30c0caffbd7daa7d0195c1bd6890aab6e8274f23daf874b45c530ff2e3c2ac00777c984952609b9e12ff51a16dd9c + + true node_modules/vite-plugin-svgr @@ -2608,17 +2697,17 @@ - + Evan You vite - 6.3.6 + 7.1.11 Native-ESM powered web dev build tool MIT - pkg:npm/vite@6.3.6#packages/vite + pkg:npm/vite@7.1.11#packages/vite git+https://github.com/vitejs/vite.git#packages/vite @@ -2633,15 +2722,18 @@ as detected from PackageJson property "bugs.url" - https://registry.npmjs.org/vite/-/vite-6.3.6.tgz - as detected from npm-ls property "resolved" + https://registry.npmjs.org/vite/-/vite-7.1.11.tgz + as detected from npm-ls property "resolved" and property "integrity" + + bb37319d20d58c0a291148e58e45a1f0422b83ab65ceb8c551f31c475115b110c6c1ffdc71e7f4a903d1c8ead13b086b4c3680a6e7aafa36be28b3e5cd1ff376 + node_modules/vite - + thecodrr fdir 6.5.0 @@ -2667,7 +2759,10 @@ https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b486d8b596ee70eb340511aa3c992c84951874bf920c7edd54cf208f2f84469dd60148cb105244fb4da46a7c87b708d63a7c2b298062c0098cd29e242c90275e + @@ -2682,7 +2777,7 @@ - + Jon Schlinkert picomatch 4.0.3 @@ -2708,7 +2803,10 @@ https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e604e680463fb2a2ba8055cb22c40d1f5f6559be1e6cf0cb03849d2cfeddb169085c75a51baea83ee56f5d21853e9a58673f190d9ab475862b6c77c109551bd5 + @@ -2728,12 +2826,12 @@ file: LICENSE.md - IyBWaXRlIGNvcmUgbGljZW5zZQpWaXRlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKCk1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTktcHJlc2VudCwgVm9pZFplcm8gSW5jLiBhbmQgVml0ZSBjb250cmlidXRvcnMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgojIExpY2Vuc2VzIG9mIGJ1bmRsZWQgZGVwZW5kZW5jaWVzClRoZSBwdWJsaXNoZWQgVml0ZSBhcnRpZmFjdCBhZGRpdGlvbmFsbHkgY29udGFpbnMgY29kZSB3aXRoIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CkFwYWNoZS0yLjAsIEJTRC0yLUNsYXVzZSwgQ0MwLTEuMCwgSVNDLCBNSVQKCiMgQnVuZGxlZCBkZXBlbmRlbmNpZXM6CiMjIEBhbXBwcm9qZWN0L3JlbWFwcGluZwpMaWNlbnNlOiBBcGFjaGUtMi4wCkJ5OiBKdXN0aW4gUmlkZ2V3ZWxsClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vYW1wcHJvamVjdC9yZW1hcHBpbmcuZ2l0Cgo+IEFwYWNoZSBMaWNlbnNlCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAo+ICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KPiAKPiAgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KPiAKPiAgICAxLiBEZWZpbml0aW9ucy4KPiAKPiAgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAo+ICAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lgo+IAo+ICAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Cj4gICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgo+IAo+ICAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKPiAgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCj4gICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKPiAgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKPiAgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgo+ICAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQo+ICAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCj4gCj4gICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQo+ICAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCj4gCj4gICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCj4gICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgo+ICAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCj4gCj4gICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKPiAgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Cj4gICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAo+ICAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KPiAKPiAgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgo+ICAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKPiAgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKPiAgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgo+IAo+ICAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKPiAgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCj4gICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwo+ICAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCj4gICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCj4gICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAo+ICAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCj4gCj4gICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKPiAgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCj4gICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Cj4gICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgo+ICAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgo+ICAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgo+ICAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKPiAgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwo+ICAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCj4gICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKPiAgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKPiAgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQo+ICAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgo+IAo+ICAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Cj4gICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCj4gICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCj4gCj4gICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCj4gICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAo+ICAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCj4gICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCj4gICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCj4gICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KPiAKPiAgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKPiAgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCj4gICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKPiAgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKPiAgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKPiAgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQo+ICAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCj4gICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQo+ICAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Cj4gICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKPiAgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCj4gICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKPiAgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCj4gICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCj4gICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgo+IAo+ICAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCj4gICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Cj4gICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKPiAgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiAgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgo+ICAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAo+IAo+ICAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKPiAgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCj4gCj4gICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCj4gICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKPiAgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKPiAgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgo+ICAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCj4gCj4gICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCj4gICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKPiAgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCj4gICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAo+ICAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKPiAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKPiAgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgo+ICAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKPiAgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAo+ICAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKPiAgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAo+ICAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgo+ICAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQo+ICAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKPiAgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCj4gICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KPiAKPiAgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKPiAgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCj4gICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgo+ICAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAo+ICAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAo+ICAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCj4gCj4gICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAo+ICAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawo+ICAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCj4gICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCj4gICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQo+ICAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCj4gICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgo+IAo+ICAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKPiAgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCj4gICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCj4gICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCj4gCj4gICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCj4gICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAo+ICAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAo+ICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgo+ICAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCj4gICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQo+ICAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQo+ICAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQo+ICAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KPiAKPiAgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKPiAgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKPiAgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQo+ICAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCj4gICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAo+ICAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQo+ICAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKPiAgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCj4gICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKPiAgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCj4gICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgo+IAo+ICAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKPiAgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAo+ICAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCj4gICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKPiAgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQo+ICAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCj4gICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAo+ICAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQo+ICAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KPiAgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KPiAKPiAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKPiAKPiAgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCj4gCj4gICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKPiAgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCj4gICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKPiAgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQo+ICAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQo+ICAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKPiAgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKPiAgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCj4gCj4gICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCj4gCj4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cj4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgo+ICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAo+IAo+ICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKPiAKPiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCj4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKPiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KPiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCj4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nLCBAanJpZGdld2VsbC9zZXQtYXJyYXkKTGljZW5zZTogTUlUCkJ5OiBKdXN0aW4gUmlkZ2V3ZWxsClJlcG9zaXRvcmllczogaHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvZ2VuLW1hcHBpbmcsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3NldC1hcnJheQoKPiBDb3B5cmlnaHQgMjAyMiBKdXN0aW4gUmlkZ2V3ZWxsIDxqcmlkZ2V3ZWxsQGdvb2dsZS5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBAanJpZGdld2VsbC9yZXNvbHZlLXVyaQpMaWNlbnNlOiBNSVQKQnk6IEp1c3RpbiBSaWRnZXdlbGwKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvcmVzb2x2ZS11cmkKCj4gQ29weXJpZ2h0IDIwMTkgSnVzdGluIFJpZGdld2VsbCA8anJpZGdld2VsbEBnb29nbGUuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQGpyaWRnZXdlbGwvc291cmNlbWFwLWNvZGVjCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1IFJpY2ggSGFycmlzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nCkxpY2Vuc2U6IE1JVApCeTogSnVzdGluIFJpZGdld2VsbApSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvdHJhY2UtbWFwcGluZy5naXQKCj4gQ29weXJpZ2h0IDIwMjIgSnVzdGluIFJpZGdld2VsbCA8anVzdGluQHJpZGdld2VsbC5uYW1lPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQHBvbGthL2NvbXByZXNzaW9uCkxpY2Vuc2U6IE1JVApSZXBvc2l0b3J5OiBsdWtlZWQvcG9sa2EKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQHBvbGthL3VybApMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3J5OiBsdWtlZWQvcG9sa2EKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQHJvbGx1cC9wbHVnaW4tYWxpYXMsIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzLCBAcm9sbHVwL3BsdWdpbi1keW5hbWljLWltcG9ydC12YXJzLCBAcm9sbHVwL3BsdWdpbnV0aWxzCkxpY2Vuc2U6IE1JVApCeTogSm9oYW5uZXMgU3RlaW4KUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogTGFyc0RlbkJha2tlcgpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgUm9sbHVwSlMgUGx1Z2luIENvbnRyaWJ1dG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL2dyYXBocy9jb250cmlidXRvcnMpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBhbnltYXRjaApMaWNlbnNlOiBJU0MKQnk6IEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXRjaC9hbnltYXRjaAoKPiBUaGUgSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgRWxhbiBTaGFua2VyLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGFydGljaG9raWUKTGljZW5zZTogTUlUCkJ5OiBzYXBwaGktcmVkLCBFdmFuIFlvdQpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3NhcHBoaS1yZWQvYXJ0aWNob2tpZS5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAtcHJlc2VudCwgWXV4aSAoRXZhbikgWW91Cj4gQ29weXJpZ2h0IChjKSAyMDIzLXByZXNlbnQsIHNhcHBoaS1yZWQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGJpbmFyeS1leHRlbnNpb25zCkxpY2Vuc2U6IE1JVApCeTogU2luZHJlIFNvcmh1cwpSZXBvc2l0b3J5OiBzaW5kcmVzb3JodXMvYmluYXJ5LWV4dGVuc2lvbnMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gQ29weXJpZ2h0IChjKSBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgYnJhY2VzLCBmaWxsLXJhbmdlLCBpcy1udW1iZXIKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIEVsYW4gU2hhbmtlciwgRXVnZW5lIFNoYXJ5Z2luLCBoZW1hbnRoLmhtClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvYnJhY2VzCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBFZG8gUml2YWksIFBhdWwgTWlsbGVyLCBSb3V2ZW4gV2XDn2xpbmcKUmVwb3NpdG9yeTogam9uc2NobGlua2VydC9maWxsLXJhbmdlCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBPbHN0ZW4gTGFyY2ssIFJvdXZlbiBXZcOfbGluZwpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L2lzLW51bWJlcgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBidW5kbGUtbmFtZSwgZGVmYXVsdC1icm93c2VyLCBkZWZhdWx0LWJyb3dzZXItaWQsIGRlZmluZS1sYXp5LXByb3AsIGlzLWRvY2tlciwgaXMtaW5zaWRlLWNvbnRhaW5lciwgaXMtd3NsLCBvcGVuLCBydW4tYXBwbGVzY3JpcHQKTGljZW5zZTogTUlUCkJ5OiBTaW5kcmUgU29yaHVzClJlcG9zaXRvcmllczogc2luZHJlc29yaHVzL2J1bmRsZS1uYW1lLCBzaW5kcmVzb3JodXMvZGVmYXVsdC1icm93c2VyLCBzaW5kcmVzb3JodXMvZGVmYXVsdC1icm93c2VyLWlkLCBzaW5kcmVzb3JodXMvZGVmaW5lLWxhenktcHJvcCwgc2luZHJlc29yaHVzL2lzLWRvY2tlciwgc2luZHJlc29yaHVzL2lzLWluc2lkZS1jb250YWluZXIsIHNpbmRyZXNvcmh1cy9pcy13c2wsIHNpbmRyZXNvcmh1cy9vcGVuLCBzaW5kcmVzb3JodXMvcnVuLWFwcGxlc2NyaXB0Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoaHR0cHM6Ly9zaW5kcmVzb3JodXMuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgY2FjCkxpY2Vuc2U6IE1JVApCeTogZWdvaXN0ClJlcG9zaXRvcnk6IGVnb2lzdC9jYWMKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSBFR09JU1QgPDB4MTQyODU3QGdtYWlsLmNvbT4gKGh0dHBzOi8vZ2l0aHViLmNvbS9lZ29pc3QpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjaG9raWRhcgpMaWNlbnNlOiBNSVQKQnk6IFBhdWwgTWlsbGVyLCBFbGFuIFNoYW5rZXIKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvY2hva2lkYXIuZ2l0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxMi0yMDE5IFBhdWwgTWlsbGVyIChodHRwczovL3BhdWxtaWxsci5jb20pLCBFbGFuIFNoYW5rZXIKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUg4oCcU29mdHdhcmXigJ0pLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIOKAnEFTIElT4oCdLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgY29tbW9uZGlyLCBzaGVsbC1xdW90ZQpMaWNlbnNlOiBNSVQKQnk6IEphbWVzIEhhbGxpZGF5ClJlcG9zaXRvcmllczogaHR0cDovL2dpdGh1Yi5jb20vc3Vic3RhY2svbm9kZS1jb21tb25kaXIuZ2l0LCBodHRwOi8vZ2l0aHViLmNvbS9samhhcmIvc2hlbGwtcXVvdGUuZ2l0Cgo+IFRoZSBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAxMyBKYW1lcyBIYWxsaWRheSAobWFpbEBzdWJzdGFjay5uZXQpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIAo+IHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCAKPiBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gCj4gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIAo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCAKPiBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gCj4gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgCj4gc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKPiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIAo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgCj4gQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIAo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb25uZWN0CkxpY2Vuc2U6IE1JVApCeTogVEogSG9sb3dheWNodWssIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcsIFRpbSBDYXN3ZWxsClJlcG9zaXRvcnk6IHNlbmNoYWxhYnMvY29ubmVjdAoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxMCBTZW5jaGEgSW5jLgo+IENvcHlyaWdodCAoYykgMjAxMSBMZWFybkJvb3N0Cj4gQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgVEogSG9sb3dheWNodWsKPiBDb3B5cmlnaHQgKGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgY29udmVydC1zb3VyY2UtbWFwCkxpY2Vuc2U6IE1JVApCeTogVGhvcnN0ZW4gTG9yZW56ClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vdGhsb3JlbnovY29udmVydC1zb3VyY2UtbWFwLmdpdAoKPiBDb3B5cmlnaHQgMjAxMyBUaG9yc3RlbiBMb3JlbnouIAo+IEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb3JzCkxpY2Vuc2U6IE1JVApCeTogVHJveSBHb29kZQpSZXBvc2l0b3J5OiBleHByZXNzanMvY29ycwoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxMyBUcm95IEdvb2RlIDx0cm95Z29vZGVAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjcm9zcy1zcGF3bgpMaWNlbnNlOiBNSVQKQnk6IEFuZHLDqSBDcnV6ClJlcG9zaXRvcnk6IGdpdEBnaXRodWIuY29tOm1veHlzdHVkaW8vbm9kZS1jcm9zcy1zcGF3bi5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE4IE1hZGUgV2l0aCBNT1hZIExkYSA8aGVsbG9AbW94eS5zdHVkaW8+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjc3Nlc2MKTGljZW5zZTogTUlUCkJ5OiBNYXRoaWFzIEJ5bmVucwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9jc3Nlc2MuZ2l0Cgo+IENvcHlyaWdodCBNYXRoaWFzIEJ5bmVucyA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlLz4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQo+IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KPiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KPiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZGVidWcKTGljZW5zZTogTUlUCkJ5OiBKb3NoIEp1bm9uLCBUSiBIb2xvd2F5Y2h1aywgTmF0aGFuIFJhamxpY2gsIEFuZHJldyBSaHluZQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2RlYnVnLWpzL2RlYnVnLmdpdAoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IFRKIEhvbG93YXljaHVrIDx0akB2aXNpb24tbWVkaWEuY2E+Cj4gQ29weXJpZ2h0IChjKSAyMDE4LTIwMjEgSm9zaCBKdW5vbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZQo+IGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKPiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+IGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAo+IHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVAo+IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZG90ZW52CkxpY2Vuc2U6IEJTRC0yLUNsYXVzZQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL21vdGRvdGxhL2RvdGVudi5naXQKCj4gQ29weXJpZ2h0IChjKSAyMDE1LCBTY290dCBNb3R0ZQo+IEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gCj4gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cj4gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Cj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKPiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgo+IAo+ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAo+ICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgo+ICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCj4gCj4gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCj4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQo+IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQo+IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKPiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAo+IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCj4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKPiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAo+IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCj4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZG90ZW52LWV4cGFuZApMaWNlbnNlOiBCU0QtMi1DbGF1c2UKQnk6IG1vdGRvdGxhClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3Rkb3RsYS9kb3RlbnYtZXhwYW5kCgo+IENvcHlyaWdodCAoYykgMjAxNiwgU2NvdHQgTW90dGUKPiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+IAo+IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAo+IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Ogo+IAo+ICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCj4gICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KPiAKPiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKPiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KPiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgo+IAo+IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgo+IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKPiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKPiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCj4gRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKPiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgo+IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCj4gQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKPiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQo+IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGVlLWZpcnN0CkxpY2Vuc2U6IE1JVApCeTogSm9uYXRoYW4gT25nLCBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgpSZXBvc2l0b3J5OiBqb25hdGhhbm9uZy9lZS1maXJzdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uYXRoYW4gT25nIG1lQGpvbmdsZWJlcnJ5LmNvbQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZW5jb2RldXJsCkxpY2Vuc2U6IE1JVApCeTogRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KUmVwb3NpdG9yeTogcGlsbGFyanMvZW5jb2RldXJsCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGVudGl0aWVzCkxpY2Vuc2U6IEJTRC0yLUNsYXVzZQpCeTogRmVsaXggQm9laG0KUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9mYjU1L2VudGl0aWVzLmdpdAoKPiBDb3B5cmlnaHQgKGMpIEZlbGl4IELDtmhtCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Cj4gCj4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgo+IAo+IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KPiAKPiBUSElTIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTLAo+IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGVzLW1vZHVsZS1sZXhlcgpMaWNlbnNlOiBNSVQKQnk6IEd1eSBCZWRmb3JkClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vZ3V5YmVkZm9yZC9lcy1tb2R1bGUtbGV4ZXIuZ2l0Cgo+IE1JVCBMaWNlbnNlCj4gLS0tLS0tLS0tLS0KPiAKPiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMiBHdXkgQmVkZm9yZAo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZXNjYXBlLWh0bWwKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IGNvbXBvbmVudC9lc2NhcGUtaHRtbAoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrCj4gQ29weXJpZ2h0IChjKSAyMDE1IEFuZHJlYXMgTHViYmUKPiBDb3B5cmlnaHQgKGMpIDIwMTUgVGlhbmNoZW5nICJUaW1vdGh5IiBHdQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlc3RyZWUtd2Fsa2VyCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL1JpY2gtSGFycmlzL2VzdHJlZS13YWxrZXIKCj4gQ29weXJpZ2h0IChjKSAyMDE1LTIwIFt0aGVzZSBwZW9wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9SaWNoLUhhcnJpcy9lc3RyZWUtd2Fsa2VyL2dyYXBocy9jb250cmlidXRvcnMpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBldGFnCkxpY2Vuc2U6IE1JVApCeTogRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24sIERhdmlkIEJqw7Zya2x1bmQKUmVwb3NpdG9yeToganNodHRwL2V0YWcKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBldmVudGVtaXR0ZXIzCkxpY2Vuc2U6IE1JVApCeTogQXJub3V0IEthemVtaWVyClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vcHJpbXVzL2V2ZW50ZW1pdHRlcjMuZ2l0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBBcm5vdXQgS2F6ZW1pZXIKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGZpbmFsaGFuZGxlcgpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHBpbGxhcmpzL2ZpbmFsaGFuZGxlcgoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBmb2xsb3ctcmVkaXJlY3RzCkxpY2Vuc2U6IE1JVApCeTogUnViZW4gVmVyYm9yZ2gsIE9saXZpZXIgTGFsb25kZSwgSmFtZXMgVGFsbWFnZQpSZXBvc2l0b3J5OiBnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vZm9sbG93LXJlZGlyZWN0cy9mb2xsb3ctcmVkaXJlY3RzLmdpdAoKPiBDb3B5cmlnaHQgMjAxNOKAk3ByZXNlbnQgT2xpdmllciBMYWxvbmRlIDxvbGFsb25kZUBnbWFpbC5jb20+LCBKYW1lcyBUYWxtYWdlIDxqYW1lc0B0YWxtYWdlLmlvPiwgUnViZW4gVmVyYm9yZ2gKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKPiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KPiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBnZW5lcmljLW5hbWVzCkxpY2Vuc2U6IE1JVApCeTogQWxleGV5IExpdHZpbm92ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvZ2VuZXJpYy1uYW1lcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1IEFsZXhleSBMaXR2aW5vdgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZ2xvYi1wYXJlbnQKTGljZW5zZTogSVNDCkJ5OiBHdWxwIFRlYW0sIEVsYW4gU2hhbmtlciwgQmxhaW5lIEJ1YmxpdHoKUmVwb3NpdG9yeTogZ3VscGpzL2dsb2ItcGFyZW50Cgo+IFRoZSBJU0MgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgMjAxOSBFbGFuIFNoYW5rZXIKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBodHRwLXByb3h5CkxpY2Vuc2U6IE1JVApCeTogQ2hhcmxpZSBSb2JiaW5zLCBqY3J1Z3p6IDxqY3J1Z3p6QGdtYWlsLmNvbT4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL2h0dHAtcGFydHkvbm9kZS1odHRwLXByb3h5LmdpdAoKPiBub2RlLWh0dHAtcHJveHkKPiAKPiAgIENvcHlyaWdodCAoYykgMjAxMC0yMDE2IENoYXJsaWUgUm9iYmlucywgSmFycmV0dCBDcnVnZXIgJiB0aGUgQ29udHJpYnV0b3JzLgo+IAo+ICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAgICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+ICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+ICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+ICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKPiAgIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KPiAgIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgo+ICAgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGljc3MtdXRpbHMKTGljZW5zZTogSVNDCkJ5OiBHbGVuIE1hZGRlcm4KUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9jc3MtbW9kdWxlcy9pY3NzLXV0aWxzLmdpdAoKPiBJU0MgTGljZW5zZSAoSVNDKQo+IENvcHlyaWdodCAyMDE4IEdsZW4gTWFkZGVybgo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtYmluYXJ5LXBhdGgKTGljZW5zZTogTUlUCkJ5OiBTaW5kcmUgU29yaHVzClJlcG9zaXRvcnk6IHNpbmRyZXNvcmh1cy9pcy1iaW5hcnktcGF0aAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAxOSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoaHR0cHM6Ly9zaW5kcmVzb3JodXMuY29tKSwgUGF1bCBNaWxsZXIgKGh0dHBzOi8vcGF1bG1pbGxyLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzLWV4dGdsb2IKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydApSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L2lzLWV4dGdsb2IKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBpcy1nbG9iCkxpY2Vuc2U6IE1JVApCeTogSm9uIFNjaGxpbmtlcnQsIEJyaWFuIFdvb2R3YXJkLCBEYW5pZWwgUGVyZXoKUmVwb3NpdG9yeTogbWljcm9tYXRjaC9pcy1nbG9iCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzLXJlZmVyZW5jZQpMaWNlbnNlOiBNSVQKQnk6IFJpY2ggSGFycmlzClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vUmljaC1IYXJyaXMvaXMtcmVmZXJlbmNlLmdpdAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBpc2V4ZSwgd2hpY2gKTGljZW5zZTogSVNDCkJ5OiBJc2FhYyBaLiBTY2hsdWV0ZXIKUmVwb3NpdG9yaWVzOiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9pc2V4ZS5naXQsIGdpdDovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtd2hpY2guZ2l0Cgo+IFRoZSBJU0MgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgSXNhYWMgWi4gU2NobHVldGVyIGFuZCBDb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBqcy10b2tlbnMKTGljZW5zZTogTUlUCkJ5OiBTaW1vbiBMeWRlbGwKUmVwb3NpdG9yeTogbHlkZWxsL2pzLXRva2VucwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTUsIDIwMTYsIDIwMTcsIDIwMTgsIDIwMTksIDIwMjAsIDIwMjEsIDIwMjIsIDIwMjMsIDIwMjQgU2ltb24gTHlkZWxsCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBsYXVuY2gtZWRpdG9yLCBsYXVuY2gtZWRpdG9yLW1pZGRsZXdhcmUKTGljZW5zZTogTUlUCkJ5OiBFdmFuIFlvdQpSZXBvc2l0b3JpZXM6IGdpdCtodHRwczovL2dpdGh1Yi5jb20veXl4OTkwODAzL2xhdW5jaC1lZGl0b3IuZ2l0LCBnaXQraHR0cHM6Ly9naXRodWIuY29tL3l5eDk5MDgwMy9sYXVuY2gtZWRpdG9yLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTctcHJlc2VudCwgWXV4aSAoRXZhbikgWW91Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBsaWxjb25maWcKTGljZW5zZTogTUlUCkJ5OiBhbnRvbms1MgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vYW50b25rNTIvbGlsY29uZmlnCgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDIyIEFudG9uIEthc3RyaXRza2l5Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBsb2FkZXItdXRpbHMKTGljZW5zZTogTUlUCkJ5OiBUb2JpYXMgS29wcGVycyBAc29rcmEKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2svbG9hZGVyLXV0aWxzLmdpdAoKPiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxvZGFzaC5jYW1lbGNhc2UKTGljZW5zZTogTUlUCkJ5OiBKb2huLURhdmlkIERhbHRvbiwgQmxhaW5lIEJ1YmxpdHosIE1hdGhpYXMgQnluZW5zClJlcG9zaXRvcnk6IGxvZGFzaC9sb2Rhc2gKCj4gQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+Cj4gCj4gQmFzZWQgb24gVW5kZXJzY29yZS5qcywgY29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywKPiBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnLz4KPiAKPiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQo+IGluZGl2aWR1YWxzLiBGb3IgZXhhY3QgY29udHJpYnV0aW9uIGhpc3RvcnksIHNlZSB0aGUgcmV2aXNpb24gaGlzdG9yeQo+IGF2YWlsYWJsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaAo+IAo+IFRoZSBmb2xsb3dpbmcgbGljZW5zZSBhcHBsaWVzIHRvIGFsbCBwYXJ0cyBvZiB0aGlzIHNvZnR3YXJlIGV4Y2VwdCBhcwo+IGRvY3VtZW50ZWQgYmVsb3c6Cj4gCj4gPT09PQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCj4gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgo+IE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgo+IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo+IAo+ID09PT0KPiAKPiBDb3B5cmlnaHQgYW5kIHJlbGF0ZWQgcmlnaHRzIGZvciBzYW1wbGUgY29kZSBhcmUgd2FpdmVkIHZpYSBDQzAuIFNhbXBsZQo+IGNvZGUgaXMgZGVmaW5lZCBhcyBhbGwgc291cmNlIGNvZGUgZGlzcGxheWVkIHdpdGhpbiB0aGUgcHJvc2Ugb2YgdGhlCj4gZG9jdW1lbnRhdGlvbi4KPiAKPiBDQzA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KPiAKPiA9PT09Cj4gCj4gRmlsZXMgbG9jYXRlZCBpbiB0aGUgbm9kZV9tb2R1bGVzIGFuZCB2ZW5kb3IgZGlyZWN0b3JpZXMgYXJlIGV4dGVybmFsbHkKPiBtYWludGFpbmVkIGxpYnJhcmllcyB1c2VkIGJ5IHRoaXMgc29mdHdhcmUgd2hpY2ggaGF2ZSB0aGVpciBvd24KPiBsaWNlbnNlczsgd2UgcmVjb21tZW5kIHlvdSByZWFkIHRoZW0sIGFzIHRoZWlyIHRlcm1zIG1heSBkaWZmZXIgZnJvbSB0aGUKPiB0ZXJtcyBhYm92ZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbWFnaWMtc3RyaW5nCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL3JpY2gtaGFycmlzL21hZ2ljLXN0cmluZwoKPiBDb3B5cmlnaHQgMjAxOCBSaWNoIEhhcnJpcwo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbWxseSwgdWZvCkxpY2Vuc2U6IE1JVApSZXBvc2l0b3JpZXM6IHVuanMvbWxseSwgdW5qcy91Zm8KCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFBvb3lhIFBhcnNhIDxwb295YUBwaTAuaW8+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtcm1pbWUKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL21ybWltZQoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAoaHR0cHM6Ly9sdWtlZWQuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbXMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IHZlcmNlbC9tcwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAgVmVyY2VsLCBJbmMuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBub3JtYWxpemUtcGF0aApMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBCbGFpbmUgQnVibGl0egpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L25vcm1hbGl6ZS1wYXRoCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCBKb24gU2NobGlua2VydC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIG9iamVjdC1hc3NpZ24KTGljZW5zZTogTUlUCkJ5OiBTaW5kcmUgU29yaHVzClJlcG9zaXRvcnk6IHNpbmRyZXNvcmh1cy9vYmplY3QtYXNzaWduCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKHNpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBvbi1maW5pc2hlZApMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL29uLWZpbmlzaGVkCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNCBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiA8ZG91Z0Bzb21ldGhpbmdkb3VnLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2U1CkxpY2Vuc2U6IE1JVApCeTogSXZhbiBOaWt1bGluLCBodHRwczovL2dpdGh1Yi5jb20vaW5pa3VsaW4vcGFyc2U1L2dyYXBocy9jb250cmlidXRvcnMKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9pbmlrdWxpbi9wYXJzZTUuZ2l0Cgo+IENvcHlyaWdodCAoYykgMjAxMy0yMDE5IEl2YW4gTmlrdWxpbiAoaWZhYWFuQGdtYWlsLmNvbSwgaHR0cHM6Ly9naXRodWIuY29tL2luaWt1bGluKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2V1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgSm9uYXRoYW4gT25nClJlcG9zaXRvcnk6IHBpbGxhcmpzL3BhcnNldXJsCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwYXRoLWtleSwgc2hlYmFuZy1yZWdleApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvcGF0aC1rZXksIHNpbmRyZXNvcmh1cy9zaGViYW5nLXJlZ2V4Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBlcmlzY29waWMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IFJpY2gtSGFycmlzL3BlcmlzY29waWMKCj4gQ29weXJpZ2h0IChjKSAyMDE5IFJpY2ggSGFycmlzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwaWNvY29sb3JzCkxpY2Vuc2U6IElTQwpCeTogQWxleGV5IFJhc3BvcG92ClJlcG9zaXRvcnk6IGFsZXhleXJhc3BvcG92L3BpY29jb2xvcnMKCj4gSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyNCBPbGVrc2lpIFJhc3BvcG92LCBLb3N0aWFudHluIERlbnlzb3YsIEFudG9uIFZlcmlub3YKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKPiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLWltcG9ydApMaWNlbnNlOiBNSVQKQnk6IE1heGltZSBUaGlyb3VpbgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcG9zdGNzcy9wb3N0Y3NzLWltcG9ydC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IE1heGltZSBUaGlyb3VpbiwgSmFzb24gQ2FtcGJlbGwgJiBLZXZpbiBNw6VydGVuc3Nvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbG9hZC1jb25maWcKTGljZW5zZTogTUlUCkJ5OiBNaWNoYWVsIENpbmlhd2t5LCBSeWFuIER1bmNrZWwsIE1hdGV1c3ogRGVya3MsIERhbHRvbiBTYW50b3MsIFBhdHJpY2sgR2lsZGF5LCBGcmFuw6dvaXMgV291dHMKUmVwb3NpdG9yeTogcG9zdGNzcy9wb3N0Y3NzLWxvYWQtY29uZmlnCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCBNaWNoYWVsIENpbmlhd3NreSA8bWljaGFlbC5jaW5pYXdza3lAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcwpMaWNlbnNlOiBNSVQKQnk6IEFsZXhhbmRlciBNYWR5YW5raW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL3Bvc3Rjc3MtbW9kdWxlcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUtcHJlc2VudCBBbGV4YW5kZXIgTWFkeWFua2luIDxhbGV4YW5kZXJAbWFkeWFua2luLm5hbWU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgo+IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCj4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwo+IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCj4gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAo+IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwo+IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgo+IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgo+IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCj4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cy5naXQKCj4gQ29weXJpZ2h0IDIwMTUgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdApMaWNlbnNlOiBNSVQKQnk6IE1hcmsgRGFsZ2xlaXNoClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9jc3MtbW9kdWxlcy9wb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUgTWFyayBEYWxnbGVpc2ggPG1hcmsuam9obi5kYWxnbGVpc2hAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcy1zY29wZQpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXNjb3BlLmdpdAoKPiBJU0MgTGljZW5zZSAoSVNDKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtdmFsdWVzCkxpY2Vuc2U6IElTQwpCeTogR2xlbiBNYWRkZXJuClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXZhbHVlcy5naXQKCj4gSVNDIExpY2Vuc2UgKElTQykKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdsZW4gTWFkZGVybgo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1zZWxlY3Rvci1wYXJzZXIKTGljZW5zZTogTUlUCkJ5OiBCZW4gQnJpZ2dzLCBDaHJpcyBFcHBzdGVpbgpSZXBvc2l0b3J5OiBwb3N0Y3NzL3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyCgo+IENvcHlyaWdodCAoYykgQmVuIEJyaWdncyA8YmVuZWIuaW5mb0BnbWFpbC5jb20+IChodHRwOi8vYmVuZWIuaW5mbykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtdmFsdWUtcGFyc2VyCkxpY2Vuc2U6IE1JVApCeTogQm9nZGFuIENoYWRraW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL1RyeVNvdW5kL3Bvc3Rjc3MtdmFsdWUtcGFyc2VyLmdpdAoKPiBDb3B5cmlnaHQgKGMpIEJvZ2RhbiBDaGFka2luIDx0cnlzb3VuZEB5YW5kZXgucnU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyByZWFkZGlycApMaWNlbnNlOiBNSVQKQnk6IFRob3JzdGVuIExvcmVueiwgUGF1bCBNaWxsZXIKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvcmVhZGRpcnAuZ2l0Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgVGhvcnN0ZW4gTG9yZW56LCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcmVxdWlyZXMtcG9ydApMaWNlbnNlOiBNSVQKQnk6IEFybm91dCBLYXplbWllcgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vdW5zaGlmdGlvL3JlcXVpcmVzLXBvcnQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1IFVuc2hpZnQuaW8sIEFybm91dCBLYXplbWllciwgIHRoZSBDb250cmlidXRvcnMuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyByZXNvbHZlLmV4cG9ydHMsIHRvdGFsaXN0CkxpY2Vuc2U6IE1JVApCeTogTHVrZSBFZHdhcmRzClJlcG9zaXRvcmllczogbHVrZWVkL3Jlc29sdmUuZXhwb3J0cywgbHVrZWVkL3RvdGFsaXN0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgTHVrZSBFZHdhcmRzIDxsdWtlLmVkd2FyZHMwNUBnbWFpbC5jb20+IChsdWtlZWQuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgc2hlYmFuZy1jb21tYW5kCkxpY2Vuc2U6IE1JVApCeTogS2V2aW4gTcOlcnRlbnNzb24KUmVwb3NpdG9yeToga2V2dmEvc2hlYmFuZy1jb21tYW5kCgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBLZXZpbiBNw6VydGVuc3NvbiA8a2V2aW5tYXJ0ZW5zc29uQGdtYWlsLmNvbT4gKGdpdGh1Yi5jb20va2V2dmEpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzaXJ2CkxpY2Vuc2U6IE1JVApCeTogTHVrZSBFZHdhcmRzClJlcG9zaXRvcnk6IGx1a2VlZC9zaXJ2CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHN0YXR1c2VzCkxpY2Vuc2U6IE1JVApCeTogRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24sIEpvbmF0aGFuIE9uZwpSZXBvc2l0b3J5OiBqc2h0dHAvc3RhdHVzZXMKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiA8ZG91Z0Bzb21ldGhpbmdkb3VnLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHN0cmluZy1oYXNoCkxpY2Vuc2U6IENDMC0xLjAKQnk6IFRoZSBEYXJrIFNreSBDb21wYW55ClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC5naXQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgc3RyaXAtbGl0ZXJhbApMaWNlbnNlOiBNSVQKQnk6IEFudGhvbnkgRnUKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hbnRmdS9zdHJpcC1saXRlcmFsLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyMiBBbnRob255IEZ1IDxodHRwczovL2dpdGh1Yi5jb20vYW50ZnU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB0by1yZWdleC1yYW5nZQpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBSb3V2ZW4gV2XDn2xpbmcKUmVwb3NpdG9yeTogbWljcm9tYXRjaC90by1yZWdleC1yYW5nZQoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB0c2NvbmZjawpMaWNlbnNlOiBNSVQKQnk6IGRvbWluaWtnClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vZG9taW5pa2cvdHNjb25mY2suZ2l0Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDIxLXByZXNlbnQgZG9taW5pa2cgYW5kIFtjb250cmlidXRvcnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmlrZy90c2NvbmZjay9ncmFwaHMvY29udHJpYnV0b3JzKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KPiAKPiAtLSBMaWNlbnNlcyBmb3IgM3JkLXBhcnR5IGNvZGUgaW5jbHVkZWQgaW4gdHNjb25mY2sgLS0KPiAKPiAjIHN0cmlwLWJvbSBhbmQgc3RyaXAtanNvbi1jb21tZW50cwo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoaHR0cHM6Ly9zaW5kcmVzb3JodXMuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdW5waXBlCkxpY2Vuc2U6IE1JVApCeTogRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KUmVwb3NpdG9yeTogc3RyZWFtLXV0aWxzL3VucGlwZQoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiA8ZG91Z0Bzb21ldGhpbmdkb3VnLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdXRpbC1kZXByZWNhdGUKTGljZW5zZTogTUlUCkJ5OiBOYXRoYW4gUmFqbGljaApSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL1Rvb1RhbGxOYXRlL3V0aWwtZGVwcmVjYXRlLmdpdAoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBOYXRoYW4gUmFqbGljaCA8bmF0aGFuQHRvb3RhbGxuYXRlLm5ldD4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHV0aWxzLW1lcmdlCkxpY2Vuc2U6IE1JVApCeTogSmFyZWQgSGFuc29uClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vamFyZWRoYW5zb24vdXRpbHMtbWVyZ2UuZ2l0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxMy0yMDE3IEphcmVkIEhhbnNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHZhcnkKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgpSZXBvc2l0b3J5OiBqc2h0dHAvdmFyeQoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHdzCkxpY2Vuc2U6IE1JVApCeTogRWluYXIgT3R0byBTdGFuZ3ZpawpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MuZ2l0Cgo+IENvcHlyaWdodCAoYykgMjAxMSBFaW5hciBPdHRvIFN0YW5ndmlrIDxlaW5hcm9zQGdtYWlsLmNvbT4KPiBDb3B5cmlnaHQgKGMpIDIwMTMgQXJub3V0IEthemVtaWVyIGFuZCBjb250cmlidXRvcnMKPiBDb3B5cmlnaHQgKGMpIDIwMTYgTHVpZ2kgUGluY2EgYW5kIGNvbnRyaWJ1dG9ycwo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCg== + IyBWaXRlIGNvcmUgbGljZW5zZQpWaXRlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKCk1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTktcHJlc2VudCwgVm9pZFplcm8gSW5jLiBhbmQgVml0ZSBjb250cmlidXRvcnMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgojIExpY2Vuc2VzIG9mIGJ1bmRsZWQgZGVwZW5kZW5jaWVzClRoZSBwdWJsaXNoZWQgVml0ZSBhcnRpZmFjdCBhZGRpdGlvbmFsbHkgY29udGFpbnMgY29kZSB3aXRoIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CkJTRC0yLUNsYXVzZSwgQ0MwLTEuMCwgSVNDLCBNSVQKCiMgQnVuZGxlZCBkZXBlbmRlbmNpZXM6CiMjIEBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nLCBAanJpZGdld2VsbC9yZW1hcHBpbmcsIEBqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYywgQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZwpMaWNlbnNlOiBNSVQKQnk6IEp1c3RpbiBSaWRnZXdlbGwKUmVwb3NpdG9yaWVzOiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvc291cmNlbWFwcy5naXQsIGdpdCtodHRwczovL2dpdGh1Yi5jb20vanJpZGdld2VsbC9zb3VyY2VtYXBzLmdpdCwgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3NvdXJjZW1hcHMuZ2l0LCBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvc291cmNlbWFwcy5naXQKCj4gQ29weXJpZ2h0IDIwMjQgSnVzdGluIFJpZGdld2VsbCA8anVzdGluQHJpZGdld2VsbC5uYW1lPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQGpyaWRnZXdlbGwvcmVzb2x2ZS11cmkKTGljZW5zZTogTUlUCkJ5OiBKdXN0aW4gUmlkZ2V3ZWxsClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3Jlc29sdmUtdXJpCgo+IENvcHlyaWdodCAyMDE5IEp1c3RpbiBSaWRnZXdlbGwgPGpyaWRnZXdlbGxAZ29vZ2xlLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBwb2xrYS9jb21wcmVzc2lvbgpMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogbHVrZWVkL3BvbGthCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBwb2xrYS91cmwKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL3BvbGthCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEByb2xsZG93bi9wbHVnaW51dGlscwpMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9yb2xsZG93bi9yb2xsZG93bi5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjQtcHJlc2VudCBWb2lkWmVybyBJbmMuICYgQ29udHJpYnV0b3JzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgo+IAo+IGVuZCBvZiB0ZXJtcyBhbmQgY29uZGl0aW9ucwo+IAo+IFRoZSBsaWNlbnNlcyBvZiBleHRlcm5hbGx5IG1haW50YWluZWQgbGlicmFyaWVzIGZyb20gd2hpY2ggcGFydHMgb2YgdGhlIFNvZnR3YXJlIGlzIGRlcml2ZWQgYXJlIGxpc3RlZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL3JvbGxkb3duL3JvbGxkb3duL2Jsb2IvbWFpbi9USElSRC1QQVJUWS1MSUNFTlNFKS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQHJvbGx1cC9wbHVnaW4tYWxpYXMsIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzLCBAcm9sbHVwL3BsdWdpbi1keW5hbWljLWltcG9ydC12YXJzLCBAcm9sbHVwL3BsdWdpbnV0aWxzCkxpY2Vuc2U6IE1JVApCeTogSm9oYW5uZXMgU3RlaW4KUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogTGFyc0RlbkJha2tlcgpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgUm9sbHVwSlMgUGx1Z2luIENvbnRyaWJ1dG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL2dyYXBocy9jb250cmlidXRvcnMpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBhbnltYXRjaApMaWNlbnNlOiBJU0MKQnk6IEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXRjaC9hbnltYXRjaAoKPiBUaGUgSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgRWxhbiBTaGFua2VyLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGFydGljaG9raWUKTGljZW5zZTogTUlUCkJ5OiBzYXBwaGktcmVkLCBFdmFuIFlvdQpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3NhcHBoaS1yZWQvYXJ0aWNob2tpZS5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAtcHJlc2VudCwgWXV4aSAoRXZhbikgWW91Cj4gQ29weXJpZ2h0IChjKSAyMDIzLXByZXNlbnQsIHNhcHBoaS1yZWQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGJpbmFyeS1leHRlbnNpb25zCkxpY2Vuc2U6IE1JVApCeTogU2luZHJlIFNvcmh1cwpSZXBvc2l0b3J5OiBzaW5kcmVzb3JodXMvYmluYXJ5LWV4dGVuc2lvbnMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gQ29weXJpZ2h0IChjKSBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgYnJhY2VzLCBmaWxsLXJhbmdlLCBpcy1udW1iZXIKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIEVsYW4gU2hhbmtlciwgRXVnZW5lIFNoYXJ5Z2luLCBoZW1hbnRoLmhtClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvYnJhY2VzCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBFZG8gUml2YWksIFBhdWwgTWlsbGVyLCBSb3V2ZW4gV2XDn2xpbmcKUmVwb3NpdG9yeTogam9uc2NobGlua2VydC9maWxsLXJhbmdlCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBPbHN0ZW4gTGFyY2ssIFJvdXZlbiBXZcOfbGluZwpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L2lzLW51bWJlcgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBidW5kbGUtbmFtZSwgZGVmYXVsdC1icm93c2VyLCBkZWZhdWx0LWJyb3dzZXItaWQsIGRlZmluZS1sYXp5LXByb3AsIGlzLWRvY2tlciwgaXMtaW5zaWRlLWNvbnRhaW5lciwgaXMtd3NsLCBvcGVuLCBydW4tYXBwbGVzY3JpcHQsIHdzbC11dGlscwpMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvYnVuZGxlLW5hbWUsIHNpbmRyZXNvcmh1cy9kZWZhdWx0LWJyb3dzZXIsIHNpbmRyZXNvcmh1cy9kZWZhdWx0LWJyb3dzZXItaWQsIHNpbmRyZXNvcmh1cy9kZWZpbmUtbGF6eS1wcm9wLCBzaW5kcmVzb3JodXMvaXMtZG9ja2VyLCBzaW5kcmVzb3JodXMvaXMtaW5zaWRlLWNvbnRhaW5lciwgc2luZHJlc29yaHVzL2lzLXdzbCwgc2luZHJlc29yaHVzL29wZW4sIHNpbmRyZXNvcmh1cy9ydW4tYXBwbGVzY3JpcHQsIHNpbmRyZXNvcmh1cy93c2wtdXRpbHMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjYWMKTGljZW5zZTogTUlUCkJ5OiBlZ29pc3QKUmVwb3NpdG9yeTogZWdvaXN0L2NhYwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEVHT0lTVCA8MHgxNDI4NTdAZ21haWwuY29tPiAoaHR0cHM6Ly9naXRodWIuY29tL2Vnb2lzdCkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNob2tpZGFyCkxpY2Vuc2U6IE1JVApCeTogUGF1bCBNaWxsZXIsIEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9jaG9raWRhci5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgUGF1bCBNaWxsZXIgKGh0dHBzOi8vcGF1bG1pbGxyLmNvbSksIEVsYW4gU2hhbmtlcgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg4oCcQVMgSVPigJ0sIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb21tb25kaXIsIHNoZWxsLXF1b3RlCkxpY2Vuc2U6IE1JVApCeTogSmFtZXMgSGFsbGlkYXkKUmVwb3NpdG9yaWVzOiBodHRwOi8vZ2l0aHViLmNvbS9zdWJzdGFjay9ub2RlLWNvbW1vbmRpci5naXQsIGh0dHA6Ly9naXRodWIuY29tL2xqaGFyYi9zaGVsbC1xdW90ZS5naXQKCj4gVGhlIE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEphbWVzIEhhbGxpZGF5IChtYWlsQHN1YnN0YWNrLm5ldCkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgCj4gdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIAo+IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byAKPiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIAo+IG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSAKPiB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCAKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAKPiBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiAKPiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNvbm5lY3QKTGljZW5zZTogTUlUCkJ5OiBUSiBIb2xvd2F5Y2h1aywgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24sIEpvbmF0aGFuIE9uZywgVGltIENhc3dlbGwKUmVwb3NpdG9yeTogc2VuY2hhbGFicy9jb25uZWN0Cgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEwIFNlbmNoYSBJbmMuCj4gQ29weXJpZ2h0IChjKSAyMDExIExlYXJuQm9vc3QKPiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUSiBIb2xvd2F5Y2h1awo+IENvcHlyaWdodCAoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb252ZXJ0LXNvdXJjZS1tYXAKTGljZW5zZTogTUlUCkJ5OiBUaG9yc3RlbiBMb3JlbnoKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS90aGxvcmVuei9jb252ZXJ0LXNvdXJjZS1tYXAuZ2l0Cgo+IENvcHlyaWdodCAyMDEzIFRob3JzdGVuIExvcmVuei4gCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNvcnMKTGljZW5zZTogTUlUCkJ5OiBUcm95IEdvb2RlClJlcG9zaXRvcnk6IGV4cHJlc3Nqcy9jb3JzCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIFRyb3kgR29vZGUgPHRyb3lnb29kZUBnbWFpbC5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNyb3NzLXNwYXduCkxpY2Vuc2U6IE1JVApCeTogQW5kcsOpIENydXoKUmVwb3NpdG9yeTogZ2l0QGdpdGh1Yi5jb206bW94eXN0dWRpby9ub2RlLWNyb3NzLXNwYXduLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTggTWFkZSBXaXRoIE1PWFkgTGRhIDxoZWxsb0Btb3h5LnN0dWRpbz4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNzc2VzYwpMaWNlbnNlOiBNSVQKQnk6IE1hdGhpYXMgQnluZW5zClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL2Nzc2VzYy5naXQKCj4gQ29weXJpZ2h0IE1hdGhpYXMgQnluZW5zIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCj4gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgo+IE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgo+IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkZWJ1ZwpMaWNlbnNlOiBNSVQKQnk6IEpvc2ggSnVub24sIFRKIEhvbG93YXljaHVrLCBOYXRoYW4gUmFqbGljaCwgQW5kcmV3IFJoeW5lClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vZGVidWctanMvZGVidWcuZ2l0Cgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT4KPiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMSBKb3NoIEp1bm9uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCj4gYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAo+IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCj4gcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UCj4gTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkb3RlbnYKTGljZW5zZTogQlNELTItQ2xhdXNlClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vbW90ZG90bGEvZG90ZW52LmdpdAoKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNjb3R0IE1vdHRlCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKPiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKPiAKPiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwo+ICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCj4gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCj4gICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KPiAKPiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKPiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCj4gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCj4gRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQo+IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCj4gREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKPiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgo+IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCj4gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKPiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkb3RlbnYtZXhwYW5kCkxpY2Vuc2U6IEJTRC0yLUNsYXVzZQpCeTogbW90ZG90bGEKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL21vdGRvdGxhL2RvdGVudi1leHBhbmQKCj4gQ29weXJpZ2h0IChjKSAyMDE2LCBTY290dCBNb3R0ZQo+IEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gCj4gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cj4gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Cj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKPiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgo+IAo+ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAo+ICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgo+ICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCj4gCj4gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCj4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQo+IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQo+IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKPiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAo+IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCj4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKPiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAo+IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCj4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZWUtZmlyc3QKTGljZW5zZTogTUlUCkJ5OiBKb25hdGhhbiBPbmcsIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IGpvbmF0aGFub25nL2VlLWZpcnN0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBKb25hdGhhbiBPbmcgbWVAam9uZ2xlYmVycnkuY29tCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlbmNvZGV1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgpSZXBvc2l0b3J5OiBwaWxsYXJqcy9lbmNvZGV1cmwKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZW50aXRpZXMKTGljZW5zZTogQlNELTItQ2xhdXNlCkJ5OiBGZWxpeCBCb2VobQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2ZiNTUvZW50aXRpZXMuZ2l0Cgo+IENvcHlyaWdodCAoYykgRmVsaXggQsO2aG0KPiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+IAo+IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKPiAKPiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCj4gCj4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgo+IAo+IFRISVMgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMsCj4gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZXMtbW9kdWxlLWxleGVyCkxpY2Vuc2U6IE1JVApCeTogR3V5IEJlZGZvcmQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ndXliZWRmb3JkL2VzLW1vZHVsZS1sZXhlci5naXQKCj4gTUlUIExpY2Vuc2UKPiAtLS0tLS0tLS0tLQo+IAo+IENvcHlyaWdodCAoQykgMjAxOC0yMDIyIEd1eSBCZWRmb3JkCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlc2NhcGUtaHRtbApMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogY29tcG9uZW50L2VzY2FwZS1odG1sCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNodWsKPiBDb3B5cmlnaHQgKGMpIDIwMTUgQW5kcmVhcyBMdWJiZQo+IENvcHlyaWdodCAoYykgMjAxNSBUaWFuY2hlbmcgIlRpbW90aHkiIEd1Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGVzdHJlZS13YWxrZXIKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vUmljaC1IYXJyaXMvZXN0cmVlLXdhbGtlcgoKPiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAgW3RoZXNlIHBlb3BsZV0oaHR0cHM6Ly9naXRodWIuY29tL1JpY2gtSGFycmlzL2VzdHJlZS13YWxrZXIvZ3JhcGhzL2NvbnRyaWJ1dG9ycykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGV0YWcKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgRGF2aWQgQmrDtnJrbHVuZApSZXBvc2l0b3J5OiBqc2h0dHAvZXRhZwoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGZpbmFsaGFuZGxlcgpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHBpbGxhcmpzL2ZpbmFsaGFuZGxlcgoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBmb2xsb3ctcmVkaXJlY3RzCkxpY2Vuc2U6IE1JVApCeTogUnViZW4gVmVyYm9yZ2gsIE9saXZpZXIgTGFsb25kZSwgSmFtZXMgVGFsbWFnZQpSZXBvc2l0b3J5OiBnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vZm9sbG93LXJlZGlyZWN0cy9mb2xsb3ctcmVkaXJlY3RzLmdpdAoKPiBDb3B5cmlnaHQgMjAxNOKAk3ByZXNlbnQgT2xpdmllciBMYWxvbmRlIDxvbGFsb25kZUBnbWFpbC5jb20+LCBKYW1lcyBUYWxtYWdlIDxqYW1lc0B0YWxtYWdlLmlvPiwgUnViZW4gVmVyYm9yZ2gKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKPiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KPiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBnZW5lcmljLW5hbWVzCkxpY2Vuc2U6IE1JVApCeTogQWxleGV5IExpdHZpbm92ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvZ2VuZXJpYy1uYW1lcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1IEFsZXhleSBMaXR2aW5vdgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZ2xvYi1wYXJlbnQKTGljZW5zZTogSVNDCkJ5OiBHdWxwIFRlYW0sIEVsYW4gU2hhbmtlciwgQmxhaW5lIEJ1YmxpdHoKUmVwb3NpdG9yeTogZ3VscGpzL2dsb2ItcGFyZW50Cgo+IFRoZSBJU0MgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgMjAxOSBFbGFuIFNoYW5rZXIKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBob3N0LXZhbGlkYXRpb24tbWlkZGxld2FyZQpMaWNlbnNlOiBNSVQKQnk6IHNhcHBoaS1yZWQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9zYXBwaGktcmVkL2hvc3QtdmFsaWRhdGlvbi1taWRkbGV3YXJlLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyNSBzYXBwaGktcmVkCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBodHRwLXByb3h5LTMKTGljZW5zZTogTUlUCkJ5OiBXaWxsaWFtIFN0ZWluLCBDaGFybGllIFJvYmJpbnMsIEppbWIgRXNzZXIsIGpjcnVnenoKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL3NhZ2VtYXRoaW5jL2h0dHAtcHJveHktMy5naXQKCj4gbm9kZS1odHRwLTMKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNSBXaWxsaWFtIFN0ZWluLCBDaGFybGllIFJvYmJpbnMsIEphcnJldHQgQ3J1Z2VyICYgdGhlIENvbnRyaWJ1dG9ycy4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQo+IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KPiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KPiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaWNzcy11dGlscwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL2ljc3MtdXRpbHMuZ2l0Cgo+IElTQyBMaWNlbnNlIChJU0MpCj4gQ29weXJpZ2h0IDIwMTggR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBpcy1iaW5hcnktcGF0aApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yeTogc2luZHJlc29yaHVzL2lzLWJpbmFyeS1wYXRoCgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE5IFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtZXh0Z2xvYgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0ClJlcG9zaXRvcnk6IGpvbnNjaGxpbmtlcnQvaXMtZXh0Z2xvYgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgSm9uIFNjaGxpbmtlcnQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzLWdsb2IKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIERhbmllbCBQZXJlegpSZXBvc2l0b3J5OiBtaWNyb21hdGNoL2lzLWdsb2IKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0Lgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtcmVmZXJlbmNlCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9SaWNoLUhhcnJpcy9pcy1yZWZlcmVuY2UuZ2l0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzZXhlLCB3aGljaApMaWNlbnNlOiBJU0MKQnk6IElzYWFjIFouIFNjaGx1ZXRlcgpSZXBvc2l0b3JpZXM6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL2lzZXhlLmdpdCwgZ2l0Oi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS13aGljaC5naXQKCj4gVGhlIElTQyBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBJc2FhYyBaLiBTY2hsdWV0ZXIgYW5kIENvbnRyaWJ1dG9ycwo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGpzLXRva2VucwpMaWNlbnNlOiBNSVQKQnk6IFNpbW9uIEx5ZGVsbApSZXBvc2l0b3J5OiBseWRlbGwvanMtdG9rZW5zCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCBTaW1vbiBMeWRlbGwKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxhdW5jaC1lZGl0b3IsIGxhdW5jaC1lZGl0b3ItbWlkZGxld2FyZQpMaWNlbnNlOiBNSVQKQnk6IEV2YW4gWW91ClJlcG9zaXRvcmllczogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS95eXg5OTA4MDMvbGF1bmNoLWVkaXRvci5naXQsIGdpdCtodHRwczovL2dpdGh1Yi5jb20veXl4OTkwODAzL2xhdW5jaC1lZGl0b3IuZ2l0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNy1wcmVzZW50LCBZdXhpIChFdmFuKSBZb3UKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxpbGNvbmZpZwpMaWNlbnNlOiBNSVQKQnk6IGFudG9uazUyClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnRvbms1Mi9saWxjb25maWcKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjIgQW50b24gS2FzdHJpdHNraXkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxvYWRlci11dGlscwpMaWNlbnNlOiBNSVQKQnk6IFRvYmlhcyBLb3BwZXJzIEBzb2tyYQpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay9sb2FkZXItdXRpbHMuZ2l0Cgo+IENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbG9kYXNoLmNhbWVsY2FzZQpMaWNlbnNlOiBNSVQKQnk6IEpvaG4tRGF2aWQgRGFsdG9uLCBCbGFpbmUgQnVibGl0eiwgTWF0aGlhcyBCeW5lbnMKUmVwb3NpdG9yeTogbG9kYXNoL2xvZGFzaAoKPiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz4KPiAKPiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzLCBjb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLAo+IERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9ycyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvPgo+IAo+IFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Cj4gaW5kaXZpZHVhbHMuIEZvciBleGFjdCBjb250cmlidXRpb24gaGlzdG9yeSwgc2VlIHRoZSByZXZpc2lvbiBoaXN0b3J5Cj4gYXZhaWxhYmxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoCj4gCj4gVGhlIGZvbGxvd2luZyBsaWNlbnNlIGFwcGxpZXMgdG8gYWxsIHBhcnRzIG9mIHRoaXMgc29mdHdhcmUgZXhjZXB0IGFzCj4gZG9jdW1lbnRlZCBiZWxvdzoKPiAKPiA9PT09Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAo+IE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKPiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCj4gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCj4gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCj4gCj4gPT09PQo+IAo+IENvcHlyaWdodCBhbmQgcmVsYXRlZCByaWdodHMgZm9yIHNhbXBsZSBjb2RlIGFyZSB3YWl2ZWQgdmlhIENDMC4gU2FtcGxlCj4gY29kZSBpcyBkZWZpbmVkIGFzIGFsbCBzb3VyY2UgY29kZSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBwcm9zZSBvZiB0aGUKPiBkb2N1bWVudGF0aW9uLgo+IAo+IENDMDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLwo+IAo+ID09PT0KPiAKPiBGaWxlcyBsb2NhdGVkIGluIHRoZSBub2RlX21vZHVsZXMgYW5kIHZlbmRvciBkaXJlY3RvcmllcyBhcmUgZXh0ZXJuYWxseQo+IG1haW50YWluZWQgbGlicmFyaWVzIHVzZWQgYnkgdGhpcyBzb2Z0d2FyZSB3aGljaCBoYXZlIHRoZWlyIG93bgo+IGxpY2Vuc2VzOyB3ZSByZWNvbW1lbmQgeW91IHJlYWQgdGhlbSwgYXMgdGhlaXIgdGVybXMgbWF5IGRpZmZlciBmcm9tIHRoZQo+IHRlcm1zIGFib3ZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtYWdpYy1zdHJpbmcKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcmljaC1oYXJyaXMvbWFnaWMtc3RyaW5nLmdpdAoKPiBDb3B5cmlnaHQgMjAxOCBSaWNoIEhhcnJpcwo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbWxseSwgdWZvCkxpY2Vuc2U6IE1JVApSZXBvc2l0b3JpZXM6IHVuanMvbWxseSwgdW5qcy91Zm8KCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFBvb3lhIFBhcnNhIDxwb295YUBwaTAuaW8+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtcm1pbWUKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL21ybWltZQoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAoaHR0cHM6Ly9sdWtlZWQuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbXMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IHZlcmNlbC9tcwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAgVmVyY2VsLCBJbmMuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBub3JtYWxpemUtcGF0aApMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBCbGFpbmUgQnVibGl0egpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L25vcm1hbGl6ZS1wYXRoCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCBKb24gU2NobGlua2VydC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIG9iamVjdC1hc3NpZ24KTGljZW5zZTogTUlUCkJ5OiBTaW5kcmUgU29yaHVzClJlcG9zaXRvcnk6IHNpbmRyZXNvcmh1cy9vYmplY3QtYXNzaWduCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKHNpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBvbi1maW5pc2hlZApMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL29uLWZpbmlzaGVkCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNCBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiA8ZG91Z0Bzb21ldGhpbmdkb3VnLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2U1CkxpY2Vuc2U6IE1JVApCeTogSXZhbiBOaWt1bGluLCBodHRwczovL2dpdGh1Yi5jb20vaW5pa3VsaW4vcGFyc2U1L2dyYXBocy9jb250cmlidXRvcnMKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9pbmlrdWxpbi9wYXJzZTUuZ2l0Cgo+IENvcHlyaWdodCAoYykgMjAxMy0yMDE5IEl2YW4gTmlrdWxpbiAoaWZhYWFuQGdtYWlsLmNvbSwgaHR0cHM6Ly9naXRodWIuY29tL2luaWt1bGluKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2V1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgSm9uYXRoYW4gT25nClJlcG9zaXRvcnk6IHBpbGxhcmpzL3BhcnNldXJsCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwYXRoLWtleSwgc2hlYmFuZy1yZWdleApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvcGF0aC1rZXksIHNpbmRyZXNvcmh1cy9zaGViYW5nLXJlZ2V4Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBlcmlzY29waWMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IFJpY2gtSGFycmlzL3BlcmlzY29waWMKCj4gQ29weXJpZ2h0IChjKSAyMDE5IFJpY2ggSGFycmlzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwaWNvY29sb3JzCkxpY2Vuc2U6IElTQwpCeTogQWxleGV5IFJhc3BvcG92ClJlcG9zaXRvcnk6IGFsZXhleXJhc3BvcG92L3BpY29jb2xvcnMKCj4gSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyNCBPbGVrc2lpIFJhc3BvcG92LCBLb3N0aWFudHluIERlbnlzb3YsIEFudG9uIFZlcmlub3YKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKPiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLWltcG9ydApMaWNlbnNlOiBNSVQKQnk6IE1heGltZSBUaGlyb3VpbgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcG9zdGNzcy9wb3N0Y3NzLWltcG9ydC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IE1heGltZSBUaGlyb3VpbiwgSmFzb24gQ2FtcGJlbGwgJiBLZXZpbiBNw6VydGVuc3Nvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbG9hZC1jb25maWcKTGljZW5zZTogTUlUCkJ5OiBNaWNoYWVsIENpbmlhd2t5LCBSeWFuIER1bmNrZWwsIE1hdGV1c3ogRGVya3MsIERhbHRvbiBTYW50b3MsIFBhdHJpY2sgR2lsZGF5LCBGcmFuw6dvaXMgV291dHMKUmVwb3NpdG9yeTogcG9zdGNzcy9wb3N0Y3NzLWxvYWQtY29uZmlnCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCBNaWNoYWVsIENpbmlhd3NreSA8bWljaGFlbC5jaW5pYXdza3lAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcwpMaWNlbnNlOiBNSVQKQnk6IEFsZXhhbmRlciBNYWR5YW5raW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL3Bvc3Rjc3MtbW9kdWxlcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUtcHJlc2VudCBBbGV4YW5kZXIgTWFkeWFua2luIDxhbGV4YW5kZXJAbWFkeWFua2luLm5hbWU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgo+IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCj4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwo+IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCj4gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAo+IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwo+IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgo+IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgo+IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCj4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cy5naXQKCj4gQ29weXJpZ2h0IDIwMTUgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdApMaWNlbnNlOiBNSVQKQnk6IE1hcmsgRGFsZ2xlaXNoClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9jc3MtbW9kdWxlcy9wb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUgTWFyayBEYWxnbGVpc2ggPG1hcmsuam9obi5kYWxnbGVpc2hAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcy1zY29wZQpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXNjb3BlLmdpdAoKPiBJU0MgTGljZW5zZSAoSVNDKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtdmFsdWVzCkxpY2Vuc2U6IElTQwpCeTogR2xlbiBNYWRkZXJuClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXZhbHVlcy5naXQKCj4gSVNDIExpY2Vuc2UgKElTQykKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdsZW4gTWFkZGVybgo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1zZWxlY3Rvci1wYXJzZXIKTGljZW5zZTogTUlUCkJ5OiBCZW4gQnJpZ2dzLCBDaHJpcyBFcHBzdGVpbgpSZXBvc2l0b3J5OiBwb3N0Y3NzL3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyCgo+IENvcHlyaWdodCAoYykgQmVuIEJyaWdncyA8YmVuZWIuaW5mb0BnbWFpbC5jb20+IChodHRwOi8vYmVuZWIuaW5mbykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtdmFsdWUtcGFyc2VyCkxpY2Vuc2U6IE1JVApCeTogQm9nZGFuIENoYWRraW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL1RyeVNvdW5kL3Bvc3Rjc3MtdmFsdWUtcGFyc2VyLmdpdAoKPiBDb3B5cmlnaHQgKGMpIEJvZ2RhbiBDaGFka2luIDx0cnlzb3VuZEB5YW5kZXgucnU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyByZWFkZGlycApMaWNlbnNlOiBNSVQKQnk6IFRob3JzdGVuIExvcmVueiwgUGF1bCBNaWxsZXIKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvcmVhZGRpcnAuZ2l0Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgVGhvcnN0ZW4gTG9yZW56LCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcmVzb2x2ZS5leHBvcnRzLCB0b3RhbGlzdApMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3JpZXM6IGx1a2VlZC9yZXNvbHZlLmV4cG9ydHMsIGx1a2VlZC90b3RhbGlzdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAobHVrZWVkLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHNoZWJhbmctY29tbWFuZApMaWNlbnNlOiBNSVQKQnk6IEtldmluIE3DpXJ0ZW5zc29uClJlcG9zaXRvcnk6IGtldnZhL3NoZWJhbmctY29tbWFuZAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgS2V2aW4gTcOlcnRlbnNzb24gPGtldmlubWFydGVuc3NvbkBnbWFpbC5jb20+IChnaXRodWIuY29tL2tldnZhKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgc2lydgpMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3J5OiBsdWtlZWQvc2lydgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzdGF0dXNlcwpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL3N0YXR1c2VzCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBKb25hdGhhbiBPbmcgPG1lQGpvbmdsZWJlcnJ5LmNvbT4KPiBDb3B5cmlnaHQgKGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24gPGRvdWdAc29tZXRoaW5nZG91Zy5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzdHJpbmctaGFzaApMaWNlbnNlOiBDQzAtMS4wCkJ5OiBUaGUgRGFyayBTa3kgQ29tcGFueQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2Rhcmtza3lhcHAvc3RyaW5nLWhhc2guZ2l0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHN0cmlwLWxpdGVyYWwKTGljZW5zZTogTUlUCkJ5OiBBbnRob255IEZ1ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vYW50ZnUvc3RyaXAtbGl0ZXJhbC5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjIgQW50aG9ueSBGdSA8aHR0cHM6Ly9naXRodWIuY29tL2FudGZ1Pgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdG8tcmVnZXgtcmFuZ2UKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgUm91dmVuIFdlw59saW5nClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvdG8tcmVnZXgtcmFuZ2UKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0Lgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdHNjb25mY2sKTGljZW5zZTogTUlUCkJ5OiBkb21pbmlrZwpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWtnL3RzY29uZmNrLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyMS1wcmVzZW50IGRvbWluaWtnIGFuZCBbY29udHJpYnV0b3JzXShodHRwczovL2dpdGh1Yi5jb20vZG9taW5pa2cvdHNjb25mY2svZ3JhcGhzL2NvbnRyaWJ1dG9ycykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCj4gCj4gLS0gTGljZW5zZXMgZm9yIDNyZC1wYXJ0eSBjb2RlIGluY2x1ZGVkIGluIHRzY29uZmNrIC0tCj4gCj4gIyBzdHJpcC1ib20gYW5kIHN0cmlwLWpzb24tY29tbWVudHMKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKGh0dHBzOi8vc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHVucGlwZQpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHN0cmVhbS11dGlscy91bnBpcGUKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24gPGRvdWdAc29tZXRoaW5nZG91Zy5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHV0aWwtZGVwcmVjYXRlCkxpY2Vuc2U6IE1JVApCeTogTmF0aGFuIFJhamxpY2gKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9Ub29UYWxsTmF0ZS91dGlsLWRlcHJlY2F0ZS5naXQKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQgTmF0aGFuIFJhamxpY2ggPG5hdGhhbkB0b290YWxsbmF0ZS5uZXQ+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB1dGlscy1tZXJnZQpMaWNlbnNlOiBNSVQKQnk6IEphcmVkIEhhbnNvbgpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2phcmVkaGFuc29uL3V0aWxzLW1lcmdlLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBKYXJlZCBIYW5zb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKPiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCj4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCj4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCj4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KPiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB2YXJ5CkxpY2Vuc2U6IE1JVApCeTogRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KUmVwb3NpdG9yeToganNodHRwL3ZhcnkKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB3cwpMaWNlbnNlOiBNSVQKQnk6IEVpbmFyIE90dG8gU3Rhbmd2aWsKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzLmdpdAoKPiBDb3B5cmlnaHQgKGMpIDIwMTEgRWluYXIgT3R0byBTdGFuZ3ZpayA8ZWluYXJvc0BnbWFpbC5jb20+Cj4gQ29weXJpZ2h0IChjKSAyMDEzIEFybm91dCBLYXplbWllciBhbmQgY29udHJpYnV0b3JzCj4gQ29weXJpZ2h0IChjKSAyMDE2IEx1aWdpIFBpbmNhIGFuZCBjb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKPiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCj4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCj4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCj4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KPiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo= - + Anthony Fu vitest 3.2.4 @@ -2759,14 +2857,18 @@ https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2d408fe5ebf7194443cac4d688fe3bc11454a4b28c39f3e1fb2293c779152048aee4a38c7aace99d836c2b23a856b50b8af47cb4b724b38fa581adf75a19fdd0 + + true node_modules/vitest - + Jon Schlinkert picomatch 4.0.3 @@ -2792,10 +2894,14 @@ https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e604e680463fb2a2ba8055cb22c40d1f5f6559be1e6cf0cb03849d2cfeddb169085c75a51baea83ee56f5d21853e9a58673f190d9ab475862b6c77c109551bd5 + + true node_modules/vitest/node_modules/picomatch @@ -2817,7 +2923,7 @@ - + Colin McDonnell zod 3.25.76 @@ -2843,7 +2949,10 @@ https://registry.npmjs.org/zod/-/zod-3.25.76.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 83352dfeab7cd675ec14628815c0b76277c4031e4d92e9c27e70e5bee0524854b4d9b717bb82e679ad001485306cb5b158fc7777da7c4b94286ae8ca70d43171 + @@ -2858,7 +2967,7 @@ - + @radix-ui react-avatar 1.1.10 @@ -2883,7 +2992,10 @@ https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 57ca6215f59aa4ce4e98d0974f355063e135ac36b9df363e310e18ef7e7abf87c5cfabea0b252d233dab503e3864477083bf3f8ca98c2478f4efe0bf67fadca2 + @@ -2898,7 +3010,7 @@ - + @radix-ui react-checkbox 1.3.3 @@ -2923,7 +3035,10 @@ https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c016e9bfe3507ed1c3746f3a41cd292325e4e48477b4cf157749d62ca0dc5fc9cd9f89d714e170b0abaac36a2403fd43fe6a5a0249aeca776b3c94d80cd66d17 + @@ -2938,7 +3053,7 @@ - + @radix-ui react-dialog 1.1.15 @@ -2963,7 +3078,10 @@ https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4c2825551b7395f7d137144c132477e831812c9a5ebac15c80c543f4f644cc02a752cd65282817e6ef41982d9883e2cbf4c8190ee80516cd5597e269e2dfcf1b + @@ -2978,7 +3096,7 @@ - + @radix-ui react-dropdown-menu 2.1.16 @@ -3003,7 +3121,10 @@ https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d4f2c6404ca723fdce5ff7ed579e023a7fb74ae77f327f2f00b836ad69c12e745a1ad24376e356ff6d978e51a03dda5c21b890c632ad6fb0647233f4d27a9f27 + @@ -3018,7 +3139,7 @@ - + @radix-ui react-label 2.1.7 @@ -3043,7 +3164,10 @@ https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 613d46a8f48bf24267db47637a5317eff713469fd8f70e48647bdfc504d51eb3aa6b6c8c97b8bf51f32a29153957b984c8a4eb5158095e13503d5086f0f04ba1 + @@ -3058,7 +3182,7 @@ - + @radix-ui react-popover 1.1.15 @@ -3083,7 +3207,10 @@ https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 92bd17dbee98cbfbc9ccb60950f09911cf127d071ffb508e16802a6ae266ef8ba6421b5af4cee53491cfed0412def92f7062d051b5a9333c2b5d8c2b633b4728 + @@ -3098,7 +3225,7 @@ - + @radix-ui react-radio-group 1.3.8 @@ -3123,7 +3250,10 @@ https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 541298218226039cecc4009d8ac350dc18c205f99b187de44259c556a956538b57c23cbb7065fcb5af3405cacef96257227e620729441f72ba65395e7bffe581 + @@ -3138,7 +3268,7 @@ - + @radix-ui react-select 2.2.6 @@ -3163,7 +3293,10 @@ https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 237d11c9d3be6e79f63d0cedbe8db9b6cc0f1fec050637a1546b666a0914efcc8c7704f055fd76c2700e17e01e3fc4b637cc43fb950f6c686451f3f2bd3fa6c1 + @@ -3178,7 +3311,7 @@ - + @radix-ui react-slot 1.2.3 @@ -3203,7 +3336,10 @@ https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 69e3661e70716e2d92b746aee950550bb25716584b94e9ef20895e3cd9e2c943400a5ce6b4050463cfe90622b78878ee7ce97003e736d3ff239e0a3bc5cae0f0 + @@ -3218,7 +3354,7 @@ - + @radix-ui react-tabs 1.1.13 @@ -3243,7 +3379,10 @@ https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ef175c6ad83bfd4fbbf94772a23db3a1db48f47fc8228a6aa3e60e21c64eab59c9c1758167da7cc62bb99655e57a40db66471aefd6bf7e8cc46105c8038b16e8 + @@ -3258,7 +3397,7 @@ - + @radix-ui react-tooltip 1.2.8 @@ -3283,7 +3422,10 @@ https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b58eec56dd722fda33231be66ed379aad987da4ad770109f8c488280a18baae9c91ef82f646d8f725da843791b7190116f50461077642f371818ef329d59627a + @@ -3298,7 +3440,7 @@ - + Joe Bell class-variance-authority 0.7.1 @@ -3324,7 +3466,10 @@ https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 29afbd4ebbadbfb1bc33a593e927a2456cfbf762b9a84a881841b35ca84013ac4e58063aa4f1fc53ef48637a0232fea4a9398bb2fed787fdb0d918a091e3ccb2 + @@ -3339,7 +3484,7 @@ - + Dany Castillo tailwind-merge 2.6.0 @@ -3365,7 +3510,10 @@ https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3fe56ed6a5dfcde7628ab987382df1286018799b4f715f60efa5fec60d850f8b58811ef57b0300df9637b02cf7ce188dfddc1e7d1a495f4c81720c22d5f5cd40 + @@ -3380,7 +3528,7 @@ - + Tanner Linsley @tanstack history @@ -3407,7 +3555,10 @@ https://registry.npmjs.org/@tanstack/history/-/history-1.132.31.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5021ccdae4b4b7fb92b33a8f128f920524a8415790f8b94e580541979480efe01e75e01b29a7c83e3167f21b9909734b0186f458a576fb0113afb9432bdbb3ee + @@ -3422,7 +3573,7 @@ - + Tanner Linsley @tanstack react-store @@ -3449,7 +3600,10 @@ https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + aaa4f4b9f7a01510c64a87fd0ff56a699823360a78b513c764826adbe4081e4314b478da274958aeb5e3788509be39d36e03df483d5780e304b7496600d9fa66 + @@ -3464,7 +3618,7 @@ - + isbot 5.1.31 🤖/👨‍🦰 Recognise bots/crawlers/spiders using the user agent string. @@ -3489,7 +3643,10 @@ https://registry.npmjs.org/isbot/-/isbot-5.1.31.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0cf810b217a112b1c0a9208a0dbdeb356d37a5adb04bfbf97afbd4aadc6de934e71d1a801bc15dcdc49226cf7ae7aa4ae98f8d4fb2bd47869c1185cb1d87e951 + @@ -3504,7 +3661,7 @@ - + Alex Reardon tiny-warning 1.0.3 @@ -3530,7 +3687,10 @@ https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 94137dccb37fa007faf28df335762b742b7590ff16b22196f0ea3691ae356f620ce492ff4b5093c97d6b5b499bff34ae26e9f4654ac3c71e2caaf612d855b33c + @@ -3545,7 +3705,7 @@ - + Tanner Linsley @tanstack store @@ -3572,7 +3732,10 @@ https://registry.npmjs.org/@tanstack/store/-/store-0.7.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c5aea94da9f56dc6aa6034bd043a52892eb7a9ae84a0390f37d46c45ac47b837550cd9edceadf137047960a4d4fd5dd2912c82f53e1854e3e1db34503749e121 + @@ -3587,7 +3750,7 @@ - + cookie-es 2.0.0 @@ -3611,7 +3774,10 @@ https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4408f8138db5518460aa890a526a2da80c2ea65630d79aad7577d8fa11b380227f3018c2559712a072bf907f64a1c7e3463703304ec8883591ff5597d533363e + @@ -3626,7 +3792,7 @@ - + Alexis Munsayac seroval-plugins 1.3.3 @@ -3652,7 +3818,10 @@ https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d7a38bdcd9d4070f091b58c12d4a1926c2e742ad27e546ba6876a58492b87cc424cf596a47b3accf5b00df4b6b06d77d5540dcd8d824b910a7f3efe9070a99fb + @@ -3667,7 +3836,7 @@ - + Alexis Munsayac seroval 1.3.2 @@ -3693,7 +3862,10 @@ https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 45b70f1f59f971fc0aaebbbbbfbfb3ad9be32eeae01e11b2b28dc74f21ad462bc65a06236ce986ba2bc241a3913442e334e3682b7e678f6f04a16ba5f6c6f5cd + @@ -3708,7 +3880,7 @@ - + Tanner Linsley @tanstack react-router-devtools @@ -3735,137 +3907,15 @@ https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.132.47.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 53a5b4281ee4b27c5486e544121c0404581c12e676550949a765dffebef1e91cb32bc986d068c9eb10103fead690ccc07b7cc45af681de25c425038ba85f91e3 + node_modules/@tanstack/react-router-devtools - - - Evan You - vite - 7.1.9 - Native-ESM powered web dev build tool - - - MIT - - - pkg:npm/vite@7.1.9#packages/vite - - - git+https://github.com/vitejs/vite.git#packages/vite - as detected from PackageJson property "repository.url" and "repository.directory" - - - https://vite.dev - as detected from PackageJson property "homepage" - - - https://github.com/vitejs/vite/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/vite/-/vite-7.1.9.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/react-router-devtools/node_modules/vite - - - - - file: LICENSE.md - IyBWaXRlIGNvcmUgbGljZW5zZQpWaXRlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKCk1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTktcHJlc2VudCwgVm9pZFplcm8gSW5jLiBhbmQgVml0ZSBjb250cmlidXRvcnMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgojIExpY2Vuc2VzIG9mIGJ1bmRsZWQgZGVwZW5kZW5jaWVzClRoZSBwdWJsaXNoZWQgVml0ZSBhcnRpZmFjdCBhZGRpdGlvbmFsbHkgY29udGFpbnMgY29kZSB3aXRoIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CkJTRC0yLUNsYXVzZSwgQ0MwLTEuMCwgSVNDLCBNSVQKCiMgQnVuZGxlZCBkZXBlbmRlbmNpZXM6CiMjIEBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nLCBAanJpZGdld2VsbC9yZW1hcHBpbmcsIEBqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYywgQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZwpMaWNlbnNlOiBNSVQKQnk6IEp1c3RpbiBSaWRnZXdlbGwKUmVwb3NpdG9yaWVzOiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvc291cmNlbWFwcy5naXQsIGdpdCtodHRwczovL2dpdGh1Yi5jb20vanJpZGdld2VsbC9zb3VyY2VtYXBzLmdpdCwgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3NvdXJjZW1hcHMuZ2l0LCBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvc291cmNlbWFwcy5naXQKCj4gQ29weXJpZ2h0IDIwMjQgSnVzdGluIFJpZGdld2VsbCA8anVzdGluQHJpZGdld2VsbC5uYW1lPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQGpyaWRnZXdlbGwvcmVzb2x2ZS11cmkKTGljZW5zZTogTUlUCkJ5OiBKdXN0aW4gUmlkZ2V3ZWxsClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3Jlc29sdmUtdXJpCgo+IENvcHlyaWdodCAyMDE5IEp1c3RpbiBSaWRnZXdlbGwgPGpyaWRnZXdlbGxAZ29vZ2xlLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBwb2xrYS9jb21wcmVzc2lvbgpMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogbHVrZWVkL3BvbGthCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBwb2xrYS91cmwKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL3BvbGthCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEByb2xsZG93bi9wbHVnaW51dGlscwpMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9yb2xsZG93bi9yb2xsZG93bi5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjQtcHJlc2VudCBWb2lkWmVybyBJbmMuICYgQ29udHJpYnV0b3JzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgo+IAo+IGVuZCBvZiB0ZXJtcyBhbmQgY29uZGl0aW9ucwo+IAo+IFRoZSBsaWNlbnNlcyBvZiBleHRlcm5hbGx5IG1haW50YWluZWQgbGlicmFyaWVzIGZyb20gd2hpY2ggcGFydHMgb2YgdGhlIFNvZnR3YXJlIGlzIGRlcml2ZWQgYXJlIGxpc3RlZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL3JvbGxkb3duL3JvbGxkb3duL2Jsb2IvbWFpbi9USElSRC1QQVJUWS1MSUNFTlNFKS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQHJvbGx1cC9wbHVnaW4tYWxpYXMsIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzLCBAcm9sbHVwL3BsdWdpbi1keW5hbWljLWltcG9ydC12YXJzLCBAcm9sbHVwL3BsdWdpbnV0aWxzCkxpY2Vuc2U6IE1JVApCeTogSm9oYW5uZXMgU3RlaW4KUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogTGFyc0RlbkJha2tlcgpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgUm9sbHVwSlMgUGx1Z2luIENvbnRyaWJ1dG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL2dyYXBocy9jb250cmlidXRvcnMpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBhbnltYXRjaApMaWNlbnNlOiBJU0MKQnk6IEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXRjaC9hbnltYXRjaAoKPiBUaGUgSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgRWxhbiBTaGFua2VyLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGFydGljaG9raWUKTGljZW5zZTogTUlUCkJ5OiBzYXBwaGktcmVkLCBFdmFuIFlvdQpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3NhcHBoaS1yZWQvYXJ0aWNob2tpZS5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAtcHJlc2VudCwgWXV4aSAoRXZhbikgWW91Cj4gQ29weXJpZ2h0IChjKSAyMDIzLXByZXNlbnQsIHNhcHBoaS1yZWQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGJpbmFyeS1leHRlbnNpb25zCkxpY2Vuc2U6IE1JVApCeTogU2luZHJlIFNvcmh1cwpSZXBvc2l0b3J5OiBzaW5kcmVzb3JodXMvYmluYXJ5LWV4dGVuc2lvbnMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gQ29weXJpZ2h0IChjKSBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgYnJhY2VzLCBmaWxsLXJhbmdlLCBpcy1udW1iZXIKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIEVsYW4gU2hhbmtlciwgRXVnZW5lIFNoYXJ5Z2luLCBoZW1hbnRoLmhtClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvYnJhY2VzCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBFZG8gUml2YWksIFBhdWwgTWlsbGVyLCBSb3V2ZW4gV2XDn2xpbmcKUmVwb3NpdG9yeTogam9uc2NobGlua2VydC9maWxsLXJhbmdlCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBPbHN0ZW4gTGFyY2ssIFJvdXZlbiBXZcOfbGluZwpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L2lzLW51bWJlcgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBidW5kbGUtbmFtZSwgZGVmYXVsdC1icm93c2VyLCBkZWZhdWx0LWJyb3dzZXItaWQsIGRlZmluZS1sYXp5LXByb3AsIGlzLWRvY2tlciwgaXMtaW5zaWRlLWNvbnRhaW5lciwgaXMtd3NsLCBvcGVuLCBydW4tYXBwbGVzY3JpcHQsIHdzbC11dGlscwpMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvYnVuZGxlLW5hbWUsIHNpbmRyZXNvcmh1cy9kZWZhdWx0LWJyb3dzZXIsIHNpbmRyZXNvcmh1cy9kZWZhdWx0LWJyb3dzZXItaWQsIHNpbmRyZXNvcmh1cy9kZWZpbmUtbGF6eS1wcm9wLCBzaW5kcmVzb3JodXMvaXMtZG9ja2VyLCBzaW5kcmVzb3JodXMvaXMtaW5zaWRlLWNvbnRhaW5lciwgc2luZHJlc29yaHVzL2lzLXdzbCwgc2luZHJlc29yaHVzL29wZW4sIHNpbmRyZXNvcmh1cy9ydW4tYXBwbGVzY3JpcHQsIHNpbmRyZXNvcmh1cy93c2wtdXRpbHMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjYWMKTGljZW5zZTogTUlUCkJ5OiBlZ29pc3QKUmVwb3NpdG9yeTogZWdvaXN0L2NhYwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEVHT0lTVCA8MHgxNDI4NTdAZ21haWwuY29tPiAoaHR0cHM6Ly9naXRodWIuY29tL2Vnb2lzdCkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNob2tpZGFyCkxpY2Vuc2U6IE1JVApCeTogUGF1bCBNaWxsZXIsIEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9jaG9raWRhci5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgUGF1bCBNaWxsZXIgKGh0dHBzOi8vcGF1bG1pbGxyLmNvbSksIEVsYW4gU2hhbmtlcgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg4oCcQVMgSVPigJ0sIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb21tb25kaXIsIHNoZWxsLXF1b3RlCkxpY2Vuc2U6IE1JVApCeTogSmFtZXMgSGFsbGlkYXkKUmVwb3NpdG9yaWVzOiBodHRwOi8vZ2l0aHViLmNvbS9zdWJzdGFjay9ub2RlLWNvbW1vbmRpci5naXQsIGh0dHA6Ly9naXRodWIuY29tL2xqaGFyYi9zaGVsbC1xdW90ZS5naXQKCj4gVGhlIE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEphbWVzIEhhbGxpZGF5IChtYWlsQHN1YnN0YWNrLm5ldCkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgCj4gdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIAo+IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byAKPiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIAo+IG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSAKPiB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCAKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAKPiBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiAKPiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNvbm5lY3QKTGljZW5zZTogTUlUCkJ5OiBUSiBIb2xvd2F5Y2h1aywgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24sIEpvbmF0aGFuIE9uZywgVGltIENhc3dlbGwKUmVwb3NpdG9yeTogc2VuY2hhbGFicy9jb25uZWN0Cgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEwIFNlbmNoYSBJbmMuCj4gQ29weXJpZ2h0IChjKSAyMDExIExlYXJuQm9vc3QKPiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUSiBIb2xvd2F5Y2h1awo+IENvcHlyaWdodCAoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb252ZXJ0LXNvdXJjZS1tYXAKTGljZW5zZTogTUlUCkJ5OiBUaG9yc3RlbiBMb3JlbnoKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS90aGxvcmVuei9jb252ZXJ0LXNvdXJjZS1tYXAuZ2l0Cgo+IENvcHlyaWdodCAyMDEzIFRob3JzdGVuIExvcmVuei4gCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNvcnMKTGljZW5zZTogTUlUCkJ5OiBUcm95IEdvb2RlClJlcG9zaXRvcnk6IGV4cHJlc3Nqcy9jb3JzCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIFRyb3kgR29vZGUgPHRyb3lnb29kZUBnbWFpbC5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNyb3NzLXNwYXduCkxpY2Vuc2U6IE1JVApCeTogQW5kcsOpIENydXoKUmVwb3NpdG9yeTogZ2l0QGdpdGh1Yi5jb206bW94eXN0dWRpby9ub2RlLWNyb3NzLXNwYXduLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTggTWFkZSBXaXRoIE1PWFkgTGRhIDxoZWxsb0Btb3h5LnN0dWRpbz4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNzc2VzYwpMaWNlbnNlOiBNSVQKQnk6IE1hdGhpYXMgQnluZW5zClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL2Nzc2VzYy5naXQKCj4gQ29weXJpZ2h0IE1hdGhpYXMgQnluZW5zIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCj4gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgo+IE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgo+IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkZWJ1ZwpMaWNlbnNlOiBNSVQKQnk6IEpvc2ggSnVub24sIFRKIEhvbG93YXljaHVrLCBOYXRoYW4gUmFqbGljaCwgQW5kcmV3IFJoeW5lClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vZGVidWctanMvZGVidWcuZ2l0Cgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT4KPiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMSBKb3NoIEp1bm9uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCj4gYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAo+IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCj4gcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UCj4gTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkb3RlbnYKTGljZW5zZTogQlNELTItQ2xhdXNlClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vbW90ZG90bGEvZG90ZW52LmdpdAoKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNjb3R0IE1vdHRlCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKPiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKPiAKPiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwo+ICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCj4gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCj4gICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KPiAKPiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKPiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCj4gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCj4gRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQo+IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCj4gREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKPiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgo+IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCj4gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKPiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkb3RlbnYtZXhwYW5kCkxpY2Vuc2U6IEJTRC0yLUNsYXVzZQpCeTogbW90ZG90bGEKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL21vdGRvdGxhL2RvdGVudi1leHBhbmQKCj4gQ29weXJpZ2h0IChjKSAyMDE2LCBTY290dCBNb3R0ZQo+IEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gCj4gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cj4gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Cj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKPiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgo+IAo+ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAo+ICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgo+ICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCj4gCj4gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCj4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQo+IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQo+IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKPiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAo+IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCj4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKPiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAo+IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCj4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZWUtZmlyc3QKTGljZW5zZTogTUlUCkJ5OiBKb25hdGhhbiBPbmcsIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IGpvbmF0aGFub25nL2VlLWZpcnN0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBKb25hdGhhbiBPbmcgbWVAam9uZ2xlYmVycnkuY29tCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlbmNvZGV1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgpSZXBvc2l0b3J5OiBwaWxsYXJqcy9lbmNvZGV1cmwKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZW50aXRpZXMKTGljZW5zZTogQlNELTItQ2xhdXNlCkJ5OiBGZWxpeCBCb2VobQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2ZiNTUvZW50aXRpZXMuZ2l0Cgo+IENvcHlyaWdodCAoYykgRmVsaXggQsO2aG0KPiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+IAo+IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKPiAKPiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCj4gCj4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgo+IAo+IFRISVMgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMsCj4gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZXMtbW9kdWxlLWxleGVyCkxpY2Vuc2U6IE1JVApCeTogR3V5IEJlZGZvcmQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ndXliZWRmb3JkL2VzLW1vZHVsZS1sZXhlci5naXQKCj4gTUlUIExpY2Vuc2UKPiAtLS0tLS0tLS0tLQo+IAo+IENvcHlyaWdodCAoQykgMjAxOC0yMDIyIEd1eSBCZWRmb3JkCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlc2NhcGUtaHRtbApMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogY29tcG9uZW50L2VzY2FwZS1odG1sCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNodWsKPiBDb3B5cmlnaHQgKGMpIDIwMTUgQW5kcmVhcyBMdWJiZQo+IENvcHlyaWdodCAoYykgMjAxNSBUaWFuY2hlbmcgIlRpbW90aHkiIEd1Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGVzdHJlZS13YWxrZXIKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vUmljaC1IYXJyaXMvZXN0cmVlLXdhbGtlcgoKPiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAgW3RoZXNlIHBlb3BsZV0oaHR0cHM6Ly9naXRodWIuY29tL1JpY2gtSGFycmlzL2VzdHJlZS13YWxrZXIvZ3JhcGhzL2NvbnRyaWJ1dG9ycykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGV0YWcKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgRGF2aWQgQmrDtnJrbHVuZApSZXBvc2l0b3J5OiBqc2h0dHAvZXRhZwoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGZpbmFsaGFuZGxlcgpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHBpbGxhcmpzL2ZpbmFsaGFuZGxlcgoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBmb2xsb3ctcmVkaXJlY3RzCkxpY2Vuc2U6IE1JVApCeTogUnViZW4gVmVyYm9yZ2gsIE9saXZpZXIgTGFsb25kZSwgSmFtZXMgVGFsbWFnZQpSZXBvc2l0b3J5OiBnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vZm9sbG93LXJlZGlyZWN0cy9mb2xsb3ctcmVkaXJlY3RzLmdpdAoKPiBDb3B5cmlnaHQgMjAxNOKAk3ByZXNlbnQgT2xpdmllciBMYWxvbmRlIDxvbGFsb25kZUBnbWFpbC5jb20+LCBKYW1lcyBUYWxtYWdlIDxqYW1lc0B0YWxtYWdlLmlvPiwgUnViZW4gVmVyYm9yZ2gKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKPiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KPiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBnZW5lcmljLW5hbWVzCkxpY2Vuc2U6IE1JVApCeTogQWxleGV5IExpdHZpbm92ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvZ2VuZXJpYy1uYW1lcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1IEFsZXhleSBMaXR2aW5vdgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZ2xvYi1wYXJlbnQKTGljZW5zZTogSVNDCkJ5OiBHdWxwIFRlYW0sIEVsYW4gU2hhbmtlciwgQmxhaW5lIEJ1YmxpdHoKUmVwb3NpdG9yeTogZ3VscGpzL2dsb2ItcGFyZW50Cgo+IFRoZSBJU0MgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgMjAxOSBFbGFuIFNoYW5rZXIKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBob3N0LXZhbGlkYXRpb24tbWlkZGxld2FyZQpMaWNlbnNlOiBNSVQKQnk6IHNhcHBoaS1yZWQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9zYXBwaGktcmVkL2hvc3QtdmFsaWRhdGlvbi1taWRkbGV3YXJlLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyNSBzYXBwaGktcmVkCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBodHRwLXByb3h5LTMKTGljZW5zZTogTUlUCkJ5OiBXaWxsaWFtIFN0ZWluLCBDaGFybGllIFJvYmJpbnMsIEppbWIgRXNzZXIsIGpjcnVnenoKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL3NhZ2VtYXRoaW5jL2h0dHAtcHJveHktMy5naXQKCj4gbm9kZS1odHRwLTMKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNSBXaWxsaWFtIFN0ZWluLCBDaGFybGllIFJvYmJpbnMsIEphcnJldHQgQ3J1Z2VyICYgdGhlIENvbnRyaWJ1dG9ycy4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQo+IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KPiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KPiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaWNzcy11dGlscwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL2ljc3MtdXRpbHMuZ2l0Cgo+IElTQyBMaWNlbnNlIChJU0MpCj4gQ29weXJpZ2h0IDIwMTggR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBpcy1iaW5hcnktcGF0aApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yeTogc2luZHJlc29yaHVzL2lzLWJpbmFyeS1wYXRoCgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE5IFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtZXh0Z2xvYgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0ClJlcG9zaXRvcnk6IGpvbnNjaGxpbmtlcnQvaXMtZXh0Z2xvYgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgSm9uIFNjaGxpbmtlcnQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzLWdsb2IKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIERhbmllbCBQZXJlegpSZXBvc2l0b3J5OiBtaWNyb21hdGNoL2lzLWdsb2IKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0Lgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtcmVmZXJlbmNlCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9SaWNoLUhhcnJpcy9pcy1yZWZlcmVuY2UuZ2l0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzZXhlLCB3aGljaApMaWNlbnNlOiBJU0MKQnk6IElzYWFjIFouIFNjaGx1ZXRlcgpSZXBvc2l0b3JpZXM6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL2lzZXhlLmdpdCwgZ2l0Oi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS13aGljaC5naXQKCj4gVGhlIElTQyBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBJc2FhYyBaLiBTY2hsdWV0ZXIgYW5kIENvbnRyaWJ1dG9ycwo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGpzLXRva2VucwpMaWNlbnNlOiBNSVQKQnk6IFNpbW9uIEx5ZGVsbApSZXBvc2l0b3J5OiBseWRlbGwvanMtdG9rZW5zCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCBTaW1vbiBMeWRlbGwKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxhdW5jaC1lZGl0b3IsIGxhdW5jaC1lZGl0b3ItbWlkZGxld2FyZQpMaWNlbnNlOiBNSVQKQnk6IEV2YW4gWW91ClJlcG9zaXRvcmllczogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS95eXg5OTA4MDMvbGF1bmNoLWVkaXRvci5naXQsIGdpdCtodHRwczovL2dpdGh1Yi5jb20veXl4OTkwODAzL2xhdW5jaC1lZGl0b3IuZ2l0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNy1wcmVzZW50LCBZdXhpIChFdmFuKSBZb3UKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxpbGNvbmZpZwpMaWNlbnNlOiBNSVQKQnk6IGFudG9uazUyClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnRvbms1Mi9saWxjb25maWcKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjIgQW50b24gS2FzdHJpdHNraXkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxvYWRlci11dGlscwpMaWNlbnNlOiBNSVQKQnk6IFRvYmlhcyBLb3BwZXJzIEBzb2tyYQpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay9sb2FkZXItdXRpbHMuZ2l0Cgo+IENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbG9kYXNoLmNhbWVsY2FzZQpMaWNlbnNlOiBNSVQKQnk6IEpvaG4tRGF2aWQgRGFsdG9uLCBCbGFpbmUgQnVibGl0eiwgTWF0aGlhcyBCeW5lbnMKUmVwb3NpdG9yeTogbG9kYXNoL2xvZGFzaAoKPiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz4KPiAKPiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzLCBjb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLAo+IERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9ycyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvPgo+IAo+IFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Cj4gaW5kaXZpZHVhbHMuIEZvciBleGFjdCBjb250cmlidXRpb24gaGlzdG9yeSwgc2VlIHRoZSByZXZpc2lvbiBoaXN0b3J5Cj4gYXZhaWxhYmxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoCj4gCj4gVGhlIGZvbGxvd2luZyBsaWNlbnNlIGFwcGxpZXMgdG8gYWxsIHBhcnRzIG9mIHRoaXMgc29mdHdhcmUgZXhjZXB0IGFzCj4gZG9jdW1lbnRlZCBiZWxvdzoKPiAKPiA9PT09Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAo+IE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKPiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCj4gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCj4gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCj4gCj4gPT09PQo+IAo+IENvcHlyaWdodCBhbmQgcmVsYXRlZCByaWdodHMgZm9yIHNhbXBsZSBjb2RlIGFyZSB3YWl2ZWQgdmlhIENDMC4gU2FtcGxlCj4gY29kZSBpcyBkZWZpbmVkIGFzIGFsbCBzb3VyY2UgY29kZSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBwcm9zZSBvZiB0aGUKPiBkb2N1bWVudGF0aW9uLgo+IAo+IENDMDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLwo+IAo+ID09PT0KPiAKPiBGaWxlcyBsb2NhdGVkIGluIHRoZSBub2RlX21vZHVsZXMgYW5kIHZlbmRvciBkaXJlY3RvcmllcyBhcmUgZXh0ZXJuYWxseQo+IG1haW50YWluZWQgbGlicmFyaWVzIHVzZWQgYnkgdGhpcyBzb2Z0d2FyZSB3aGljaCBoYXZlIHRoZWlyIG93bgo+IGxpY2Vuc2VzOyB3ZSByZWNvbW1lbmQgeW91IHJlYWQgdGhlbSwgYXMgdGhlaXIgdGVybXMgbWF5IGRpZmZlciBmcm9tIHRoZQo+IHRlcm1zIGFib3ZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtYWdpYy1zdHJpbmcKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcmljaC1oYXJyaXMvbWFnaWMtc3RyaW5nLmdpdAoKPiBDb3B5cmlnaHQgMjAxOCBSaWNoIEhhcnJpcwo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbWxseSwgdWZvCkxpY2Vuc2U6IE1JVApSZXBvc2l0b3JpZXM6IHVuanMvbWxseSwgdW5qcy91Zm8KCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFBvb3lhIFBhcnNhIDxwb295YUBwaTAuaW8+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtcm1pbWUKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL21ybWltZQoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAoaHR0cHM6Ly9sdWtlZWQuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbXMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IHZlcmNlbC9tcwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAgVmVyY2VsLCBJbmMuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBub3JtYWxpemUtcGF0aApMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBCbGFpbmUgQnVibGl0egpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L25vcm1hbGl6ZS1wYXRoCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCBKb24gU2NobGlua2VydC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIG9iamVjdC1hc3NpZ24KTGljZW5zZTogTUlUCkJ5OiBTaW5kcmUgU29yaHVzClJlcG9zaXRvcnk6IHNpbmRyZXNvcmh1cy9vYmplY3QtYXNzaWduCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKHNpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBvbi1maW5pc2hlZApMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL29uLWZpbmlzaGVkCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNCBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiA8ZG91Z0Bzb21ldGhpbmdkb3VnLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2U1CkxpY2Vuc2U6IE1JVApCeTogSXZhbiBOaWt1bGluLCBodHRwczovL2dpdGh1Yi5jb20vaW5pa3VsaW4vcGFyc2U1L2dyYXBocy9jb250cmlidXRvcnMKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9pbmlrdWxpbi9wYXJzZTUuZ2l0Cgo+IENvcHlyaWdodCAoYykgMjAxMy0yMDE5IEl2YW4gTmlrdWxpbiAoaWZhYWFuQGdtYWlsLmNvbSwgaHR0cHM6Ly9naXRodWIuY29tL2luaWt1bGluKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2V1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgSm9uYXRoYW4gT25nClJlcG9zaXRvcnk6IHBpbGxhcmpzL3BhcnNldXJsCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwYXRoLWtleSwgc2hlYmFuZy1yZWdleApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvcGF0aC1rZXksIHNpbmRyZXNvcmh1cy9zaGViYW5nLXJlZ2V4Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBlcmlzY29waWMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IFJpY2gtSGFycmlzL3BlcmlzY29waWMKCj4gQ29weXJpZ2h0IChjKSAyMDE5IFJpY2ggSGFycmlzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwaWNvY29sb3JzCkxpY2Vuc2U6IElTQwpCeTogQWxleGV5IFJhc3BvcG92ClJlcG9zaXRvcnk6IGFsZXhleXJhc3BvcG92L3BpY29jb2xvcnMKCj4gSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyNCBPbGVrc2lpIFJhc3BvcG92LCBLb3N0aWFudHluIERlbnlzb3YsIEFudG9uIFZlcmlub3YKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKPiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLWltcG9ydApMaWNlbnNlOiBNSVQKQnk6IE1heGltZSBUaGlyb3VpbgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcG9zdGNzcy9wb3N0Y3NzLWltcG9ydC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IE1heGltZSBUaGlyb3VpbiwgSmFzb24gQ2FtcGJlbGwgJiBLZXZpbiBNw6VydGVuc3Nvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbG9hZC1jb25maWcKTGljZW5zZTogTUlUCkJ5OiBNaWNoYWVsIENpbmlhd2t5LCBSeWFuIER1bmNrZWwsIE1hdGV1c3ogRGVya3MsIERhbHRvbiBTYW50b3MsIFBhdHJpY2sgR2lsZGF5LCBGcmFuw6dvaXMgV291dHMKUmVwb3NpdG9yeTogcG9zdGNzcy9wb3N0Y3NzLWxvYWQtY29uZmlnCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCBNaWNoYWVsIENpbmlhd3NreSA8bWljaGFlbC5jaW5pYXdza3lAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcwpMaWNlbnNlOiBNSVQKQnk6IEFsZXhhbmRlciBNYWR5YW5raW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL3Bvc3Rjc3MtbW9kdWxlcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUtcHJlc2VudCBBbGV4YW5kZXIgTWFkeWFua2luIDxhbGV4YW5kZXJAbWFkeWFua2luLm5hbWU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgo+IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCj4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwo+IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCj4gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAo+IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwo+IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgo+IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgo+IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCj4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cy5naXQKCj4gQ29weXJpZ2h0IDIwMTUgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdApMaWNlbnNlOiBNSVQKQnk6IE1hcmsgRGFsZ2xlaXNoClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9jc3MtbW9kdWxlcy9wb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUgTWFyayBEYWxnbGVpc2ggPG1hcmsuam9obi5kYWxnbGVpc2hAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcy1zY29wZQpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXNjb3BlLmdpdAoKPiBJU0MgTGljZW5zZSAoSVNDKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtdmFsdWVzCkxpY2Vuc2U6IElTQwpCeTogR2xlbiBNYWRkZXJuClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXZhbHVlcy5naXQKCj4gSVNDIExpY2Vuc2UgKElTQykKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdsZW4gTWFkZGVybgo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1zZWxlY3Rvci1wYXJzZXIKTGljZW5zZTogTUlUCkJ5OiBCZW4gQnJpZ2dzLCBDaHJpcyBFcHBzdGVpbgpSZXBvc2l0b3J5OiBwb3N0Y3NzL3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyCgo+IENvcHlyaWdodCAoYykgQmVuIEJyaWdncyA8YmVuZWIuaW5mb0BnbWFpbC5jb20+IChodHRwOi8vYmVuZWIuaW5mbykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtdmFsdWUtcGFyc2VyCkxpY2Vuc2U6IE1JVApCeTogQm9nZGFuIENoYWRraW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL1RyeVNvdW5kL3Bvc3Rjc3MtdmFsdWUtcGFyc2VyLmdpdAoKPiBDb3B5cmlnaHQgKGMpIEJvZ2RhbiBDaGFka2luIDx0cnlzb3VuZEB5YW5kZXgucnU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyByZWFkZGlycApMaWNlbnNlOiBNSVQKQnk6IFRob3JzdGVuIExvcmVueiwgUGF1bCBNaWxsZXIKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvcmVhZGRpcnAuZ2l0Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgVGhvcnN0ZW4gTG9yZW56LCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcmVzb2x2ZS5leHBvcnRzLCB0b3RhbGlzdApMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3JpZXM6IGx1a2VlZC9yZXNvbHZlLmV4cG9ydHMsIGx1a2VlZC90b3RhbGlzdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAobHVrZWVkLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHNoZWJhbmctY29tbWFuZApMaWNlbnNlOiBNSVQKQnk6IEtldmluIE3DpXJ0ZW5zc29uClJlcG9zaXRvcnk6IGtldnZhL3NoZWJhbmctY29tbWFuZAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgS2V2aW4gTcOlcnRlbnNzb24gPGtldmlubWFydGVuc3NvbkBnbWFpbC5jb20+IChnaXRodWIuY29tL2tldnZhKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgc2lydgpMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3J5OiBsdWtlZWQvc2lydgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzdGF0dXNlcwpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL3N0YXR1c2VzCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBKb25hdGhhbiBPbmcgPG1lQGpvbmdsZWJlcnJ5LmNvbT4KPiBDb3B5cmlnaHQgKGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24gPGRvdWdAc29tZXRoaW5nZG91Zy5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzdHJpbmctaGFzaApMaWNlbnNlOiBDQzAtMS4wCkJ5OiBUaGUgRGFyayBTa3kgQ29tcGFueQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2Rhcmtza3lhcHAvc3RyaW5nLWhhc2guZ2l0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHN0cmlwLWxpdGVyYWwKTGljZW5zZTogTUlUCkJ5OiBBbnRob255IEZ1ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vYW50ZnUvc3RyaXAtbGl0ZXJhbC5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjIgQW50aG9ueSBGdSA8aHR0cHM6Ly9naXRodWIuY29tL2FudGZ1Pgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdG8tcmVnZXgtcmFuZ2UKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgUm91dmVuIFdlw59saW5nClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvdG8tcmVnZXgtcmFuZ2UKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0Lgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdHNjb25mY2sKTGljZW5zZTogTUlUCkJ5OiBkb21pbmlrZwpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWtnL3RzY29uZmNrLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyMS1wcmVzZW50IGRvbWluaWtnIGFuZCBbY29udHJpYnV0b3JzXShodHRwczovL2dpdGh1Yi5jb20vZG9taW5pa2cvdHNjb25mY2svZ3JhcGhzL2NvbnRyaWJ1dG9ycykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCj4gCj4gLS0gTGljZW5zZXMgZm9yIDNyZC1wYXJ0eSBjb2RlIGluY2x1ZGVkIGluIHRzY29uZmNrIC0tCj4gCj4gIyBzdHJpcC1ib20gYW5kIHN0cmlwLWpzb24tY29tbWVudHMKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKGh0dHBzOi8vc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHVucGlwZQpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHN0cmVhbS11dGlscy91bnBpcGUKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24gPGRvdWdAc29tZXRoaW5nZG91Zy5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHV0aWwtZGVwcmVjYXRlCkxpY2Vuc2U6IE1JVApCeTogTmF0aGFuIFJhamxpY2gKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9Ub29UYWxsTmF0ZS91dGlsLWRlcHJlY2F0ZS5naXQKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQgTmF0aGFuIFJhamxpY2ggPG5hdGhhbkB0b290YWxsbmF0ZS5uZXQ+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB1dGlscy1tZXJnZQpMaWNlbnNlOiBNSVQKQnk6IEphcmVkIEhhbnNvbgpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2phcmVkaGFuc29uL3V0aWxzLW1lcmdlLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBKYXJlZCBIYW5zb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKPiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCj4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCj4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCj4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KPiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB2YXJ5CkxpY2Vuc2U6IE1JVApCeTogRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KUmVwb3NpdG9yeToganNodHRwL3ZhcnkKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB3cwpMaWNlbnNlOiBNSVQKQnk6IEVpbmFyIE90dG8gU3Rhbmd2aWsKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzLmdpdAoKPiBDb3B5cmlnaHQgKGMpIDIwMTEgRWluYXIgT3R0byBTdGFuZ3ZpayA8ZWluYXJvc0BnbWFpbC5jb20+Cj4gQ29weXJpZ2h0IChjKSAyMDEzIEFybm91dCBLYXplbWllciBhbmQgY29udHJpYnV0b3JzCj4gQ29weXJpZ2h0IChjKSAyMDE2IEx1aWdpIFBpbmNhIGFuZCBjb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKPiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCj4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCj4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCj4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KPiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo= - - - - - - thecodrr - fdir - 6.5.0 - The fastest directory crawler & globbing alternative to glob, fast-glob, & tiny-glob. Crawls 1m files in < 1s - - - MIT - - - pkg:npm/fdir@6.5.0 - - - git+https://github.com/thecodrr/fdir.git - as detected from PackageJson property "repository.url" - - - https://github.com/thecodrr/fdir#readme - as detected from PackageJson property "homepage" - - - https://github.com/thecodrr/fdir/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/react-router-devtools/node_modules/fdir - - - - - file: LICENSE - Q29weXJpZ2h0IDIwMjMgQWJkdWxsYWggQXR0YQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K - - - - - - Jon Schlinkert - picomatch - 4.0.3 - Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. - - - MIT - - - pkg:npm/picomatch@4.0.3 - - - git+https://github.com/micromatch/picomatch.git - as detected from PackageJson property "repository.url" - - - https://github.com/micromatch/picomatch - as detected from PackageJson property "homepage" - - - https://github.com/micromatch/picomatch/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/react-router-devtools/node_modules/picomatch - - - - - file: LICENSE - VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTctcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgo= - - - - - @@ -3875,7 +3925,7 @@ - + Cristian goober 2.1.18 @@ -3901,7 +3951,10 @@ https://registry.npmjs.org/goober/-/goober-2.1.18.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + daf16ab1a0d5213f46cfb37a9002fefa92e9a78d65dcf7c3baeb077239c62df47afa1b99925eb3897fb38150b7671a6a5a1cc7ea9c83746ac278384c22fc1ac7 + @@ -3916,7 +3969,7 @@ - + Tanner Linsley @tanstack router-plugin @@ -3943,10 +3996,14 @@ https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.132.47.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 13f0438166afbfbb744b3a7875a2334a878d8b225a2a73758287dbfd588b6dea601c5414031b81c2a21ffa8fa1603820bc435c16b6276a2d53d373ec4b2b99dd + + true node_modules/@tanstack/router-plugin @@ -3958,11 +4015,35 @@ - + + @tauri-apps + cli-darwin-arm64 + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-darwin-arm64@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 04abbc1d1918574d523136bbaf87cbc7ec2382d44af157a9ee59817470e2a0fe9bf171f7ab62a0b00c8f59f1196992246762d8e12aaa18045a13da2294d7b4a0 + + + + + true + node_modules/@tauri-apps/cli-darwin-arm64 + + + @tauri-apps cli-darwin-x64 2.8.4 Command line interface for building Tauri apps + optional Apache-2.0 OR MIT @@ -3982,15 +4063,226 @@ https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.8.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8a66fd3df49dffb1ba5403bbbf56d0d80dd91f834e09b8462452dc871cdea467177fd34a91fba7d79ec91fd9a4a36f4aeaca80c2e27cf2ab736ca09b5894c7f6 + + true node_modules/@tauri-apps/cli-darwin-x64 - + + @tauri-apps + cli-linux-arm-gnueabihf + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-linux-arm-gnueabihf@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 325db5e549c3765eff7e93ab17508da2fca6fca8ed51b0ae3e0adc678221a940a7859757ba986e77f253dc4f17f7b634dd3678d128f3f2b697608d844f47b1cf + + + + + true + node_modules/@tauri-apps/cli-linux-arm-gnueabihf + + + + @tauri-apps + cli-linux-arm64-gnu + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-linux-arm64-gnu@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + a5b72006933223dd02f370b113944467d383c889669803e49095ed577f7c5f74a0644218cb94c0098aa5cb2bf6cf9c8a803f05f161f8ff67de93bfa31fe65703 + + + + + true + node_modules/@tauri-apps/cli-linux-arm64-gnu + + + + @tauri-apps + cli-linux-arm64-musl + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-linux-arm64-musl@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + cee98579a5355ace40cbcef6153c889bbcfc91fcc41eef0d7089fc33a4f16c9b346bb191576d4a05da56d73363daacbb1f29e7a500aa8c06174d45269bd2403b + + + + + true + node_modules/@tauri-apps/cli-linux-arm64-musl + + + + @tauri-apps + cli-linux-riscv64-gnu + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-linux-riscv64-gnu@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + aa2a9b077673e88c8edb4d5ffb5a23c4b8fae56623f268b12f970e328eb79e583c088cec3f6ddc3d852bc7561a0cfb022eccca668eed56cd78a5cec159ffbf69 + + + + + true + node_modules/@tauri-apps/cli-linux-riscv64-gnu + + + + @tauri-apps + cli-linux-x64-gnu + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-linux-x64-gnu@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 4daa9a0ddf4ecba938e47a2dc77a4e7fea646ecc4b680a6fe2b19df662ee44cd64e984bf6b0f3562bb0caf260f4e1af1ad27042147263481da1ec2e253818c93 + + + + + true + node_modules/@tauri-apps/cli-linux-x64-gnu + + + + @tauri-apps + cli-linux-x64-musl + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-linux-x64-musl@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + a2df524c0c327b337cc3e6c11d9f9ba92408274a8f645973fc0cac7291aa07f2672505431507110e650f144680b6dd94507496ccddc6a13279ca9a8b069d9640 + + + + + true + node_modules/@tauri-apps/cli-linux-x64-musl + + + + @tauri-apps + cli-win32-arm64-msvc + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-win32-arm64-msvc@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + fb6689fe0f747612e238b1520f53db1255d7dd2a0c7693bb1c53c0641fb1a2ddc25a50190f5b51794172ef17b42f9180475e999abc6920333dbfd827e71472ff + + + + + true + node_modules/@tauri-apps/cli-win32-arm64-msvc + + + + @tauri-apps + cli-win32-ia32-msvc + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-win32-ia32-msvc@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + ca3ed60f190bd6df54cebda0b9f4351e5ee1ac7b852933443b26ac71b735d3d128880a82a74b60676232910a8e66664e1d4f3ce14016235a5532a0614bf05f84 + + + + + true + node_modules/@tauri-apps/cli-win32-ia32-msvc + + + + @tauri-apps + cli-win32-x64-msvc + 2.8.4 + excluded + + Apache-2.0 OR MIT + + pkg:npm/%40tauri-apps/cli-win32-x64-msvc@2.8.4 + + + https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.8.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 5eebc60787a105d77b421319f6a6e3ffc89c1846ad0ee04dc726076cb2ac4d887dd2081494f6bf02d6aa702d45a3af651a44e6abd04e2abb356964a2ef10e89c + + + + + true + node_modules/@tauri-apps/cli-win32-x64-msvc + + + TJ Holowaychuk @adobe css-tools @@ -4017,10 +4309,14 @@ https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 125a7e8b0531e6b379f98f312ede7f191a06db4586a03090ff515bfb52e21adbf06c36afb929348e10ff79975c90702ecdc0f371c9e4bfeac48f259f471d7c82 + + true node_modules/@adobe/css-tools @@ -4032,7 +4328,7 @@ - + Jesse Beach aria-query 5.3.0 @@ -4058,10 +4354,14 @@ https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6f43f4b193cab72bbc1e479101f0aad087d44592be4aec0c8d8d545c6054dbbc290224f0400225ab9e886c83becad93f2634b57cc475e1e7b958105f2a2e49e8 + + true node_modules/aria-query @@ -4073,7 +4373,7 @@ - + Mathias Bynens css.escape 1.5.1 @@ -4099,10 +4399,14 @@ https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 61489fb175ee9271e552c9a58326343cace03ceafbfc58c278f7c736dd23c66f37c07662e38543310eff7c63648d8dff8d5d4c0bed429996da1f3ba0c9e46da6 + + true node_modules/css.escape @@ -4114,7 +4418,7 @@ - + Alexey Raspopov picocolors 1.1.1 @@ -4140,7 +4444,10 @@ https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c5c787dac9e1b5be4cf658aa0ec984c39ea57b7efa993664117fe311bfd1c4d1727a036e97b78db250973fd1438ff2dcbb45fc284c8c71e3f69eda5a1eb0c454 + @@ -4155,7 +4462,7 @@ - + Sindre Sorhus redent 3.0.0 @@ -4181,10 +4488,14 @@ https://registry.npmjs.org/redent/-/redent-3.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ead0c0f20f7c59ed337741af55e313f5aac43a74f0f6a334dcbf5c2576828eb8a9d4e3bbeb844304b05fac1e1cc333460e3e4e0398a8ca60bd1a48b381624352 + + true node_modules/redent @@ -4196,7 +4507,7 @@ - + The Babel Team @babel runtime @@ -4223,7 +4534,10 @@ https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 43f37a24d5af22f3e72c3be3944d4e5012cf4071fa9770a5b4212c1c8ba3a78e7341449287c2be8079da117e39c804f59f29e09c8361bd6b7337e35bf43f1101 + @@ -4238,7 +4552,7 @@ - + Kent C. Dodds @testing-library dom @@ -4265,10 +4579,14 @@ https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a383d725089da8997cd9c90569751ea005be5f2b0f2dab98238dc06e48b984005df39de23218ada2873ace73a773381b4d89843fa53aff2d59c8a008b2f30a1a + + true node_modules/@testing-library/dom @@ -4280,7 +4598,7 @@ - + undici-types 6.21.0 A stand-alone types package for Undici @@ -4305,10 +4623,14 @@ https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8b00d9aa0d10006ae0f516afe47e27d0ceb87379a4479f5c27ac10a7eec2e2723482c984c5a79d6982cd3b8e1e4f802d041c236d38863cc96dd8c7744fd1fd25 + + true node_modules/undici-types @@ -4320,7 +4642,7 @@ - + @types prop-types 15.7.15 @@ -4346,7 +4668,10 @@ https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 17a6c4c9a995f632860050449a54277ac44f18e42a4b6f94c22d049b5e717a73b11da7f686fe8bf180959f7acf74f24e8897cf8829cb211cafc156aa318dcc23 + @@ -4361,7 +4686,7 @@ - + Toru Nagashima @eslint-community regexpp @@ -4388,10 +4713,14 @@ https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0826420c9b9db81f4e524164636220a69359322da5050803daacf05e41226b5e9c81eda98a363f6978bde8224caae0cc9f79c97653d5d40e4aac9117c1f2cdcd + + true node_modules/@eslint-community/regexpp @@ -4403,7 +4732,7 @@ - + @typescript-eslint scope-manager 8.46.0 @@ -4429,10 +4758,14 @@ https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9561133daf5719c05eb388ea00c603f5f5b48f89fa86b3ed4c9c160e6b6a8053bfe071788e6747fd0eb08204f0e6a213e535e32b36edec6b195019d6a0edddab + + true node_modules/@typescript-eslint/scope-manager @@ -4444,7 +4777,7 @@ - + @typescript-eslint type-utils 8.46.0 @@ -4470,10 +4803,14 @@ https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 872fa5bd8575959a55b368d168462f8026e56715282623f209e9b06d067e346ba55a4411cb41d13d802879ffc2352cda2edf8c2ef329b59b075c796412295a7a + + true node_modules/@typescript-eslint/type-utils @@ -4485,7 +4822,7 @@ - + @typescript-eslint utils 8.46.0 @@ -4511,10 +4848,14 @@ https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9c3eb21963e3d7188e9b81a4d24ea12d2673d9790d5e1b989b222b396707a0fb808634fd8b96c01bec5b58f80578d47c1cf1c7b6934a758517265fc3df1edfe6 + + true node_modules/@typescript-eslint/utils @@ -4526,7 +4867,7 @@ - + @typescript-eslint visitor-keys 8.46.0 @@ -4552,14 +4893,18 @@ https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 16bbcca402be8536c5cbbbc7e63d7eb4c60731228b13a47396e14996414d283d29f58b144fbe499414a6af9b28dd0473bccc14e7f6c811d78daf19bc76ef25dd + + true node_modules/@typescript-eslint/visitor-keys - + Toru Nagashima eslint-visitor-keys 4.2.1 @@ -4585,10 +4930,14 @@ https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 521764e6c7ea71e7bff47feb08e262918cfaee8d1ad93c3684644f386d98d51d9d83b6eb45ed6e1b4c9a3500c7bbe4cefee40f17fe5e09aa6f612987523b7b25 + + true node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys @@ -4610,7 +4959,7 @@ - + Matt Davies graphemer 1.4.0 @@ -4636,10 +4985,14 @@ https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 12d2b0a0eea4c422fd58ee718a98874d9952cc19bb58b4fadbb4ea0bfb9545dd072a6abc357c9e6e7358c43a018bbc2df1e4d6ad4aca5c2395685abdc759206a + + true node_modules/graphemer @@ -4651,7 +5004,7 @@ - + kael ignore 7.0.5 @@ -4677,10 +5030,14 @@ https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1ece7dc4135f508ba730581601b197e5cabaf3ddc86d68382a7ae36d8c17dedc74ceda2b5604c303a076b317fc7a31c9e30cfc06a194318967ccd05eaf936f1a + + true node_modules/ignore @@ -4692,7 +5049,7 @@ - + Lauri Rooden natural-compare 1.4.0 @@ -4718,15 +5075,19 @@ https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 396343f1e8b756d342f61ed5eb4a9f7f7495a1b1ebf7de824f0831b9b832418129836f7487d2746eec8408d3497b19059b9b0e6a38791b5d7a45803573c64c4b + + true node_modules/natural-compare - + JoshuaKGoldberg ts-api-utils 2.1.0 @@ -4752,10 +5113,14 @@ https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 09481364bd62af0f2edbd6f3ace0ff9c7f398eac9cef80fa4ac84582e8ce200ee8b26d91cfb7581fbeda824c7b1f81413710eaec28dff888da5fff33c055be65 + + true node_modules/ts-api-utils @@ -4767,7 +5132,7 @@ - + @typescript-eslint types 8.46.0 @@ -4793,10 +5158,14 @@ https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6c7186272563484e1d24920ee72c845adfdc1f237081aff35c625b249f1388ed356954442ba8024eedcbfb9c2b91bd456c3910f932a330d7bd47f41040ff7eac + + true node_modules/@typescript-eslint/types @@ -4808,7 +5177,7 @@ - + @typescript-eslint typescript-estree 8.46.0 @@ -4834,14 +5203,18 @@ https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7a40c251f56900a5896d17e6f13d5846b0a8b75285c599f6d6857beafe458f8b6bec42f293ce0e4bea2ebd875c0c0c192fcf56a449048f60ca43eaa0ffffae72 + + true node_modules/@typescript-eslint/typescript-estree - + GitHub Inc. semver 7.7.2 @@ -4867,10 +5240,14 @@ https://registry.npmjs.org/semver/-/semver-7.7.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 445d05c3eacee4031ff4c0326915c8e005745258f994c1ea571c5d4a08956e2c52097a049a65ff8e4d02b89c38fb74aaae860ef55a1487e1dcb898afbed25e98 + + true node_modules/@typescript-eslint/typescript-estree/node_modules/semver @@ -4892,7 +5269,7 @@ - + Josh Junon debug 4.4.3 @@ -4918,7 +5295,10 @@ https://registry.npmjs.org/debug/-/debug-4.4.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 446c305a7c10be455f6af295b76d8518bc3ec5849dcc04709b4aeee83853540dee994e6165cdbc57790ee2cb6062bcab4e52e9baf808f468a28e5b408cd6dca8 + @@ -4933,7 +5313,7 @@ - + The Babel Team @babel core @@ -4960,10 +5340,14 @@ https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d8108e3fb4cdf0cfa05438fbfe1b7786c68efc1fe7e680db880cb2be746534eb3ebb5a3e2563584d0ae6a6e369d7f5aada0705ac8d352405bea5a10a0ccc7f08 + + true node_modules/@babel/core @@ -4975,7 +5359,7 @@ - + The Babel Team @babel plugin-transform-react-jsx-self @@ -5002,10 +5386,14 @@ https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e94ce40acf9e8c6759e661450bf38252bbf4dbc69bd9fa75ce76660998c03812a204ada35c3d4ef813d27d7f17daa8c9ef97d904c4a7427dd1ab69ab0492b69b + + true node_modules/@babel/plugin-transform-react-jsx-self @@ -5017,7 +5405,7 @@ - + The Babel Team @babel plugin-transform-react-jsx-source @@ -5044,10 +5432,14 @@ https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cdbc284ec06bb9378a07d852abbde16baea215e247b9a16451bc2fa84967ca0a0d6e3fe31d1b127a8928c1914ddc267ae08bc4a9c9a69157bcf4e3d773b95d03 + + true node_modules/@babel/plugin-transform-react-jsx-source @@ -5059,7 +5451,7 @@ - + @rolldown pluginutils 1.0.0-beta.27 @@ -5084,10 +5476,14 @@ https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f9dd05e0c28c09b795509c06f7ab90e12800ce764d4aaf7723757ef4d1c0e0ea6fa86f26442a4674a98af25fdd974da1d820831f05b616a8a59d3c837009ea8c + + true node_modules/@rolldown/pluginutils @@ -5099,7 +5495,7 @@ - + @types babel__core 7.20.5 @@ -5125,10 +5521,14 @@ https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + aa8429ad9bf3e70405270303a9eb1e4575afdeba8cbe18296d715f5725a16f1f57e3b3ce200ea2ffe75779f12664aa0080e69375a22035232a30853ad72472cc + + true node_modules/@types/babel__core @@ -5140,7 +5540,7 @@ - + react-refresh 0.17.0 React is a JavaScript library for building user interfaces. @@ -5165,10 +5565,14 @@ https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cfa17b2bd6d5f3911fb1e442a766f3ae9c90d06930d6e2e809e97d5c15563e0fd38d18fde12909cd44c67ce6b86ecee226f056b501b45aaef09c8d2ccb0dc405 + + true node_modules/react-refresh @@ -5180,7 +5584,7 @@ - + Andrey Sitnik browserslist 4.26.3 @@ -5206,10 +5610,14 @@ https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 940514fb4d91141b822903e3fcfe8d82395b0a72c1329e14b604f1eef3477775d220917ceecf5ae6b037687db2c37192f43a990146ceb597420a265e551aadd3 + + true node_modules/browserslist @@ -5221,7 +5629,7 @@ - + Ben Briggs caniuse-lite 1.0.30001748 @@ -5247,10 +5655,14 @@ https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e4fe54800af4f9a066362a6592cd3c24bc3e016fd71bf4aeae58192e00757432df030ec47d11b1230ccf1f175208663f053283a8857224bf3b70237ab34651d3 + + true node_modules/caniuse-lite @@ -5262,7 +5674,7 @@ - + Robert Eisele fraction.js 4.3.7 @@ -5288,10 +5700,14 @@ https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 66c0dfc4ee75c06017444639e5aee56bd2d2716a70bfd47122b60006b96f3850651ff4a13e7aedb177ae5087d728a39589c37143ea3c2536c9be34b833cf727b + + true node_modules/fraction.js @@ -5303,7 +5719,7 @@ - + James Talmage normalize-range 0.1.2 @@ -5329,10 +5745,14 @@ https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6dda24fd7bca208de75299259d5e8fda1c6d30dac26e83a301cc81b909d61213baeb9170ad2351c54f80aa9b32bcee8b80660fb2937e96ee422edc388cf44a34 + + true node_modules/normalize-range @@ -5344,7 +5764,7 @@ - + Bogdan Chadkin postcss-value-parser 4.2.0 @@ -5370,7 +5790,10 @@ https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d4d342b3abaeadf9156de5c6e12f09153f6dd7d9b8e480a789ff3358b779a0f499e74427c0c7caf87de3bf8d3c7788f0ffb06db6fe5ac52e48887a0b69534779 + @@ -5385,7 +5808,7 @@ - + Jordan Harband array-includes 3.1.9 @@ -5411,10 +5834,14 @@ https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1667820807a7cc7d0a1f7f3548f4f91599a203f4e6a6776971a4a185f80437d7825639c506aab7975c6b238db2f3e3cf2c8ea1ca9ce8bb8197c34d161e63c12d + + true node_modules/array-includes @@ -5426,7 +5853,7 @@ - + Jordan Harband array.prototype.findlast 1.2.5 @@ -5452,10 +5879,14 @@ https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 095bdde851e0d59dcf3a904bc4ee84eb3afead228443d2faad91c0698ee52df84ab166140413ae32cd1ef68db8a28a63e87fa0791097d1827e4c92c12b6787c9 + + true node_modules/array.prototype.findlast @@ -5467,7 +5898,7 @@ - + Jordan Harband array.prototype.flatmap 1.3.3 @@ -5493,10 +5924,14 @@ https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 63b5ade7578a252ca2f34845ac909e3c618da3992d242b2516e6e8a89b1b7f9ec208f726e73ced96e3e5738fda0fcb16b0abe5c1ab5ece957853579f93c9298e + + true node_modules/array.prototype.flatmap @@ -5508,7 +5943,7 @@ - + Jordan Harband array.prototype.tosorted 1.1.4 @@ -5534,10 +5969,14 @@ https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a7a171f01edbed984bfe0994b00cb40f5e5686f0dc730de69c635b6698b7a66789771b56b23da311a23863aa28dd78877f3b9280fc0a734e0c62de8a82f0bfc0 + + true node_modules/array.prototype.tosorted @@ -5549,7 +5988,7 @@ - + doctrine 2.1.0 JSDoc parser @@ -5574,10 +6013,14 @@ https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + df999292ee195cad2f7c2b87103030b79e5d8368cd6a31d9d6876f17ef124abf3612c658e109977ee5aca3ca0477ccd185539b48dd7c68cd028d2768057ef323 + + true node_modules/doctrine @@ -5589,7 +6032,7 @@ - + Jordan Harband es-iterator-helpers 1.2.1 @@ -5615,10 +6058,14 @@ https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b839fe144d72ac3cf20b4a42a3deb50762076dd33ccbf00266c283e1d1ba5aaae3579dc10038f06bb0fed5aa26dabb0d55f2f20e053f7a282f949189d3c390e3 + + true node_modules/es-iterator-helpers @@ -5630,7 +6077,7 @@ - + estraverse 5.3.0 ECMAScript JS AST traversal functions @@ -5655,10 +6102,14 @@ https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 30c74046e54443388d4de243f0380caa6870475d41450fdc04ffa92ed61d4939dfdcc20ef1f15e8883446d7dfa65d3657d4ffb03d7f7814c38f41de842cbf004 + + true node_modules/estraverse @@ -5670,7 +6121,7 @@ - + Jordan Harband hasown 2.0.2 @@ -5696,7 +6147,10 @@ https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d21254f5208fbe633320175916a34f5d66ba76a87b59d1f470823dcbe0b24bcac6de72f8f01725adaf4798a8555541f23d6347e58ef10f0001edb7e04a391431 + @@ -5711,7 +6165,7 @@ - + Ethan Cohen jsx-ast-utils 3.3.5 @@ -5737,10 +6191,14 @@ https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 659a30f47048e4ee843e04892d46fc9f634a8265564f00af1c6c05b8994c8ef2c5aa5186ea98e2acf86d76cb1e68b6634a26c3f1e7a0ce6629519c282258f671 + + true node_modules/jsx-ast-utils @@ -5752,7 +6210,7 @@ - + Jordan Harband object.entries 1.1.9 @@ -5778,10 +6236,14 @@ https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f2efe17d7151043d4ed213d48e2a0b8685851d19adead280e3fbd93f272406bd7c975284f6e1eb15a15a522f0c0d14e98b8b9a936828c8f4d23492d75f69361f + + true node_modules/object.entries @@ -5793,7 +6255,7 @@ - + Jordan Harband object.fromentries 2.0.8 @@ -5819,10 +6281,14 @@ https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 93a136d45cf24ac48ae5adb529100305dfcd1a77917a014ee692c77dd40ba510c44d4349b9e2d7b37582cf2437b454436206eadca1c65df4db8b66ecf1643aad + + true node_modules/object.fromentries @@ -5834,7 +6300,7 @@ - + Jordan Harband object.values 1.2.1 @@ -5860,10 +6326,14 @@ https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8176a1e9a66b714c635a0db3476330a2e3f6787942073755e29ca0b9d7a168a5d2196e2fd80b114142be970c178628ba28565cba7127992528629e425e26f1b4 + + true node_modules/object.values @@ -5875,7 +6345,7 @@ - + prop-types 15.8.1 Runtime type checking for React props and similar objects. @@ -5900,14 +6370,17 @@ https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a23f3b0a064809dba5528868815011ec08e50b4df6ed4e1e9782fa780bcea827ae74c0d553435384d695f9bf437f87578123f58173139cf7617deff6a831f972 + node_modules/prop-types - + react-is 16.13.1 Brand checking of React Elements. @@ -5932,7 +6405,10 @@ https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + db87baca71361fe38ab7892ab0ebcd77c901a55eb9ce8c5b038055b04381dc0455590922fc31f3694a02e4ab8e37f06271c0da0824d906e39c7d9b3bd2447c6d + @@ -5957,7 +6433,7 @@ - + James Halliday resolve 2.0.0-next.5 @@ -5983,10 +6459,14 @@ https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 53b5a31951bdb07f2dbe35b94a619b42eba2ef9162ca3017ef61d7d790f0041c05f5d362419450020f679cf858cbe4d49c4d3e55caedb6ebcd23ca12c5972870 + + true node_modules/resolve @@ -5998,7 +6478,7 @@ - + GitHub Inc. semver 6.3.1 @@ -6024,10 +6504,14 @@ https://registry.npmjs.org/semver/-/semver-6.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 051ed5bc30951cefaadb10445ac9314ba0c9135a919dbec3c7352ba206fbd425a849f89c07162c88019df8a9749a6abf329ac6f7202b464cab4314cee978cccc + + true node_modules/semver @@ -6039,7 +6523,7 @@ - + Jordan Harband string.prototype.matchall 4.0.12 @@ -6065,10 +6549,14 @@ https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e820bdbb204bfbfe3c7588b345fec7ed501808c08d4c178cefcc7f55351ef5b1446b105ea4f2436b53b0f7d2ea23fd7217b92ecbb437710b1832b72319472c90 + + true node_modules/string.prototype.matchall @@ -6080,7 +6568,7 @@ - + Mathias Bynens string.prototype.repeat 1.0.0 @@ -6106,10 +6594,14 @@ https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d2efd395d0db283f1b14243fe1fe7e98d46b5f067c860db0ed947cc1ad7a7bccfd5e978f5a5dde1847140f4397a441ff5491ffd86de08d4b51dd93a205ed92ff + + true node_modules/string.prototype.repeat @@ -6121,7 +6613,7 @@ - + Toru Nagashima @eslint-community eslint-utils @@ -6148,10 +6640,14 @@ https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6b25451ddb59fa1b2ad6dd83cb6e300a619719ee2af46bb7b2684b6002c9aebe3bdd91f6eccb2748bf8b2949629a9e01589a8c0cc2e63e9c7f43d47738094be2 + + true node_modules/@eslint-community/eslint-utils @@ -6163,7 +6659,7 @@ - + Nicholas C. Zakas @eslint config-array @@ -6190,14 +6686,18 @@ https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 10d21d73888bbb477ddc77988abbca9abcec873a1f3f0e9591944a4067bd36fe3a667594cdc175c55d3575cbc483fd705d447ad4e9a69527f27b23bb12f8cbc5 + + true node_modules/@eslint/config-array - + Isaac Z. Schlueter minimatch 3.1.2 @@ -6223,10 +6723,14 @@ https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 27ba7ade1462023c35343130c355bb8b7efe07222b3963b95d0400cd9dd539c2f43cdc9bc297e657f374e73140cf043d512c84717eaddd43be2b96aa0503881f + + true node_modules/@eslint/config-array/node_modules/minimatch @@ -6238,7 +6742,7 @@ - + Julian Gruber brace-expansion 1.1.12 @@ -6264,10 +6768,14 @@ https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f53f548d6debd145b973543b193c25969b57c21bd8984cc587331f67d1fb1505adfae65e3e364f8c13ff5b5644c99d6dc065a89b9ff9e9317894f72a8e70c772 + + true node_modules/@eslint/config-array/node_modules/brace-expansion @@ -6289,7 +6797,7 @@ - + @eslint config-helpers 0.4.0 @@ -6315,10 +6823,14 @@ https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 59416f5785a82305bc06fd0a78a08820481d4a214eb2e972374c6b32efbbcf8deafe190e2d78ef6f9bbb502f630f1bd1cdcadb126b99057e72259cf5ef8d63a2 + + true node_modules/@eslint/config-helpers @@ -6330,7 +6842,7 @@ - + Nicholas C. Zakas @eslint core @@ -6357,10 +6869,14 @@ https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9e60bcfeda2dc286c8885706903cdadc620a7c0c35fa12e2615ae1dc8d67228990f0f12be5cc60df88e792619ac2e97f7a9e76c0644073278308db562923a3e1 + + true node_modules/@eslint/core @@ -6372,7 +6888,7 @@ - + Nicholas C. Zakas @eslint eslintrc @@ -6399,14 +6915,18 @@ https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 82d175f3a097848975a78a49346670f1873a465b21a1e3d1bc4d17f75a0f19bdef67ca4cdea392f56f4d18f6adf4bce268157b5eb2561b294d41790672733721 + + true node_modules/@eslint/eslintrc - + kael ignore 5.3.2 @@ -6432,10 +6952,14 @@ https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 86c053354a904c3c245ad71d608da2d3a63f9d4044b0d10324a8d676280bbde832f240ee2404bcb91969924710a721172f467fa630f2e4706632344227682afa + + true node_modules/@eslint/eslintrc/node_modules/ignore @@ -6447,7 +6971,7 @@ - + Isaac Z. Schlueter minimatch 3.1.2 @@ -6473,10 +6997,14 @@ https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 27ba7ade1462023c35343130c355bb8b7efe07222b3963b95d0400cd9dd539c2f43cdc9bc297e657f374e73140cf043d512c84717eaddd43be2b96aa0503881f + + true node_modules/@eslint/eslintrc/node_modules/minimatch @@ -6488,7 +7016,7 @@ - + Julian Gruber brace-expansion 1.1.12 @@ -6514,10 +7042,14 @@ https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f53f548d6debd145b973543b193c25969b57c21bd8984cc587331f67d1fb1505adfae65e3e364f8c13ff5b5644c99d6dc065a89b9ff9e9317894f72a8e70c772 + + true node_modules/@eslint/eslintrc/node_modules/brace-expansion @@ -6539,7 +7071,7 @@ - + Nicholas C. Zakas @eslint plugin-kit @@ -6566,10 +7098,14 @@ https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b01e6ec9eabe770096c8f8b7d41da0425565a3e8f96eb3e55b1e32641ac4691a3f9e174313c5e47b582c1a0b6205d6814f1b9391c78b56e56dfe9725adab1bd0 + + true node_modules/@eslint/plugin-kit @@ -6581,7 +7117,7 @@ - + Nicholas C. Zakas @humanfs node @@ -6608,10 +7144,14 @@ https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ff3531fb23ac22b1b8638dc4876a5e0de282c6546dfe0113e9a1df68aa6eab6ebba977580c55625477cc68bcb28193a79749065b114882c072f1016e4cb51711 + + true node_modules/@humanfs/node @@ -6623,7 +7163,7 @@ - + Nicholas C. Zaks @humanwhocodes module-importer @@ -6650,10 +7190,14 @@ https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6f1bde57857cbf961be277054d3deb3d281904ea429237cad32e28555549c08b8354144c0d7acfc9744bf7cf22e5aa7d9bd6e7c8412359f9b95a4066b5f7cb7c + + true node_modules/@humanwhocodes/module-importer @@ -6665,7 +7209,7 @@ - + Nicholas C. Zaks @humanwhocodes retry @@ -6692,10 +7236,14 @@ https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6d5d13828f4ae217cf09e93e68c027f35469a452afdb248341e328499baf4c04b2c0d4e7549080ac2644d855aaa6f21ab4abbb54c44b5a547511acef5610f285 + + true node_modules/@humanwhocodes/retry @@ -6707,7 +7255,7 @@ - + @types estree 1.0.8 @@ -6733,7 +7281,10 @@ https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7561f31dad96a845c8fced44f4e8eba1c313289976992ac4a258752289abbfa53e26e3706875ec5f1f5b2eee601bb05458520dd2c90840943f2f5ac87b1e17eb + @@ -6748,7 +7299,7 @@ - + @types json-schema 7.0.15 @@ -6774,10 +7325,14 @@ https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e7e7cff0ff0c14d0be0326420f1ac1da991914f1b3a90594ce949ebae54bbe6f1531ca2b3586af06aa057312bc6d0cf842c6e7e2850411e9b8c032df732b061c + + true node_modules/@types/json-schema @@ -6789,7 +7344,7 @@ - + Evgeny Poberezkin ajv 6.12.6 @@ -6815,10 +7370,14 @@ https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8f77d52e0bd3a39dbb6a7c98c893864d825b1bebe79d062f1349b99a691cd532be9f1029a6408b3082f4699e1d6e55423681928619be933138654ca4068320e2 + + true node_modules/ajv @@ -6830,7 +7389,7 @@ - + chalk 4.1.2 Terminal string styling done right @@ -6855,10 +7414,14 @@ https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a0a9db845c91217a54b9ecfc881326c846b89db8f820e432ba173fc32f6463bfd654f73020ef5503aebc3eef1190eefed06efa48b44e7b2c3d0a9434eb58b898 + + true node_modules/chalk @@ -6870,7 +7433,7 @@ - + André Cruz cross-spawn 7.0.6 @@ -6896,7 +7459,10 @@ https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b95d903963f69d6ceccb668ca7c69189b862f5d9731791e0879487681f4e893184c834e2249cb1d2ecb9d505ddc966ed00736e6b85c9cd429c6b73b3294777bc + @@ -6911,7 +7477,7 @@ - + Sindre Sorhus escape-string-regexp 4.0.0 @@ -6937,7 +7503,10 @@ https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4eda5c349dd7033c771aaf2c591cc96956a346cd2e57103660091d6f58e6d9890fcf81ba7a05050320379f9bed10865e7cf93959ae145db2ae4b97ca90959d80 + @@ -6952,7 +7521,7 @@ - + eslint-scope 8.4.0 ECMAScript scope analyzer for ESLint @@ -6977,10 +7546,14 @@ https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b0d5ce7ca0a7ef8aedf1120228cbc94bb5ca57f5e4f6403b0f226bf262629374bb0b0832dea964926c92dae401de388983a54d75977fa43049bb49ef1b63654e + + true node_modules/eslint-scope @@ -6992,7 +7565,7 @@ - + Nicholas C. Zakas espree 10.4.0 @@ -7018,14 +7591,18 @@ https://registry.npmjs.org/espree/-/espree-10.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8fa3c0436b94afbf4f6610633f90b97e197c7b7f459919ce8ec0f99469d6ac553c8b61bbefab412bbfa73fc2ae4144d3c80654c1f42a5c082b547e4c6c7f4261 + + true node_modules/espree - + Toru Nagashima eslint-visitor-keys 4.2.1 @@ -7051,10 +7628,14 @@ https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 521764e6c7ea71e7bff47feb08e262918cfaee8d1ad93c3684644f386d98d51d9d83b6eb45ed6e1b4c9a3500c7bbe4cefee40f17fe5e09aa6f612987523b7b25 + + true node_modules/espree/node_modules/eslint-visitor-keys @@ -7076,7 +7657,7 @@ - + Joel Feenstra esquery 1.6.0 @@ -7102,10 +7683,14 @@ https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 71af69c3d7e898570a3ef14b5e104a50af7466f1a26e218ebd124d6e396363bb3bbaaff960ee013b3718b49a84c5dc7df6b17a6807274711e67141dccfab10b2 + + true node_modules/esquery @@ -7117,7 +7702,7 @@ - + esutils 2.0.3 utility box for ECMAScript language tools @@ -7142,10 +7727,14 @@ https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 915b1ca97938382a7af126747648042958baffc8a3df4d0a0564c9ab7d8ffdd61e5934b02b8d56c93c5a94dd5e46603967d514fcb5fd0fb1564a657d480631ea + + true node_modules/esutils @@ -7157,7 +7746,7 @@ - + Evgeny Poberezkin fast-deep-equal 3.1.3 @@ -7183,10 +7772,14 @@ https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7f7a90f68432f63d808417bf1fd542f75c0b98a042094fe00ce9ca340606e61b303bb04b2a3d3d1dce4760dcfd70623efb19690c22200da8ad56cd3701347ce1 + + true node_modules/fast-deep-equal @@ -7198,7 +7791,7 @@ - + Jared Wray file-entry-cache 8.0.0 @@ -7224,10 +7817,14 @@ https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5d74d4c02be2b1ae6869c34644ff527cdb5804d00c8be44fc011666e564417b37bb301d8412ebf65f93b491c31e03e63dc21f6d7560d45ca350c430d55f6429d + + true node_modules/file-entry-cache @@ -7239,7 +7836,7 @@ - + Sindre Sorhus find-up 5.0.0 @@ -7265,10 +7862,14 @@ https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + efcfcf5d3d7094b2c3813cc3b3bb23abd873cf4bd70fece7fbbc32a447b87d74310a6766a9f1ac10f4319a2092408dda8c557dd5b552b2f36dac94625ba9c69e + + true node_modules/find-up @@ -7280,7 +7881,7 @@ - + Jens Taylor imurmurhash 0.1.4 @@ -7306,15 +7907,19 @@ https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2665cc67ac2ebc398b88712697dca4cea3ba97015ba1fd061b822470668435d0910c398c5679f2eece47b0880709b6aad30d8cc8f843aa48535204b62d4d8f1c + + true node_modules/imurmurhash - + Jon Schlinkert is-glob 4.0.3 @@ -7340,7 +7945,10 @@ https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c5e9526b21c7dfa66013b6568658bba56df884d6cd97c3a3bf92959a4243e2105d0f7b61f137e4f6f61ab0b33e99758e6611648197f184b4a7af046be1e9524a + @@ -7355,7 +7963,7 @@ - + jiti 1.21.7 Runtime typescript and ESM support for Node.js @@ -7380,7 +7988,10 @@ https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fe298a346e046d636b563a0d0bfd47e7ff46172fadaa31811c2692b0df8fd919cfaa3b0b9afe940f7123f8a8fc9c159a440c3293b90ae5951cf8e11ab674d1dc + @@ -7395,7 +8006,7 @@ - + James Halliday json-stable-stringify-without-jsonify 1.0.1 @@ -7421,10 +8032,14 @@ https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 05d6e8cbe97bb40dce196e858f21475a43f92ee0728f54e4df72e3caad1ac72cdd93dfff2528b6bb77cfd504a677528dc2ae9538a606940bbcec28ac562afa3f + + true node_modules/json-stable-stringify-without-jsonify @@ -7436,7 +8051,7 @@ - + John-David Dalton lodash.merge 4.6.2 @@ -7462,10 +8077,14 @@ https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d0aa63a97455beb6320ac5f5b3047f5d32b4bdae9542440ce8c368ecfa96efb0728c086801103c11facfd4de3e2a52a3f184b46540ad453fd852e872603ba321 + + true node_modules/lodash.merge @@ -7477,7 +8096,7 @@ - + George Zahariev optionator 0.9.4 @@ -7503,10 +8122,14 @@ https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e88a50ee6294c5171934b20e6d1d21cfb971b1aa5248860d649c173c6785d264d5a862852178f50d070ca13db64b744e70bc98febcf43d669667d6b25a669df6 + + true node_modules/optionator @@ -7518,7 +8141,7 @@ - + cssstyle 4.6.0 CSSStyleDeclaration Object Model implementation @@ -7543,10 +8166,14 @@ https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + db3fab59dcdb6d266febfae1b6fcefa9e6501eb05aaa0a20aadf39b2a14d6da6d93ae15b09515bf243de12d66388a91bae6dfde62ae934a89878578b8909c53e + + true node_modules/cssstyle @@ -7558,7 +8185,7 @@ - + Domenic Denicola data-urls 5.0.0 @@ -7584,10 +8211,14 @@ https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6583f95411ec85a0c08956718db45570526973ee311a04f46cadefcf2d472cdf234cef7be4711bb98cd925c1e84046392b56b4cfc61ac899325444dad3c78d4e + + true node_modules/data-urls @@ -7599,7 +8230,7 @@ - + Michael Mclaughlin decimal.js 10.6.0 @@ -7625,10 +8256,14 @@ https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6298108884d6dc95c69edcdd526c9447557cd761e7f13d58557842bbec0edcea52e1e53d97861d0f7aa3ca229d57a9af576f736a990c783dfdd145447f696452 + + true node_modules/decimal.js @@ -7640,7 +8275,7 @@ - + Domenic Denicola html-encoding-sniffer 4.0.0 @@ -7666,10 +8301,14 @@ https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 636da84ea214e2eb8f8047a67f3ecd0c9cfa39e29fd762ecbbe402facdc156975aeb895388c602c86c20e648b8bc5c6433041d7990e5d9a759a2a520745b9381 + + true node_modules/html-encoding-sniffer @@ -7681,7 +8320,7 @@ - + Nathan Rajlich http-proxy-agent 7.0.2 @@ -7707,10 +8346,14 @@ https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4f58240226180d6631dd5e419b2bbb1dc7dcbcbee652b4d688ceb239f6b73c8a6156227f8053dbbe2750faf7aa48e1dc8bf3f105c0da6de50d0b3a4e3832598a + + true node_modules/http-proxy-agent @@ -7722,7 +8365,7 @@ - + Nathan Rajlich https-proxy-agent 7.0.6 @@ -7748,10 +8391,14 @@ https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + bcaf4fe7f8947dd97de4023e255c94b88715b5de287efb6b3abdc736d336cb10bd6e731b11da77c74d4e8503678dbf082588b7f159531379815f071fbf2c2e4b + + true node_modules/https-proxy-agent @@ -7763,7 +8410,7 @@ - + Mathias Bynens is-potential-custom-element-name 1.0.1 @@ -7789,10 +8436,14 @@ https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6c261e440dab5626ca65dfacdbadb98069c617fb7b0d2a83b3874fec2acb0359bb8ca5b3ea9a6cd0ba582c937c43ae07b663ca27586b3779f33cd28510a39489 + + true node_modules/is-potential-custom-element-name @@ -7804,7 +8455,7 @@ - + Diego Perini nwsapi 2.2.22 @@ -7834,10 +8485,14 @@ https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ba348c7b5396567e797ae4f58a1c0223565c01a014de7c54883c1f0d095d739d595da07d9b60323a7ebf8e1d412dedadfc6f3177ab8a1b550117669925e83649 + + true node_modules/nwsapi @@ -7849,7 +8504,7 @@ - + Ivan Nikulin parse5 7.3.0 @@ -7875,10 +8530,14 @@ https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2089ef53b7da6e5df8aa68bd818f17395c61632332b87db150da5bdaaf3f63eef9e762a57a3911beabc3d7d9cca145bfb901866ea36903a4ee7eee452f905983 + + true node_modules/parse5 @@ -7890,7 +8549,7 @@ - + Nikita Vasilyev rrweb-cssom 0.8.0 @@ -7916,10 +8575,14 @@ https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 82ea25b50131fbd68c7f6803674b3ad84715f25b1747ed30f3dd794c2dc84dd9f662e7ae363740621fe57afa54f6715aa02861f51512e5975032b29f54437db7 + + true node_modules/rrweb-cssom @@ -7931,7 +8594,7 @@ - + Louis-Dominique Dubeau saxes 6.0.0 @@ -7957,15 +8620,19 @@ https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c4083b48e9c486b9b9cc8de9b8e38acb2d4e31c32520965834963bc4b0704b37b452384f2e759f8f6185d84a53d239b368928858a1cbb1a4926a37f7e5b7189c + + true node_modules/saxes - + Joris van der Wel symbol-tree 3.2.4 @@ -7991,10 +8658,14 @@ https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f50364e4ac0317e06fcfe3f239b9264988c8e64b15518b635bb014db6af634a71f2c9717a7dea1903594dfe5e774eb146fe010f5085fcdf093d8ef823564f94f + + true node_modules/symbol-tree @@ -8006,7 +8677,7 @@ - + Jeremy Stashewsky tough-cookie 5.1.2 @@ -8032,10 +8703,14 @@ https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1550d8771b678f41ba426fc384d3d26fc26ee7d50b72ea77b6e2719056f92bc06fda951720b6dfd3165653c3d7f0ebf5f4e5e58db532bde385c11330917ccef8 + + true node_modules/tough-cookie @@ -8047,7 +8722,7 @@ - + w3c-xmlserializer 5.0.0 A per-spec XML serializer implementation @@ -8072,10 +8747,14 @@ https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a3caa086523c3591d4d652cfae98b6f94abb69b8781863e96003656a5cd6c725ad789382b2bfcffa83c1038f5338bbb915364ee1ddc5f4c9d625f88ca3806498 + + true node_modules/w3c-xmlserializer @@ -8087,7 +8766,7 @@ - + Domenic Denicola webidl-conversions 7.0.0 @@ -8113,10 +8792,14 @@ https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 57075d06e903ceeef5a1f7c0411f7be6e9c1206a9f299a4cfbc657eb24a4f27621568a39098699cb3b77601bd8b51b4ef9aa0696ac4f83f07cecd19567f7eeea + + true node_modules/webidl-conversions @@ -8128,7 +8811,7 @@ - + Domenic Denicola whatwg-encoding 3.1.1 @@ -8154,10 +8837,14 @@ https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + eaa37884974cc1f601b44dd80534c78687ae52b0c13d999b41ac5602a4802d5fcc7849d1e73d7177c50ab9dd910241683e4981fa1962d536529f28bce31cf5bd + + true node_modules/whatwg-encoding @@ -8169,7 +8856,7 @@ - + Domenic Denicola whatwg-mimetype 4.0.0 @@ -8195,10 +8882,14 @@ https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 41a2b187478d222da613da76bc47737da80e28709c8f5a49e7a1041c640e571a7cafdfe2b332d4515eeff3dc7d3b5a7f4fe3654cce56ee35baf9ccf816ad5856 + + true node_modules/whatwg-mimetype @@ -8210,7 +8901,7 @@ - + Sebastian Mayr whatwg-url 14.2.0 @@ -8236,10 +8927,14 @@ https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0deef619d419ccd4d40410a1b17b9e4149cf283920ff9039ce9ee9143b90023e5416810da62002534c250afce90069d3923fbe8a1a4ac0ac987b09ff5cd51b2b + + true node_modules/whatwg-url @@ -8251,7 +8946,7 @@ - + Einar Otto Stangvik ws 8.18.3 @@ -8277,10 +8972,14 @@ https://registry.npmjs.org/ws/-/ws-8.18.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3c4206098e6d4a552de7472ac8c5df0b35fea0e3ea374bee1aa5b36dc276c6f9e4ce4ab8ea83a9cfb7506930c175f2026f8375e3e1804540f0d97576378b6fce + + true node_modules/ws @@ -8292,7 +8991,7 @@ - + Domenic Denicola xml-name-validator 5.0.0 @@ -8318,10 +9017,14 @@ https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 12f18af042770e16877db465113396012e693bd31921379ab87289c9bf30c9a8d47d051e9e4220d8cbcb0d36784ff4e021c9b71d4d1314181659ba00677d141e + + true node_modules/xml-name-validator @@ -8333,7 +9036,7 @@ - + Andrey Sitnik nanoid 3.3.11 @@ -8359,7 +9062,10 @@ https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 37c4a97cf527529d5b2be3cc616f2a496765f54fb0c0d588e102b13980f2f4902ba3758c5fba7639e55117dbfedf8ee99da90d7af3e688784d999d876c503beb + @@ -8374,7 +9080,7 @@ - + Valentin 7rulnik Semirulnik source-map-js 1.2.1 @@ -8400,7 +9106,10 @@ https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 51758c2a12cec1529bef6f0852d40f5f17d853ebac7726ed52b2bff2e184f0240cbeb84ea70bf30c1c23d108522fb31073bbc8b084811bc550f3e203431a5f40 + @@ -8415,7 +9124,7 @@ - + Andres Suarez loose-envify 1.4.0 @@ -8441,7 +9150,10 @@ https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 972bb13c6aff59f86b95e9b608bfd472751cd7372a280226043cee918ed8e45ff242235d928ebe7d12debe5c351e03324b0edfeb5d54218e34f04b71452a0add + @@ -8456,7 +9168,7 @@ - + scheduler 0.23.2 Cooperative scheduler for the browser environment. @@ -8481,7 +9193,10 @@ https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 50e4a1b0fc33ecdacc52a851eadd215a315dbaf3b36edbfbb680c7d7f848adf44d2030679c159dd02c094c6bd3a67815966c0609d3fdfd997fb55ac3a9cb98cd + @@ -8496,7 +9211,7 @@ - + @types hast 2.3.10 @@ -8522,7 +9237,10 @@ https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 31c5aca51c3cc71f09f47bab91505f623d312a8136e6d38594719dc78309e7139142b30664da898554166886e6e8eca56b9918397b438a8a7329127310e93027 + @@ -8537,7 +9255,7 @@ - + @types unist 2.0.11 @@ -8563,7 +9281,10 @@ https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0a604a88be8d368fceaa098c9fde4593d5a1969da6b6f22ff8a36940a3761784a3beb11eb2e6d34561984a0f819d664e9e509a493535b0ca6c04ece06d8867b0 + @@ -8578,7 +9299,7 @@ - + Titus Wormer comma-separated-tokens 2.0.3 @@ -8604,7 +9325,10 @@ https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 16ee2125dbf37b29427d03e9f5219689da73accb3bb53ae5bba55bf1719a446724f1048d649269e77f16adbeb42dac787cfc11eb8562638ebc3885136d194666 + @@ -8619,7 +9343,7 @@ - + Titus Wormer hast-util-whitespace 2.0.1 @@ -8645,7 +9369,10 @@ https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9c0c40d2ff3ebd74810eddc09d150d8f2448434ac3fa7b696c0a782e73e4ba673933dc946d231ae170d4f50e9eb58e1fd56a786cd82f735ca3899b6c4d3ad29e + @@ -8660,7 +9387,7 @@ - + Titus Wormer property-information 6.5.0 @@ -8686,7 +9413,10 @@ https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3e04e0b3f065bc7c4ebbc42e10def08b90343a65da05c1e99824937a172ce94baef48903204a35dc7cbb9fcf7c4477eb438f6f282a067966526802b4d67c158a + @@ -8701,7 +9431,7 @@ - + Titus Wormer remark-parse 10.0.2 @@ -8727,7 +9457,10 @@ https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + df27718076bf650cc6f0bbc2ee34d771c01160371195ddd57dc808205b3b6c8eaf6d14b12499b380b10822860acab7e1698fae8ee59a7ff3c988c657a2209783 + @@ -8742,7 +9475,7 @@ - + Titus Wormer remark-rehype 10.1.0 @@ -8768,7 +9501,10 @@ https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 105991e73a69741a74590783559fdbeba096262a41daad952cd14c69bcc348647ae99d9f4228bcdc6e604c16e01849c4100d1046eb2cbeb147c64d4758626c93 + @@ -8783,7 +9519,7 @@ - + Titus Wormer space-separated-tokens 2.0.2 @@ -8809,7 +9545,10 @@ https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3c41a5030ac6f325c65d18d6df67c66e0eba24094e0306ce6eea95a09a6ffe6460a160d07e01f5c033efb735b25123405c119293c87be796036db704cb7487d9 + @@ -8824,7 +9563,7 @@ - + Mark style-to-object 0.4.4 @@ -8850,7 +9589,10 @@ https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1d83681d96b61a8ad8372aa209a060b31bdc2489fb387aba8a71206be13a29ede6e49928aa941b9c5b2c9388f07be2bb02119ad9f7216b8c1239fd4a9f4d5d32 + @@ -8865,7 +9607,7 @@ - + Titus Wormer unified 10.1.2 @@ -8891,7 +9633,10 @@ https://registry.npmjs.org/unified/-/unified-10.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a54496022fd1027572d4f89fda40287963416b7255af1d0c21dd8b0128fc1beec08875a8299353a26aba2c6df6e93ebc53bfdedbadd7e9f4dd717232ed79c5ed + @@ -8906,7 +9651,7 @@ - + Titus Wormer unist-util-visit 4.1.2 @@ -8932,7 +9677,10 @@ https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 31277c3941884aa1dd56f7d8f533e1c8ad95754acf831914b564ae30717a5c0005b8be0ba24b1e8a006766d3e724cbbe15bca74e414d9c59728f1a552ae8cc46 + @@ -8947,7 +9695,7 @@ - + Titus Wormer vfile 5.3.7 @@ -8973,7 +9721,10 @@ https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + afbaa5ce4804aca8e86c09b23489244a98b3b053d88943ee25be69356d5107825c615661b389486d5aa4f173e4d37dc257fd73f2cb39a646b1f12ba11a9706f2 + @@ -8988,7 +9739,7 @@ - + @emotion cache 11.14.0 @@ -9014,7 +9765,10 @@ https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2ff07595cfd3562624e037291b1b4055bc7467288a33992da08c9a7c6907eb383fb63fa603e344fff68f60a1b493c9021d21d526ba4ba5c02538111743749abc + @@ -9029,7 +9783,7 @@ - + Emotion Contributors @emotion react @@ -9055,7 +9809,10 @@ https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3b4d3430b0c10dd93f1288493c552abe7a78aa71de62454fe41d31106d03fcbedc38a3fd91e7eed835e7f1d8fbe1c41fb04cd4aa1facaf547316a88bd68f8fa4 + @@ -9070,7 +9827,7 @@ - + atomiks @floating-ui dom @@ -9097,7 +9854,10 @@ https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 38e7210e087817609c84e5fde1c455aa1bf2edbdc015bfbfad05f2b309b39866a445f90c8285958df9cb5a4462adf2c47ee0f8cac556d7a797cf0b778c723328 + @@ -9112,7 +9872,7 @@ - + @types react-transition-group 4.4.12 @@ -9138,7 +9898,10 @@ https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f1357a4778768fb6bdd5cfb50d77498b74b2a3af73cc865bcfb2e0e6d3913392c4246ed7fc4e9ad55dddad1c81459abbfeeb73ec0f9ce0e8182e22dc6061c6eb + @@ -9153,7 +9916,7 @@ - + Alex Reardon memoize-one 6.0.0 @@ -9179,7 +9942,10 @@ https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ae4a5eef55b43747345f3e900f4789113b960091a727d69fb25d6cae6c0fac8fb20429207b91327175db611caf2f6f7365551640263b2273d10afdc60d7b9937 + @@ -9194,7 +9960,7 @@ - + react-transition-group 4.4.5 A react component toolset for managing animations @@ -9219,7 +9985,10 @@ https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a5971dd4c089a222a2051d8d471782460d77b825dbc9d3e7981e0439e46b63be3cd2a3563bc2088101bace50e49bab9132c5115cfb8aab4196b62339f5ae50ea + @@ -9234,7 +10003,7 @@ - + use-isomorphic-layout-effect 1.2.1 A React helper hook for scheduling a layout effect with a fallback to a regular effect for environments where layout effects should not be used (such as server-side rendering). @@ -9259,7 +10028,10 @@ https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b69659f845f481a8210c0885477ee18f932063a64de7990b88f909b0ac41319e8665d3923c95e23b33ccf7ce283d86790277a1631e56429d7e304f08fcffe944 + @@ -9274,7 +10046,7 @@ - + Sindre Sorhus @alloc quick-lru @@ -9301,7 +10073,10 @@ https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 52b700041fb86d4ac5001c1b96e4c8044ad7c2f6ec53f57b4d959f99b8097db930881bb3892f60c5d383532ba279c7dd190f398e094c5ba8ee4b7fb3e53b0a2f + @@ -9316,7 +10091,7 @@ - + Josh Junon arg 5.0.2 @@ -9342,7 +10117,10 @@ https://registry.npmjs.org/arg/-/arg-5.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3d88f214e2ca43dcb9ec9bd0e902e8f1d02036ab3087c33544c25875076e4fac5b59280adfa3ff67fbfea7cf3ca4cebd8cc31f4bc5ddf05e88d6443f23d1d41a + @@ -9357,7 +10135,7 @@ - + Paul Miller chokidar 3.6.0 @@ -9383,7 +10161,10 @@ https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ed54f5ddf9a3a2d2a91a2a425bd244400bac10f13e122f2797afe0e050409889b418e38b32e6bd3430e8fc35a9d190310abddc3eae59a41aa63c04200dd6b63f + @@ -9398,7 +10179,7 @@ - + Dave Porter didyoumean 1.2.2 @@ -9424,7 +10205,10 @@ https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 831b727ea320ec62b285099bd39e8aeccdf1b33cbf9b21fcc3e078453f905c142cbc039d7375f29aa0c33c7c750603e0b1d000e522227e89daf3d62d4404c3cf + @@ -9439,7 +10223,7 @@ - + Jason Miller dlv 1.1.3 @@ -9465,7 +10249,10 @@ https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f87972b728e53ca9c81bc5ee446f16be604ff31b3c3fbd72f9228a4ba6575a81202ee78fc6d0e8504887ed691d78f5ab439241a44e9aa15a9f65f2544248d7c0 + @@ -9473,7 +10260,7 @@ - + Denis Malinochkin fast-glob 3.3.3 @@ -9499,7 +10286,10 @@ https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ecca6d2fc53472a705773233c0e4c7a22957f71e41acdab27bb67f2ee0bb9023118a8d44312caa44adc1100503eec5d1ab8893e00cd356e65d8604364c2bd82e + @@ -9514,7 +10304,7 @@ - + antonk52 lilconfig 3.1.3 @@ -9540,7 +10330,10 @@ https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fef945280a07e4282ddc87be24b8516f03ac09078f001894ded2757a01afc90fb7dd1fef730336665d9047f2f38ec05e22d3edde84955daa67fa6e27403be9cf + @@ -9555,7 +10348,7 @@ - + Jon Schlinkert micromatch 4.0.8 @@ -9581,7 +10374,10 @@ https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3d7c1f06162ed210423f0f039f413e58361beda7f77522d558a8b71c6bfce08745e13c85a02d32b3115dd06a31c3b9d2bf84ff3f3109431b18b0488508aa3604 + @@ -9596,7 +10392,7 @@ - + Jon Schlinkert normalize-path 3.0.0 @@ -9622,7 +10418,10 @@ https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e9e66ce4bb375ad0a2b075a9f52d86532f1daa4a468b80554b3dc66aa884e9ecee6f4e75d844b3b57530501e82e8829b4246363e76ff983e166288c24707302c + @@ -9637,7 +10436,7 @@ - + Scott Puleo object-hash 3.0.0 @@ -9663,7 +10462,10 @@ https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4529fd17af0f8c7f47aad96db129ea602d575e859ef418eee7edb5dd1f7c70d1adb5a83dabdc80393cdd6ecaaf21aeda366e567df059169598af6696ae495603 + @@ -9678,7 +10480,7 @@ - + Maxime Thirouin postcss-import 15.1.0 @@ -9704,14 +10506,17 @@ https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 869afe274e41d855585005c778ad58c88dbaec9fdd0c384c53a07a722be6f21498d636099c15f1cca0ca0ecc33266b4b1ebcab8e19c38eaaa9ff8f6df0500b7b + node_modules/postcss-import - + James Halliday resolve 1.22.10 @@ -9737,7 +10542,10 @@ https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 34f472fbf9dc20c78395302cbaac0a2227deae26b085e7c526d90d496d2a64912a3046fea81b7fefb07f8c679e7a4f85d2e39e374e420dae875db6c882d557e3 + @@ -9762,7 +10570,7 @@ - + Andrey Sitnik postcss-js 4.1.0 @@ -9788,7 +10596,10 @@ https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a0800e4ea808a3bab610ec1b85bf146a561e3ccbd8a0879163660a9ed7691505cda2c4aedef2eb9e21a0987f4e2acfea0247e88f9a01de57bfee620d5b52c27f + @@ -9803,7 +10614,7 @@ - + Andrey Sitnik postcss-nested 6.2.0 @@ -9829,7 +10640,10 @@ https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1d06eddbc2ae942e402731be719b63f64bca07ddc214274bbe88355852dfd43fb198cbcf1a506cb64a531197cae7e00df617c9a1cc81142362ab24b8f1ba60cd + @@ -9844,7 +10658,7 @@ - + postcss-selector-parser 6.1.2 @@ -9868,7 +10682,10 @@ https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 43ca907cf899f931ceff766b3ab3b470924a7e96026a0b4c5245db9c47e68148f05e0eb3fd605e3b24bd00f0413c24d288357eb384b0406bbcc85b2231122e76 + @@ -9883,7 +10700,7 @@ - + Alan Pierce sucrase 3.35.0 @@ -9909,7 +10726,10 @@ https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f046d50e2bbd88dfe7112c31792c4329ed1dba7b5ad463a51ee7e64925f1303db3dbfb4c6690cca6f5d01ac73e6a31a8f32dae6149a2c5a49151cfd03e843418 + @@ -9924,48 +10744,7 @@ - - JP Richardson - fs-extra - 11.3.2 - fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove. - - - MIT - - - pkg:npm/fs-extra@11.3.2 - - - git+https://github.com/jprichardson/node-fs-extra.git - as detected from PackageJson property "repository.url" - - - https://github.com/jprichardson/node-fs-extra - as detected from PackageJson property "homepage" - - - https://github.com/jprichardson/node-fs-extra/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz - as detected from npm-ls property "resolved" - - - - node_modules/fs-extra - - - - - file: LICENSE - KFRoZSBNSVQgTGljZW5zZSkKCkNvcHlyaWdodCAoYykgMjAxMS0yMDI0IEpQIFJpY2hhcmRzb24KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCih0aGUgJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwKIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFCldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUwpPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCg== - - - - - + Sindre Sorhus p-map 7.0.3 @@ -9991,7 +10770,10 @@ https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5649dd22fd9f201f7db30bd0a00eb96e6f9fb26b7a50d746788074a3106cf9684085d874f10034e095e923badb07daf4f3f9e46f2b0aa326bdaed0c445839830 + @@ -10006,7 +10788,141 @@ - + + Superchupu + tinyglobby + 0.2.15 + A fast and minimal alternative to globby and fast-glob + + + MIT + + + pkg:npm/tinyglobby@0.2.15 + + + git+https://github.com/SuperchupuDev/tinyglobby.git + as detected from PackageJson property "repository.url" + + + https://superchupu.dev/tinyglobby + as detected from PackageJson property "homepage" + + + https://github.com/SuperchupuDev/tinyglobby/issues + as detected from PackageJson property "bugs.url" + + + https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 8f666ae0dc90606e573124f871bb34d8093c88951dc513345c8e50cb15ee64ecca3883665aeae9dec997bb7cb9c03709ae9b70a528e05c7cc8431474a265e58d + + + + + node_modules/tinyglobby + + + + thecodrr + fdir + 6.5.0 + The fastest directory crawler & globbing alternative to glob, fast-glob, & tiny-glob. Crawls 1m files in < 1s + + + MIT + + + pkg:npm/fdir@6.5.0 + + + git+https://github.com/thecodrr/fdir.git + as detected from PackageJson property "repository.url" + + + https://github.com/thecodrr/fdir#readme + as detected from PackageJson property "homepage" + + + https://github.com/thecodrr/fdir/issues + as detected from PackageJson property "bugs.url" + + + https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz + as detected from npm-ls property "resolved" and property "integrity" + + b486d8b596ee70eb340511aa3c992c84951874bf920c7edd54cf208f2f84469dd60148cb105244fb4da46a7c87b708d63a7c2b298062c0098cd29e242c90275e + + + + + node_modules/tinyglobby/node_modules/fdir + + + + + file: LICENSE + Q29weXJpZ2h0IDIwMjMgQWJkdWxsYWggQXR0YQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K + + + + + + Jon Schlinkert + picomatch + 4.0.3 + Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. + + + MIT + + + pkg:npm/picomatch@4.0.3 + + + git+https://github.com/micromatch/picomatch.git + as detected from PackageJson property "repository.url" + + + https://github.com/micromatch/picomatch + as detected from PackageJson property "homepage" + + + https://github.com/micromatch/picomatch/issues + as detected from PackageJson property "bugs.url" + + + https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz + as detected from npm-ls property "resolved" and property "integrity" + + e604e680463fb2a2ba8055cb22c40d1f5f6559be1e6cf0cb03849d2cfeddb169085c75a51baea83ee56f5d21853e9a58673f190d9ab475862b6c77c109551bd5 + + + + + node_modules/tinyglobby/node_modules/picomatch + + + + + file: LICENSE + VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTctcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgo= + + + + + + + + + file: LICENSE + TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyNCBNYWRlbGluZSBHdXJyaWFyw6FuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgo= + + + + + Rich Harris @rollup pluginutils @@ -10033,14 +10949,18 @@ https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e44761199b67bb757cf1c7aceece778617cae4a4804a7259bfc2ee969734e1c58edd11044aba095e0ef70c5b0e9a06d4d81870574136d1bbb620365bdd5296e1 + + true node_modules/@rollup/pluginutils - + Jon Schlinkert picomatch 4.0.3 @@ -10066,10 +10986,14 @@ https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e604e680463fb2a2ba8055cb22c40d1f5f6559be1e6cf0cb03849d2cfeddb169085c75a51baea83ee56f5d21853e9a58673f190d9ab475862b6c77c109551bd5 + + true node_modules/@rollup/pluginutils/node_modules/picomatch @@ -10091,7 +11015,7 @@ - + Greg Bergé @svgr core @@ -10118,14 +11042,18 @@ https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f10aad3904f90025659acbca3893446969913e67288cc3b30b3e07b360461bfb68029fcadfc2dcb0c4722e9df8f6096ae40cc96c211e8a6128c5a5fabff7cbac + + true node_modules/@svgr/core - + Daniel Fischer cosmiconfig 8.3.6 @@ -10151,10 +11079,14 @@ https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 91c67af96e50cdc2773f532dfbcdce52ffe81c5a991c8c7c0eec46e9e6794463044682eaa7806e1a38472d818af8a7f95d5910bea052980cbf9c658ddea0e010 + + true node_modules/@svgr/core/node_modules/cosmiconfig @@ -10176,7 +11108,7 @@ - + Greg Bergé @svgr plugin-jsx @@ -10203,10 +11135,14 @@ https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d31888c81b0b96bf2ab8df96caec68a0d5bd449d03a6bf2e3a71ffc6b0953bc18b51cc07212c23d401b493e2c5ced79390003419b5f4923f6ae8393bd0f4e23c + + true node_modules/@svgr/plugin-jsx @@ -10218,7 +11154,7 @@ - + esbuild 0.25.10 An extremely fast JavaScript and CSS bundler and minifier. @@ -10243,7 +11179,10 @@ https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f518862af0b06aac4eda8c0feb5b90e0180d6e8ac042c90c47a42eb1f5b342abfb0193a0e6819e85d636a5124c4cabb0c5dd480c13f8ad26c8e651f353b48cb1 + @@ -10258,10 +11197,11 @@ - + fsevents 2.3.3 Native Access to MacOS FSEvents + optional MIT @@ -10283,7 +11223,10 @@ https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e71a037d7f9f2fb7da0139da82658fa5b16dc21fd1efb5a630caaa1c64bae42defbc1d181eb805f81d58999df8e35b4c8f99fade4d36d765cda09c339617df43 + @@ -10298,7 +11241,7 @@ - + Rich Harris rollup 4.52.4 @@ -10324,7 +11267,10 @@ https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 08b11597e3273c088a879a65e1d1164b2313a6e7e580d4222c684cbfc7b30f95bfa8ff002af998a4238a45134e87ba112a76ae059e12c9e624312fb5552c8ac1 + @@ -10339,132 +11285,7 @@ - - Superchupu - tinyglobby - 0.2.15 - A fast and minimal alternative to globby and fast-glob - - - MIT - - - pkg:npm/tinyglobby@0.2.15 - - - git+https://github.com/SuperchupuDev/tinyglobby.git - as detected from PackageJson property "repository.url" - - - https://superchupu.dev/tinyglobby - as detected from PackageJson property "homepage" - - - https://github.com/SuperchupuDev/tinyglobby/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz - as detected from npm-ls property "resolved" - - - - node_modules/tinyglobby - - - - thecodrr - fdir - 6.5.0 - The fastest directory crawler & globbing alternative to glob, fast-glob, & tiny-glob. Crawls 1m files in < 1s - - - MIT - - - pkg:npm/fdir@6.5.0 - - - git+https://github.com/thecodrr/fdir.git - as detected from PackageJson property "repository.url" - - - https://github.com/thecodrr/fdir#readme - as detected from PackageJson property "homepage" - - - https://github.com/thecodrr/fdir/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz - as detected from npm-ls property "resolved" - - - - node_modules/tinyglobby/node_modules/fdir - - - - - file: LICENSE - Q29weXJpZ2h0IDIwMjMgQWJkdWxsYWggQXR0YQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K - - - - - - Jon Schlinkert - picomatch - 4.0.3 - Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. - - - MIT - - - pkg:npm/picomatch@4.0.3 - - - git+https://github.com/micromatch/picomatch.git - as detected from PackageJson property "repository.url" - - - https://github.com/micromatch/picomatch - as detected from PackageJson property "homepage" - - - https://github.com/micromatch/picomatch/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz - as detected from npm-ls property "resolved" - - - - node_modules/tinyglobby/node_modules/picomatch - - - - - file: LICENSE - VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTctcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgo= - - - - - - - - - file: LICENSE - TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyNCBNYWRlbGluZSBHdXJyaWFyw6FuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgo= - - - - - + Hiroki Osame tsx 4.20.6 @@ -10490,10 +11311,14 @@ https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cad40abb0826aeb9034c53f82e34744e81369ea832f3ce86a6f452a54d09027add058a69b98e6b2e445460f535c82af26f6e12b0a0532ff8650d0004155c2d66 + + true node_modules/tsx @@ -10505,7 +11330,7 @@ - + @types chai 5.2.2 @@ -10531,10 +11356,14 @@ https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f24077d11ec7c2a7f8d093e22a1573a1d26cd90735649e73b93deecf0e47abf7613429771b797cde37e9748d5edb404fdf8f3e7d5ed520bffe17169792a0665a + + true node_modules/@types/chai @@ -10546,7 +11375,7 @@ - + @types debug 4.1.12 @@ -10572,7 +11401,10 @@ https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + bc80a159d546dcb1b548cc44bc8fc02be15626d865aea953bbb7dbae5cb04e491a38dc24fd40066942d74657fcbe4cc504b566d3390c742aae84be5a3a38573d + @@ -10587,7 +11419,7 @@ - + @vitest expect 3.2.4 @@ -10613,10 +11445,14 @@ https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 228d32c8e46707ab2290596df105b92bbb256383a3a8d5fd8e6250d3640375af25c8ce81e68360556a12a0a3da73cfe4827094cee1d02ab48bb6efee3aaaab8a + + true node_modules/@vitest/expect @@ -10628,7 +11464,7 @@ - + @vitest mocker 3.2.4 @@ -10654,14 +11490,18 @@ https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e3aaf24c4f5164efeb7c377ba44a8597b7adbb2cde93312151b4d6dc1be678efc170230482ae7d04a85e9377570d68008f8a0c2ba3998bebd1af5c0f5baaa311 + + true node_modules/@vitest/mocker - + Rich Harris estree-walker 3.0.3 @@ -10687,10 +11527,14 @@ https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ed150a7d781230c933b7a66e5e6a9aa4ebab2c63cf7e08fa97db9167b9511a896f934cb6ca871cdf92dd731282e4f419767d8332a8a8010d8da1672b4ca9a6ea + + true node_modules/@vitest/mocker/node_modules/estree-walker @@ -10712,7 +11556,7 @@ - + @vitest pretty-format 3.2.4 @@ -10738,10 +11582,14 @@ https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2153598a4f085512514ebf5fc658ad30a78979714514dd09681f4f1cf190f0d2906c6a5f8e54f1f733b845e7cdf20a7b7aa8cdcbc9f22b7359981cce3de231b4 + + true node_modules/@vitest/pretty-format @@ -10753,7 +11601,7 @@ - + @vitest runner 3.2.4 @@ -10779,10 +11627,14 @@ https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a2e91f293f4c938d4bade116d3dbede397fcc31ec3a2b76859464c61d63f732024ef0e535a44d108d65817bb17ee7db007b8f218097be0ec60c213e029aa8331 + + true node_modules/@vitest/runner @@ -10794,7 +11646,7 @@ - + @vitest snapshot 3.2.4 @@ -10820,10 +11672,14 @@ https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 74462d4bba903f60a3536ed0042e6850ec4b13fbf978b906a8f13464a1080c632ce2f2967bb22380b39e6ae1ec4740f962ebb270644ee684915e7c27980efc7d + + true node_modules/@vitest/snapshot @@ -10835,7 +11691,7 @@ - + @vitest spy 3.2.4 @@ -10861,10 +11717,14 @@ https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + bc07dab0239ee8020aef488fe540f5d40738b22354349f62ffd3d9dcd2b1d3bb06eac53179a8352d674dacc59e28a6012e5cee2be1a7eb961de67c8be9db3e9f + + true node_modules/@vitest/spy @@ -10876,7 +11736,7 @@ - + @vitest utils 3.2.4 @@ -10902,10 +11762,14 @@ https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7c1d95d0916b41232c0a8f47892ab7133a5dbf8898697446d52c7c79d5f7330c5fc8d9fcde62a21b339c1fe164c6de0c1f1af7cb8d9f422d68780227aa05f640 + + true node_modules/@vitest/utils @@ -10917,7 +11781,7 @@ - + Jake Luer chai 5.3.3 @@ -10943,10 +11807,14 @@ https://registry.npmjs.org/chai/-/chai-5.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e333617490ff88e8d21f4034e5e6be29ee8c5399a6a5071b42c48e92075a50c27dcd39434c3fc6625c28866204daed206b11d88951c49f5170f6667f92d25683 + + true node_modules/chai @@ -10958,7 +11826,7 @@ - + expect-type 1.2.2 @@ -10982,10 +11850,14 @@ https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2611460d527bb660c922d2a162024218b3968ee2bdbcfc625e85052f02c373df4d9669258a56e2409c2872d66db75dfec4cc3dd4c0a4fd111a9fa3161ea0e3c8 + + true node_modules/expect-type @@ -10997,7 +11869,7 @@ - + Rich Harris magic-string 0.30.19 @@ -11023,10 +11895,14 @@ https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d8ddb5b0f63d5ace773d9bec12956d36e496f927186d0769e1bf6a51a2fef5090752b1852a8e7a2e0f449a0e6cf55feaaed3419a2474d6c62150ec2edc7f953b + + true node_modules/magic-string @@ -11038,7 +11914,7 @@ - + pathe 2.0.3 Universal filesystem path utils @@ -11063,10 +11939,14 @@ https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5948c6700a8fd6041a72841ef8e049b0503b2dde03c97b9422367971cef970b1ef27b76d36c4ee8298712000f0b294be02b68051e3c22ab495b4f2c58ff17cf3 + + true node_modules/pathe @@ -11078,7 +11958,7 @@ - + std-env 3.9.0 Runtime agnostic JS utils @@ -11103,10 +11983,14 @@ https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 506be3ca0afa17ab691fba36ab2a91e90629c2b6888ca49db73c81772cad14e1e63d963dd7b9307702c6d116ce8d63a72a69e6dcf7878daa0b2cc89eee43cb43 + + true node_modules/std-env @@ -11118,7 +12002,7 @@ - + tinybench 2.9.0 @@ -11142,10 +12026,14 @@ https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d3e0d4bea58c55a94b9a16ba96be240fc88030ad47cd5d3f68a9c2b566fdbfdeb8d539cffcc15becf7366f1a314234d7004aebc9756050e7efd98a8d965a867a + + true node_modules/tinybench @@ -11157,7 +12045,7 @@ - + James Garbutt tinyexec 0.3.2 @@ -11183,10 +12071,14 @@ https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 290411f7237b479f8e4b068ad174288f6da9c07a1396062a994b1c3d8a249cea160967e3ff9fc00533118baf45aca5397df3d587941c16292958923f3f5a1c1c + + true node_modules/tinyexec @@ -11198,7 +12090,7 @@ - + tinypool 1.1.1 A minimal and tiny Node.js Worker Thread Pool implementation, a fork of piscina, but with fewer features @@ -11223,10 +12115,14 @@ https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 65b6bcdacf3b205abd03d5e68e25f9b9903f011583ac1d3738796af95c357d276dd08fb8fcabadc32f013f863fcbf68e44ca3ad45434bc86f98f8e2f4a8e4f92 + + true node_modules/tinypool @@ -11238,7 +12134,7 @@ - + tinyrainbow 2.0.0 A small library to print colourful messages. @@ -11263,10 +12159,14 @@ https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a29e27b13478ed1ea9d2f314528625fdafa58cb155b657da5e42d09aa7cb475a8799ad61ff2b189388445d9f3cd1b7f6098813b24bd36bf7b5f7a55de5d0d05f + + true node_modules/tinyrainbow @@ -11278,7 +12178,7 @@ - + Anthony Fu vite-node 3.2.4 @@ -11304,10 +12204,14 @@ https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 11b2922a1f9b875135205c5e3b4a60d67e1dbe8393b7450389731dfea9fefabf7cfa33ced71b498a5bd795d7ae43c822201e489298c280c95e1cc344b061faa6 + + true node_modules/vite-node @@ -11319,7 +12223,7 @@ - + Mathias Buus why-is-node-running 2.3.0 @@ -11345,10 +12249,14 @@ https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 854ae669605d543731bd8aa7ca1d3dcee9cacd13968db65388dcbc741123912ede8440d089b5c9ed7be59ad6f0b9372552223237e0b25d00f8566928f1f366f3 + + true node_modules/why-is-node-running @@ -11360,7 +12268,7 @@ - + @radix-ui react-context 1.1.2 @@ -11385,7 +12293,10 @@ https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8c28bf40a50cdabd49bb96b727ae131f60394a9280821d0ba649f2a9d4389ba0c2574c49d871b5c40451c0d18f41f8b548b74b599d4e273e85e0e30104d88624 + @@ -11393,7 +12304,7 @@ - + @radix-ui react-primitive 2.1.3 @@ -11418,7 +12329,10 @@ https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9bd813c11921cb696f08f7ba409a787771b54d81141e7fc5cc952dabd3231f8e9a9f5c0953e19da060b954ba1ff115fc16dfc3969b21029921b300cb6731c871 + @@ -11433,7 +12347,7 @@ - + @radix-ui react-use-callback-ref 1.1.1 @@ -11458,7 +12372,10 @@ https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 16404cc03faa6c641e32ed5c3879ee181eb1e32ccf8e1a3c6a9e56b5b109dbaba6860a955db85e90a5103be85910bd6f53dd9adf01f0769d0701ca80505e620e + @@ -11466,7 +12383,7 @@ - + @radix-ui react-use-is-hydrated 0.1.0 @@ -11491,7 +12408,10 @@ https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 53e50e45512af9c4e74486a8b2d26ff4019d5771ba63ecdb55dfb5d9ed7c8d0e40ddcd312f4dc88671ee894e1457af70a25390a7919f479f0d5bf12075087038 + @@ -11506,7 +12426,7 @@ - + @radix-ui react-use-layout-effect 1.1.1 @@ -11531,7 +12451,10 @@ https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 45b2514b85164059331d34f057298c4d4bfc12a6213a9f1d38ebe22e3dae82d4e25d1691412ec62c6c594cb2f58d684c7a84827f9ce671992a4e5f488987d771 + @@ -11539,7 +12462,7 @@ - + @radix-ui primitive 1.1.3 @@ -11564,7 +12487,10 @@ https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 25317df54ffa5c88c2068d30aa4539b0ad7482561edbb31146c7f0a22ab9cf338464b1d4dc0dca08c6b95ff6b37a4611089d0797023472b0174bfe5d1074f30e + @@ -11579,7 +12505,7 @@ - + @radix-ui react-compose-refs 1.1.2 @@ -11604,7 +12530,10 @@ https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cf87aa26f7e236714c1c822f5cfdc2639ef2d9626ce60dafdd7d339bd984264ae436fe2b0f1bbeb20f4987c1245f27aa06407b48e71ba28f5d315aa1cab00222 + @@ -11612,7 +12541,7 @@ - + @radix-ui react-presence 1.1.5 @@ -11637,7 +12566,10 @@ https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fe37c4c0d0dd41504236f8e41a2b7887aa4c3b3abc6c7928a6ae39f1d3edda5323c7e781414a2164d1bd03b0ed3bf3b9ba449bc6e68d1973231e2720c32eab41 + @@ -11652,7 +12584,7 @@ - + @radix-ui react-use-controllable-state 1.2.2 @@ -11677,7 +12609,10 @@ https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0636ac5238b13c5752f8d2a4ca9732c8de4f9a0f373a5b2dd3e73abc6a2fd1d8b04c4a3a9a076a551ea1c5c12016e87842b02ced173ef4ab8627d4d50a3d19ce + @@ -11692,7 +12627,7 @@ - + @radix-ui react-use-previous 1.1.1 @@ -11717,7 +12652,10 @@ https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d9d1df4e80a3fe9cdc6b60a4ef6e0e6792f4115aebdde1d136c1bf6f7c5024b036859a55092f7d6cb017fa19b52075c3127cd4e9bcb9cffe4c218efde3f6bc35 + @@ -11725,7 +12663,7 @@ - + @radix-ui react-use-size 1.1.1 @@ -11750,7 +12688,10 @@ https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7b0ad74434c0a805e5925eadfdf91758d021157f48f8290a970eb38c4c24f3a4523cac19af7c69051b28eb9e5aa9869fc2d9dba472e3eada05ce677ac5d569b5 + @@ -11758,7 +12699,7 @@ - + @radix-ui react-dismissable-layer 1.1.11 @@ -11783,7 +12724,10 @@ https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 36a729fade5c4c1f018a71646605e23099e2407d0fb14b76939d455216dd7de2af738002706dae427898ffcfa1d58bfa2b36b843b943ecf415d33d2889c13432 + @@ -11798,7 +12742,7 @@ - + @radix-ui react-focus-guards 1.1.3 @@ -11823,7 +12767,10 @@ https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d2b160fd18f643ad8d0a6eb68d9c34417edadeccfa402414d0ba5974dac95fc6f2446686553a9bad6f630282001f2310aac369799f356204a2cceb79597ab43f + @@ -11838,7 +12785,7 @@ - + @radix-ui react-focus-scope 1.1.7 @@ -11863,7 +12810,10 @@ https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b763839645c14329fb8e497a4cd6b0fccb55115bc819e9490c21b8d4e92afcac14b090704385d566c1c055490ae2606fddec22012dcf1ae516b98d81a0ae1953 + @@ -11878,7 +12828,7 @@ - + @radix-ui react-id 1.1.1 @@ -11903,7 +12853,10 @@ https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9069067a0608750b0e6f85e3b1f33deeb5ec887681c1ca3e84523aea83b8b3d2d4f8f2c00b9a09ee485d395171921b2695ba54a8302f5f0d750a5b973fe8e41e + @@ -11911,7 +12864,7 @@ - + @radix-ui react-portal 1.1.9 @@ -11936,7 +12889,10 @@ https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6e9231bead3789fe943705d9f874caef524b87800fbe75e7b4373a5ce5fc515ab85d039597b970a24d00bc897e6fcce00b0ddf49a55364ca403cf6a05db2a61d + @@ -11951,7 +12907,7 @@ - + Anton Korzunov aria-hidden 1.2.6 @@ -11977,7 +12933,10 @@ https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8a4dd9802f5d63f95855533ef8e212b1a6037a0d6d6f456d3f9b8bde8ba1d64a0639a50c0cfa5b1487a2e099058a659414f9fdd2c6cc34c5d000854e96760a24 + @@ -11992,7 +12951,7 @@ - + Anton Korzunov react-remove-scroll 2.7.1 @@ -12018,7 +12977,10 @@ https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1e9321f3ea1a86621d3ae4b968528a63a3f2a20f8535a655fd7c893aaedbe18170b051dee7261f75b21a948e24def5369d20ea97b62c92652c787b11ac9a883c + @@ -12033,7 +12995,7 @@ - + @radix-ui react-menu 2.1.16 @@ -12058,7 +13020,10 @@ https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ef61764fe3cb96986ba8b700a2d60fa74b8932be528cfe522f4d707c4b2925baeee59b39bd06921dbe1507764c24f8a68071c21c6ee030e78e07d1f71dd9adc6 + @@ -12073,7 +13038,7 @@ - + @radix-ui react-popper 1.2.8 @@ -12098,7 +13063,10 @@ https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d0d250e0b14552e5a413b3b17f486d04a4baccb9248c11fe84cd6e93b360ef4e51791f26fee7a576ecb50c1a343f20573ca567040e9806553de0c0465eb4810b + @@ -12113,7 +13081,7 @@ - + @radix-ui react-direction 1.1.1 @@ -12138,7 +13106,10 @@ https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d54116457ea39ce036cb81f959ccd9e3880e3a34c49a5aafd6e356e0600910ee7e6dab82061bfcb2763ae48c39fd5392fe084a37d82bd8a8e72cac6bb2fa0c57 + @@ -12146,7 +13117,7 @@ - + @radix-ui react-roving-focus 1.1.11 @@ -12171,7 +13142,10 @@ https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ec0e92f634a09bf4beecc76d34349bf8853ce7dbd0a89fd002d71841c7c50ba5bc452e08c4864395d2d1d31a82159e830b2ad02e32cfb31b5335c8798d503894 + @@ -12186,7 +13160,7 @@ - + @radix-ui number 1.1.1 @@ -12211,7 +13185,10 @@ https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 324282c319574e0cfa085a09c77a42c27d3b18aa77ebe699caefeed8b9f656b0390dc7720999004840c14ddf31e708534102f90a261fe29ad728b72041dbf6f6 + @@ -12219,7 +13196,7 @@ - + @radix-ui react-collection 1.1.7 @@ -12244,7 +13221,10 @@ https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 161f6b18dd0ca08e191543727c554d538cbd2d4cfddeef7fd0afb22e00366f04688f133c254d43cafbcc05a6e764f060316444009bd4da38d5ceaf8bac552097 + @@ -12259,7 +13239,7 @@ - + @radix-ui react-visually-hidden 1.2.3 @@ -12284,7 +13264,10 @@ https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a7326ad76b4469a221aa36f3a42baffceca9258fc13dabcea1f9be75b69bf8c1cb6a3cb6efbfb594b9ba245706805e5eb2427a9aab868ab857636183ffcbbc52 + @@ -12299,7 +13282,7 @@ - + use-sync-external-store 1.6.0 Backwards compatible shim for React's useSyncExternalStore. Works with any React that supports hooks. @@ -12324,7 +13307,10 @@ https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3e9e864b018ffcdacf22bc551402243907b2c3c9457a73878a34169144eb0efac5e002eaca53f60bf28291e4bd76950cdcabd84508676b9bedec82fde7e650f7 + @@ -12339,7 +13325,7 @@ - + Tanner Linsley @tanstack router-devtools-core @@ -12366,137 +13352,15 @@ https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.132.47.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c1d62aced1862b95fc6095a11544f0def09d2aa35180aea1bdf7033576c683356ced382d2039d7d6d7c2bcf0f37e03916c4e029c01140cf1d556b59c1a524663 + node_modules/@tanstack/router-devtools-core - - - Evan You - vite - 7.1.9 - Native-ESM powered web dev build tool - - - MIT - - - pkg:npm/vite@7.1.9#packages/vite - - - git+https://github.com/vitejs/vite.git#packages/vite - as detected from PackageJson property "repository.url" and "repository.directory" - - - https://vite.dev - as detected from PackageJson property "homepage" - - - https://github.com/vitejs/vite/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/vite/-/vite-7.1.9.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/router-devtools-core/node_modules/vite - - - - - file: LICENSE.md - IyBWaXRlIGNvcmUgbGljZW5zZQpWaXRlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKCk1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTktcHJlc2VudCwgVm9pZFplcm8gSW5jLiBhbmQgVml0ZSBjb250cmlidXRvcnMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgojIExpY2Vuc2VzIG9mIGJ1bmRsZWQgZGVwZW5kZW5jaWVzClRoZSBwdWJsaXNoZWQgVml0ZSBhcnRpZmFjdCBhZGRpdGlvbmFsbHkgY29udGFpbnMgY29kZSB3aXRoIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CkJTRC0yLUNsYXVzZSwgQ0MwLTEuMCwgSVNDLCBNSVQKCiMgQnVuZGxlZCBkZXBlbmRlbmNpZXM6CiMjIEBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nLCBAanJpZGdld2VsbC9yZW1hcHBpbmcsIEBqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYywgQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZwpMaWNlbnNlOiBNSVQKQnk6IEp1c3RpbiBSaWRnZXdlbGwKUmVwb3NpdG9yaWVzOiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvc291cmNlbWFwcy5naXQsIGdpdCtodHRwczovL2dpdGh1Yi5jb20vanJpZGdld2VsbC9zb3VyY2VtYXBzLmdpdCwgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3NvdXJjZW1hcHMuZ2l0LCBnaXQraHR0cHM6Ly9naXRodWIuY29tL2pyaWRnZXdlbGwvc291cmNlbWFwcy5naXQKCj4gQ29weXJpZ2h0IDIwMjQgSnVzdGluIFJpZGdld2VsbCA8anVzdGluQHJpZGdld2VsbC5uYW1lPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQGpyaWRnZXdlbGwvcmVzb2x2ZS11cmkKTGljZW5zZTogTUlUCkJ5OiBKdXN0aW4gUmlkZ2V3ZWxsClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9qcmlkZ2V3ZWxsL3Jlc29sdmUtdXJpCgo+IENvcHlyaWdodCAyMDE5IEp1c3RpbiBSaWRnZXdlbGwgPGpyaWRnZXdlbGxAZ29vZ2xlLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBwb2xrYS9jb21wcmVzc2lvbgpMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogbHVrZWVkL3BvbGthCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEBwb2xrYS91cmwKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL3BvbGthCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEByb2xsZG93bi9wbHVnaW51dGlscwpMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9yb2xsZG93bi9yb2xsZG93bi5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjQtcHJlc2VudCBWb2lkWmVybyBJbmMuICYgQ29udHJpYnV0b3JzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgo+IAo+IGVuZCBvZiB0ZXJtcyBhbmQgY29uZGl0aW9ucwo+IAo+IFRoZSBsaWNlbnNlcyBvZiBleHRlcm5hbGx5IG1haW50YWluZWQgbGlicmFyaWVzIGZyb20gd2hpY2ggcGFydHMgb2YgdGhlIFNvZnR3YXJlIGlzIGRlcml2ZWQgYXJlIGxpc3RlZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL3JvbGxkb3duL3JvbGxkb3duL2Jsb2IvbWFpbi9USElSRC1QQVJUWS1MSUNFTlNFKS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgQHJvbGx1cC9wbHVnaW4tYWxpYXMsIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzLCBAcm9sbHVwL3BsdWdpbi1keW5hbWljLWltcG9ydC12YXJzLCBAcm9sbHVwL3BsdWdpbnV0aWxzCkxpY2Vuc2U6IE1JVApCeTogSm9oYW5uZXMgU3RlaW4KUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogcm9sbHVwL3BsdWdpbnMKCkxpY2Vuc2U6IE1JVApCeTogTGFyc0RlbkJha2tlcgpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiByb2xsdXAvcGx1Z2lucwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgUm9sbHVwSlMgUGx1Z2luIENvbnRyaWJ1dG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL2dyYXBocy9jb250cmlidXRvcnMpCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBhbnltYXRjaApMaWNlbnNlOiBJU0MKQnk6IEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXRjaC9hbnltYXRjaAoKPiBUaGUgSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTkgRWxhbiBTaGFua2VyLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGFydGljaG9raWUKTGljZW5zZTogTUlUCkJ5OiBzYXBwaGktcmVkLCBFdmFuIFlvdQpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3NhcHBoaS1yZWQvYXJ0aWNob2tpZS5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAtcHJlc2VudCwgWXV4aSAoRXZhbikgWW91Cj4gQ29weXJpZ2h0IChjKSAyMDIzLXByZXNlbnQsIHNhcHBoaS1yZWQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGJpbmFyeS1leHRlbnNpb25zCkxpY2Vuc2U6IE1JVApCeTogU2luZHJlIFNvcmh1cwpSZXBvc2l0b3J5OiBzaW5kcmVzb3JodXMvYmluYXJ5LWV4dGVuc2lvbnMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gQ29weXJpZ2h0IChjKSBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgYnJhY2VzLCBmaWxsLXJhbmdlLCBpcy1udW1iZXIKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIEVsYW4gU2hhbmtlciwgRXVnZW5lIFNoYXJ5Z2luLCBoZW1hbnRoLmhtClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvYnJhY2VzCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBFZG8gUml2YWksIFBhdWwgTWlsbGVyLCBSb3V2ZW4gV2XDn2xpbmcKUmVwb3NpdG9yeTogam9uc2NobGlua2VydC9maWxsLXJhbmdlCgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBPbHN0ZW4gTGFyY2ssIFJvdXZlbiBXZcOfbGluZwpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L2lzLW51bWJlcgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBidW5kbGUtbmFtZSwgZGVmYXVsdC1icm93c2VyLCBkZWZhdWx0LWJyb3dzZXItaWQsIGRlZmluZS1sYXp5LXByb3AsIGlzLWRvY2tlciwgaXMtaW5zaWRlLWNvbnRhaW5lciwgaXMtd3NsLCBvcGVuLCBydW4tYXBwbGVzY3JpcHQsIHdzbC11dGlscwpMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvYnVuZGxlLW5hbWUsIHNpbmRyZXNvcmh1cy9kZWZhdWx0LWJyb3dzZXIsIHNpbmRyZXNvcmh1cy9kZWZhdWx0LWJyb3dzZXItaWQsIHNpbmRyZXNvcmh1cy9kZWZpbmUtbGF6eS1wcm9wLCBzaW5kcmVzb3JodXMvaXMtZG9ja2VyLCBzaW5kcmVzb3JodXMvaXMtaW5zaWRlLWNvbnRhaW5lciwgc2luZHJlc29yaHVzL2lzLXdzbCwgc2luZHJlc29yaHVzL29wZW4sIHNpbmRyZXNvcmh1cy9ydW4tYXBwbGVzY3JpcHQsIHNpbmRyZXNvcmh1cy93c2wtdXRpbHMKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjYWMKTGljZW5zZTogTUlUCkJ5OiBlZ29pc3QKUmVwb3NpdG9yeTogZWdvaXN0L2NhYwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEVHT0lTVCA8MHgxNDI4NTdAZ21haWwuY29tPiAoaHR0cHM6Ly9naXRodWIuY29tL2Vnb2lzdCkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNob2tpZGFyCkxpY2Vuc2U6IE1JVApCeTogUGF1bCBNaWxsZXIsIEVsYW4gU2hhbmtlcgpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9jaG9raWRhci5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgUGF1bCBNaWxsZXIgKGh0dHBzOi8vcGF1bG1pbGxyLmNvbSksIEVsYW4gU2hhbmtlcgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg4oCcQVMgSVPigJ0sIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb21tb25kaXIsIHNoZWxsLXF1b3RlCkxpY2Vuc2U6IE1JVApCeTogSmFtZXMgSGFsbGlkYXkKUmVwb3NpdG9yaWVzOiBodHRwOi8vZ2l0aHViLmNvbS9zdWJzdGFjay9ub2RlLWNvbW1vbmRpci5naXQsIGh0dHA6Ly9naXRodWIuY29tL2xqaGFyYi9zaGVsbC1xdW90ZS5naXQKCj4gVGhlIE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEphbWVzIEhhbGxpZGF5IChtYWlsQHN1YnN0YWNrLm5ldCkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgCj4gdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIAo+IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byAKPiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIAo+IG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSAKPiB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCAKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAKPiBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiAKPiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNvbm5lY3QKTGljZW5zZTogTUlUCkJ5OiBUSiBIb2xvd2F5Y2h1aywgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24sIEpvbmF0aGFuIE9uZywgVGltIENhc3dlbGwKUmVwb3NpdG9yeTogc2VuY2hhbGFicy9jb25uZWN0Cgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEwIFNlbmNoYSBJbmMuCj4gQ29weXJpZ2h0IChjKSAyMDExIExlYXJuQm9vc3QKPiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUSiBIb2xvd2F5Y2h1awo+IENvcHlyaWdodCAoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBjb252ZXJ0LXNvdXJjZS1tYXAKTGljZW5zZTogTUlUCkJ5OiBUaG9yc3RlbiBMb3JlbnoKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS90aGxvcmVuei9jb252ZXJ0LXNvdXJjZS1tYXAuZ2l0Cgo+IENvcHlyaWdodCAyMDEzIFRob3JzdGVuIExvcmVuei4gCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNvcnMKTGljZW5zZTogTUlUCkJ5OiBUcm95IEdvb2RlClJlcG9zaXRvcnk6IGV4cHJlc3Nqcy9jb3JzCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIFRyb3kgR29vZGUgPHRyb3lnb29kZUBnbWFpbC5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNyb3NzLXNwYXduCkxpY2Vuc2U6IE1JVApCeTogQW5kcsOpIENydXoKUmVwb3NpdG9yeTogZ2l0QGdpdGh1Yi5jb206bW94eXN0dWRpby9ub2RlLWNyb3NzLXNwYXduLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTggTWFkZSBXaXRoIE1PWFkgTGRhIDxoZWxsb0Btb3h5LnN0dWRpbz4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGNzc2VzYwpMaWNlbnNlOiBNSVQKQnk6IE1hdGhpYXMgQnluZW5zClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL2Nzc2VzYy5naXQKCj4gQ29weXJpZ2h0IE1hdGhpYXMgQnluZW5zIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCj4gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgo+IE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgo+IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkZWJ1ZwpMaWNlbnNlOiBNSVQKQnk6IEpvc2ggSnVub24sIFRKIEhvbG93YXljaHVrLCBOYXRoYW4gUmFqbGljaCwgQW5kcmV3IFJoeW5lClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vZGVidWctanMvZGVidWcuZ2l0Cgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT4KPiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMSBKb3NoIEp1bm9uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCj4gYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAo+IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCj4gcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UCj4gTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkb3RlbnYKTGljZW5zZTogQlNELTItQ2xhdXNlClJlcG9zaXRvcnk6IGdpdDovL2dpdGh1Yi5jb20vbW90ZG90bGEvZG90ZW52LmdpdAoKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNjb3R0IE1vdHRlCj4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiAKPiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKPiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKPiAKPiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwo+ICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCj4gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCj4gICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KPiAKPiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKPiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCj4gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCj4gRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQo+IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCj4gREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKPiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgo+IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCj4gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKPiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBkb3RlbnYtZXhwYW5kCkxpY2Vuc2U6IEJTRC0yLUNsYXVzZQpCeTogbW90ZG90bGEKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL21vdGRvdGxhL2RvdGVudi1leHBhbmQKCj4gQ29weXJpZ2h0IChjKSAyMDE2LCBTY290dCBNb3R0ZQo+IEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gCj4gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cj4gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Cj4gCj4gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKPiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgo+IAo+ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAo+ICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgo+ICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCj4gCj4gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCj4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQo+IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQo+IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKPiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAo+IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCj4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKPiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAo+IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCj4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZWUtZmlyc3QKTGljZW5zZTogTUlUCkJ5OiBKb25hdGhhbiBPbmcsIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IGpvbmF0aGFub25nL2VlLWZpcnN0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBKb25hdGhhbiBPbmcgbWVAam9uZ2xlYmVycnkuY29tCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlbmNvZGV1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgpSZXBvc2l0b3J5OiBwaWxsYXJqcy9lbmNvZGV1cmwKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZW50aXRpZXMKTGljZW5zZTogQlNELTItQ2xhdXNlCkJ5OiBGZWxpeCBCb2VobQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2ZiNTUvZW50aXRpZXMuZ2l0Cgo+IENvcHlyaWdodCAoYykgRmVsaXggQsO2aG0KPiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+IAo+IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKPiAKPiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCj4gCj4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgo+IAo+IFRISVMgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMsCj4gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZXMtbW9kdWxlLWxleGVyCkxpY2Vuc2U6IE1JVApCeTogR3V5IEJlZGZvcmQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ndXliZWRmb3JkL2VzLW1vZHVsZS1sZXhlci5naXQKCj4gTUlUIExpY2Vuc2UKPiAtLS0tLS0tLS0tLQo+IAo+IENvcHlyaWdodCAoQykgMjAxOC0yMDIyIEd1eSBCZWRmb3JkCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBlc2NhcGUtaHRtbApMaWNlbnNlOiBNSVQKUmVwb3NpdG9yeTogY29tcG9uZW50L2VzY2FwZS1odG1sCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNodWsKPiBDb3B5cmlnaHQgKGMpIDIwMTUgQW5kcmVhcyBMdWJiZQo+IENvcHlyaWdodCAoYykgMjAxNSBUaWFuY2hlbmcgIlRpbW90aHkiIEd1Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGVzdHJlZS13YWxrZXIKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vUmljaC1IYXJyaXMvZXN0cmVlLXdhbGtlcgoKPiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAgW3RoZXNlIHBlb3BsZV0oaHR0cHM6Ly9naXRodWIuY29tL1JpY2gtSGFycmlzL2VzdHJlZS13YWxrZXIvZ3JhcGhzL2NvbnRyaWJ1dG9ycykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGV0YWcKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgRGF2aWQgQmrDtnJrbHVuZApSZXBvc2l0b3J5OiBqc2h0dHAvZXRhZwoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGZpbmFsaGFuZGxlcgpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHBpbGxhcmpzL2ZpbmFsaGFuZGxlcgoKPiAoVGhlIE1JVCBMaWNlbnNlKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBmb2xsb3ctcmVkaXJlY3RzCkxpY2Vuc2U6IE1JVApCeTogUnViZW4gVmVyYm9yZ2gsIE9saXZpZXIgTGFsb25kZSwgSmFtZXMgVGFsbWFnZQpSZXBvc2l0b3J5OiBnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vZm9sbG93LXJlZGlyZWN0cy9mb2xsb3ctcmVkaXJlY3RzLmdpdAoKPiBDb3B5cmlnaHQgMjAxNOKAk3ByZXNlbnQgT2xpdmllciBMYWxvbmRlIDxvbGFsb25kZUBnbWFpbC5jb20+LCBKYW1lcyBUYWxtYWdlIDxqYW1lc0B0YWxtYWdlLmlvPiwgUnViZW4gVmVyYm9yZ2gKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKPiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KPiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBnZW5lcmljLW5hbWVzCkxpY2Vuc2U6IE1JVApCeTogQWxleGV5IExpdHZpbm92ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvZ2VuZXJpYy1uYW1lcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1IEFsZXhleSBMaXR2aW5vdgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgZ2xvYi1wYXJlbnQKTGljZW5zZTogSVNDCkJ5OiBHdWxwIFRlYW0sIEVsYW4gU2hhbmtlciwgQmxhaW5lIEJ1YmxpdHoKUmVwb3NpdG9yeTogZ3VscGpzL2dsb2ItcGFyZW50Cgo+IFRoZSBJU0MgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgMjAxOSBFbGFuIFNoYW5rZXIKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IKPiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBob3N0LXZhbGlkYXRpb24tbWlkZGxld2FyZQpMaWNlbnNlOiBNSVQKQnk6IHNhcHBoaS1yZWQKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9zYXBwaGktcmVkL2hvc3QtdmFsaWRhdGlvbi1taWRkbGV3YXJlLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyNSBzYXBwaGktcmVkCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBodHRwLXByb3h5LTMKTGljZW5zZTogTUlUCkJ5OiBXaWxsaWFtIFN0ZWluLCBDaGFybGllIFJvYmJpbnMsIEppbWIgRXNzZXIsIGpjcnVnenoKUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL3NhZ2VtYXRoaW5jL2h0dHAtcHJveHktMy5naXQKCj4gbm9kZS1odHRwLTMKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNSBXaWxsaWFtIFN0ZWluLCBDaGFybGllIFJvYmJpbnMsIEphcnJldHQgQ3J1Z2VyICYgdGhlIENvbnRyaWJ1dG9ycy4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQo+IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KPiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KPiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaWNzcy11dGlscwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL2ljc3MtdXRpbHMuZ2l0Cgo+IElTQyBMaWNlbnNlIChJU0MpCj4gQ29weXJpZ2h0IDIwMTggR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBpcy1iaW5hcnktcGF0aApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yeTogc2luZHJlc29yaHVzL2lzLWJpbmFyeS1wYXRoCgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE5IFNpbmRyZSBTb3JodXMgPHNpbmRyZXNvcmh1c0BnbWFpbC5jb20+IChodHRwczovL3NpbmRyZXNvcmh1cy5jb20pLCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtZXh0Z2xvYgpMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0ClJlcG9zaXRvcnk6IGpvbnNjaGxpbmtlcnQvaXMtZXh0Z2xvYgoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgSm9uIFNjaGxpbmtlcnQKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzLWdsb2IKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgQnJpYW4gV29vZHdhcmQsIERhbmllbCBQZXJlegpSZXBvc2l0b3J5OiBtaWNyb21hdGNoL2lzLWdsb2IKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0Lgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgaXMtcmVmZXJlbmNlCkxpY2Vuc2U6IE1JVApCeTogUmljaCBIYXJyaXMKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9SaWNoLUhhcnJpcy9pcy1yZWZlcmVuY2UuZ2l0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGlzZXhlLCB3aGljaApMaWNlbnNlOiBJU0MKQnk6IElzYWFjIFouIFNjaGx1ZXRlcgpSZXBvc2l0b3JpZXM6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL2lzZXhlLmdpdCwgZ2l0Oi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS13aGljaC5naXQKCj4gVGhlIElTQyBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBJc2FhYyBaLiBTY2hsdWV0ZXIgYW5kIENvbnRyaWJ1dG9ycwo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQo+IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKPiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwo+IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgo+IEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKPiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgo+IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGpzLXRva2VucwpMaWNlbnNlOiBNSVQKQnk6IFNpbW9uIEx5ZGVsbApSZXBvc2l0b3J5OiBseWRlbGwvanMtdG9rZW5zCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCBTaW1vbiBMeWRlbGwKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxhdW5jaC1lZGl0b3IsIGxhdW5jaC1lZGl0b3ItbWlkZGxld2FyZQpMaWNlbnNlOiBNSVQKQnk6IEV2YW4gWW91ClJlcG9zaXRvcmllczogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS95eXg5OTA4MDMvbGF1bmNoLWVkaXRvci5naXQsIGdpdCtodHRwczovL2dpdGh1Yi5jb20veXl4OTkwODAzL2xhdW5jaC1lZGl0b3IuZ2l0Cgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNy1wcmVzZW50LCBZdXhpIChFdmFuKSBZb3UKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxpbGNvbmZpZwpMaWNlbnNlOiBNSVQKQnk6IGFudG9uazUyClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnRvbms1Mi9saWxjb25maWcKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjIgQW50b24gS2FzdHJpdHNraXkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIGxvYWRlci11dGlscwpMaWNlbnNlOiBNSVQKQnk6IFRvYmlhcyBLb3BwZXJzIEBzb2tyYQpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay9sb2FkZXItdXRpbHMuZ2l0Cgo+IENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbG9kYXNoLmNhbWVsY2FzZQpMaWNlbnNlOiBNSVQKQnk6IEpvaG4tRGF2aWQgRGFsdG9uLCBCbGFpbmUgQnVibGl0eiwgTWF0aGlhcyBCeW5lbnMKUmVwb3NpdG9yeTogbG9kYXNoL2xvZGFzaAoKPiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz4KPiAKPiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzLCBjb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLAo+IERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9ycyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvPgo+IAo+IFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Cj4gaW5kaXZpZHVhbHMuIEZvciBleGFjdCBjb250cmlidXRpb24gaGlzdG9yeSwgc2VlIHRoZSByZXZpc2lvbiBoaXN0b3J5Cj4gYXZhaWxhYmxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoCj4gCj4gVGhlIGZvbGxvd2luZyBsaWNlbnNlIGFwcGxpZXMgdG8gYWxsIHBhcnRzIG9mIHRoaXMgc29mdHdhcmUgZXhjZXB0IGFzCj4gZG9jdW1lbnRlZCBiZWxvdzoKPiAKPiA9PT09Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAo+IE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKPiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCj4gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCj4gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCj4gCj4gPT09PQo+IAo+IENvcHlyaWdodCBhbmQgcmVsYXRlZCByaWdodHMgZm9yIHNhbXBsZSBjb2RlIGFyZSB3YWl2ZWQgdmlhIENDMC4gU2FtcGxlCj4gY29kZSBpcyBkZWZpbmVkIGFzIGFsbCBzb3VyY2UgY29kZSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBwcm9zZSBvZiB0aGUKPiBkb2N1bWVudGF0aW9uLgo+IAo+IENDMDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLwo+IAo+ID09PT0KPiAKPiBGaWxlcyBsb2NhdGVkIGluIHRoZSBub2RlX21vZHVsZXMgYW5kIHZlbmRvciBkaXJlY3RvcmllcyBhcmUgZXh0ZXJuYWxseQo+IG1haW50YWluZWQgbGlicmFyaWVzIHVzZWQgYnkgdGhpcyBzb2Z0d2FyZSB3aGljaCBoYXZlIHRoZWlyIG93bgo+IGxpY2Vuc2VzOyB3ZSByZWNvbW1lbmQgeW91IHJlYWQgdGhlbSwgYXMgdGhlaXIgdGVybXMgbWF5IGRpZmZlciBmcm9tIHRoZQo+IHRlcm1zIGFib3ZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtYWdpYy1zdHJpbmcKTGljZW5zZTogTUlUCkJ5OiBSaWNoIEhhcnJpcwpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcmljaC1oYXJyaXMvbWFnaWMtc3RyaW5nLmdpdAoKPiBDb3B5cmlnaHQgMjAxOCBSaWNoIEhhcnJpcwo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbWxseSwgdWZvCkxpY2Vuc2U6IE1JVApSZXBvc2l0b3JpZXM6IHVuanMvbWxseSwgdW5qcy91Zm8KCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIFBvb3lhIFBhcnNhIDxwb295YUBwaTAuaW8+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBtcm1pbWUKTGljZW5zZTogTUlUCkJ5OiBMdWtlIEVkd2FyZHMKUmVwb3NpdG9yeTogbHVrZWVkL21ybWltZQoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAoaHR0cHM6Ly9sdWtlZWQuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgbXMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IHZlcmNlbC9tcwoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjAgVmVyY2VsLCBJbmMuCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQo+IFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBub3JtYWxpemUtcGF0aApMaWNlbnNlOiBNSVQKQnk6IEpvbiBTY2hsaW5rZXJ0LCBCbGFpbmUgQnVibGl0egpSZXBvc2l0b3J5OiBqb25zY2hsaW5rZXJ0L25vcm1hbGl6ZS1wYXRoCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCBKb24gU2NobGlua2VydC4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIG9iamVjdC1hc3NpZ24KTGljZW5zZTogTUlUCkJ5OiBTaW5kcmUgU29yaHVzClJlcG9zaXRvcnk6IHNpbmRyZXNvcmh1cy9vYmplY3QtYXNzaWduCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKHNpbmRyZXNvcmh1cy5jb20pCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBvbi1maW5pc2hlZApMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL29uLWZpbmlzaGVkCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEzIEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNCBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiA8ZG91Z0Bzb21ldGhpbmdkb3VnLmNvbT4KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKPiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCj4gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAo+IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwo+IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwo+IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KPiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQo+IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCj4gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKPiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2U1CkxpY2Vuc2U6IE1JVApCeTogSXZhbiBOaWt1bGluLCBodHRwczovL2dpdGh1Yi5jb20vaW5pa3VsaW4vcGFyc2U1L2dyYXBocy9jb250cmlidXRvcnMKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9pbmlrdWxpbi9wYXJzZTUuZ2l0Cgo+IENvcHlyaWdodCAoYykgMjAxMy0yMDE5IEl2YW4gTmlrdWxpbiAoaWZhYWFuQGdtYWlsLmNvbSwgaHR0cHM6Ly9naXRodWIuY29tL2luaWt1bGluKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcGFyc2V1cmwKTGljZW5zZTogTUlUCkJ5OiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbiwgSm9uYXRoYW4gT25nClJlcG9zaXRvcnk6IHBpbGxhcmpzL3BhcnNldXJsCgo+IChUaGUgTUlUIExpY2Vuc2UpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IEpvbmF0aGFuIE9uZyA8bWVAam9uZ2xlYmVycnkuY29tPgo+IENvcHlyaWdodCAoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uIDxkb3VnQHNvbWV0aGluZ2RvdWcuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwYXRoLWtleSwgc2hlYmFuZy1yZWdleApMaWNlbnNlOiBNSVQKQnk6IFNpbmRyZSBTb3JodXMKUmVwb3NpdG9yaWVzOiBzaW5kcmVzb3JodXMvcGF0aC1rZXksIHNpbmRyZXNvcmh1cy9zaGViYW5nLXJlZ2V4Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBlcmlzY29waWMKTGljZW5zZTogTUlUClJlcG9zaXRvcnk6IFJpY2gtSGFycmlzL3BlcmlzY29waWMKCj4gQ29weXJpZ2h0IChjKSAyMDE5IFJpY2ggSGFycmlzCj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwaWNvY29sb3JzCkxpY2Vuc2U6IElTQwpCeTogQWxleGV5IFJhc3BvcG92ClJlcG9zaXRvcnk6IGFsZXhleXJhc3BvcG92L3BpY29jb2xvcnMKCj4gSVNDIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyNCBPbGVrc2lpIFJhc3BvcG92LCBLb3N0aWFudHluIERlbnlzb3YsIEFudG9uIFZlcmlub3YKPiAKPiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKPiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKPiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKPiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCj4gV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKPiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLWltcG9ydApMaWNlbnNlOiBNSVQKQnk6IE1heGltZSBUaGlyb3VpbgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vcG9zdGNzcy9wb3N0Y3NzLWltcG9ydC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE0IE1heGltZSBUaGlyb3VpbiwgSmFzb24gQ2FtcGJlbGwgJiBLZXZpbiBNw6VydGVuc3Nvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbG9hZC1jb25maWcKTGljZW5zZTogTUlUCkJ5OiBNaWNoYWVsIENpbmlhd2t5LCBSeWFuIER1bmNrZWwsIE1hdGV1c3ogRGVya3MsIERhbHRvbiBTYW50b3MsIFBhdHJpY2sgR2lsZGF5LCBGcmFuw6dvaXMgV291dHMKUmVwb3NpdG9yeTogcG9zdGNzcy9wb3N0Y3NzLWxvYWQtY29uZmlnCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCBNaWNoYWVsIENpbmlhd3NreSA8bWljaGFlbC5jaW5pYXdza3lAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcwpMaWNlbnNlOiBNSVQKQnk6IEFsZXhhbmRlciBNYWR5YW5raW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL2Nzcy1tb2R1bGVzL3Bvc3Rjc3MtbW9kdWxlcy5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUtcHJlc2VudCBBbGV4YW5kZXIgTWFkeWFua2luIDxhbGV4YW5kZXJAbWFkeWFua2luLm5hbWU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgo+IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCj4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwo+IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCj4gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAo+IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAo+IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwo+IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgo+IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgo+IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCj4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cwpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLWV4dHJhY3QtaW1wb3J0cy5naXQKCj4gQ29weXJpZ2h0IDIwMTUgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdApMaWNlbnNlOiBNSVQKQnk6IE1hcmsgRGFsZ2xlaXNoClJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9jc3MtbW9kdWxlcy9wb3N0Y3NzLW1vZHVsZXMtbG9jYWwtYnktZGVmYXVsdC5naXQKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IDIwMTUgTWFyayBEYWxnbGVpc2ggPG1hcmsuam9obi5kYWxnbGVpc2hAZ21haWwuY29tPgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKPiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgo+IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KPiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgo+IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKPiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKPiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKPiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKPiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgo+IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtbW9kdWxlcy1zY29wZQpMaWNlbnNlOiBJU0MKQnk6IEdsZW4gTWFkZGVybgpSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXNjb3BlLmdpdAoKPiBJU0MgTGljZW5zZSAoSVNDKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNSwgR2xlbiBNYWRkZXJuCj4gCj4gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBwb3N0Y3NzLW1vZHVsZXMtdmFsdWVzCkxpY2Vuc2U6IElTQwpCeTogR2xlbiBNYWRkZXJuClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vY3NzLW1vZHVsZXMvcG9zdGNzcy1tb2R1bGVzLXZhbHVlcy5naXQKCj4gSVNDIExpY2Vuc2UgKElTQykKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdsZW4gTWFkZGVybgo+IAo+IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcG9zdGNzcy1zZWxlY3Rvci1wYXJzZXIKTGljZW5zZTogTUlUCkJ5OiBCZW4gQnJpZ2dzLCBDaHJpcyBFcHBzdGVpbgpSZXBvc2l0b3J5OiBwb3N0Y3NzL3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyCgo+IENvcHlyaWdodCAoYykgQmVuIEJyaWdncyA8YmVuZWIuaW5mb0BnbWFpbC5jb20+IChodHRwOi8vYmVuZWIuaW5mbykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+IG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCj4gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAo+IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAo+IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKPiBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCj4gT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKPiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAo+IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAo+IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHBvc3Rjc3MtdmFsdWUtcGFyc2VyCkxpY2Vuc2U6IE1JVApCeTogQm9nZGFuIENoYWRraW4KUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tL1RyeVNvdW5kL3Bvc3Rjc3MtdmFsdWUtcGFyc2VyLmdpdAoKPiBDb3B5cmlnaHQgKGMpIEJvZ2RhbiBDaGFka2luIDx0cnlzb3VuZEB5YW5kZXgucnU+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyByZWFkZGlycApMaWNlbnNlOiBNSVQKQnk6IFRob3JzdGVuIExvcmVueiwgUGF1bCBNaWxsZXIKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvcmVhZGRpcnAuZ2l0Cgo+IE1JVCBMaWNlbnNlCj4gCj4gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTkgVGhvcnN0ZW4gTG9yZW56LCBQYXVsIE1pbGxlciAoaHR0cHM6Ly9wYXVsbWlsbHIuY29tKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgcmVzb2x2ZS5leHBvcnRzLCB0b3RhbGlzdApMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3JpZXM6IGx1a2VlZC9yZXNvbHZlLmV4cG9ydHMsIGx1a2VlZC90b3RhbGlzdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIEx1a2UgRWR3YXJkcyA8bHVrZS5lZHdhcmRzMDVAZ21haWwuY29tPiAobHVrZWVkLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KPiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHNoZWJhbmctY29tbWFuZApMaWNlbnNlOiBNSVQKQnk6IEtldmluIE3DpXJ0ZW5zc29uClJlcG9zaXRvcnk6IGtldnZhL3NoZWJhbmctY29tbWFuZAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgS2V2aW4gTcOlcnRlbnNzb24gPGtldmlubWFydGVuc3NvbkBnbWFpbC5jb20+IChnaXRodWIuY29tL2tldnZhKQo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgc2lydgpMaWNlbnNlOiBNSVQKQnk6IEx1a2UgRWR3YXJkcwpSZXBvc2l0b3J5OiBsdWtlZWQvc2lydgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzdGF0dXNlcwpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uLCBKb25hdGhhbiBPbmcKUmVwb3NpdG9yeToganNodHRwL3N0YXR1c2VzCgo+IFRoZSBNSVQgTGljZW5zZSAoTUlUKQo+IAo+IENvcHlyaWdodCAoYykgMjAxNCBKb25hdGhhbiBPbmcgPG1lQGpvbmdsZWJlcnJ5LmNvbT4KPiBDb3B5cmlnaHQgKGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24gPGRvdWdAc29tZXRoaW5nZG91Zy5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQo+IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCj4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwo+IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKPiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKPiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKPiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCj4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBzdHJpbmctaGFzaApMaWNlbnNlOiBDQzAtMS4wCkJ5OiBUaGUgRGFyayBTa3kgQ29tcGFueQpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2Rhcmtza3lhcHAvc3RyaW5nLWhhc2guZ2l0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHN0cmlwLWxpdGVyYWwKTGljZW5zZTogTUlUCkJ5OiBBbnRob255IEZ1ClJlcG9zaXRvcnk6IGdpdCtodHRwczovL2dpdGh1Yi5jb20vYW50ZnUvc3RyaXAtbGl0ZXJhbC5naXQKCj4gTUlUIExpY2Vuc2UKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMjIgQW50aG9ueSBGdSA8aHR0cHM6Ly9naXRodWIuY29tL2FudGZ1Pgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKPiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKPiBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdG8tcmVnZXgtcmFuZ2UKTGljZW5zZTogTUlUCkJ5OiBKb24gU2NobGlua2VydCwgUm91dmVuIFdlw59saW5nClJlcG9zaXRvcnk6IG1pY3JvbWF0Y2gvdG8tcmVnZXgtcmFuZ2UKCj4gVGhlIE1JVCBMaWNlbnNlIChNSVQpCj4gCj4gQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0Lgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKPiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAo+IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKPiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCj4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCj4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCj4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgo+IFRIRSBTT0ZUV0FSRS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgdHNjb25mY2sKTGljZW5zZTogTUlUCkJ5OiBkb21pbmlrZwpSZXBvc2l0b3J5OiBnaXQraHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWtnL3RzY29uZmNrLmdpdAoKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgMjAyMS1wcmVzZW50IGRvbWluaWtnIGFuZCBbY29udHJpYnV0b3JzXShodHRwczovL2dpdGh1Yi5jb20vZG9taW5pa2cvdHNjb25mY2svZ3JhcGhzL2NvbnRyaWJ1dG9ycykKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCj4gCj4gLS0gTGljZW5zZXMgZm9yIDNyZC1wYXJ0eSBjb2RlIGluY2x1ZGVkIGluIHRzY29uZmNrIC0tCj4gCj4gIyBzdHJpcC1ib20gYW5kIHN0cmlwLWpzb24tY29tbWVudHMKPiBNSVQgTGljZW5zZQo+IAo+IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKGh0dHBzOi8vc2luZHJlc29yaHVzLmNvbSkKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKPiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCj4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAo+IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCj4gU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHVucGlwZQpMaWNlbnNlOiBNSVQKQnk6IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uClJlcG9zaXRvcnk6IHN0cmVhbS11dGlscy91bnBpcGUKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24gPGRvdWdAc29tZXRoaW5nZG91Zy5jb20+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCj4gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwo+IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKPiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KPiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KPiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKPiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCj4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKPiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAo+IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCj4gU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIHV0aWwtZGVwcmVjYXRlCkxpY2Vuc2U6IE1JVApCeTogTmF0aGFuIFJhamxpY2gKUmVwb3NpdG9yeTogZ2l0Oi8vZ2l0aHViLmNvbS9Ub29UYWxsTmF0ZS91dGlsLWRlcHJlY2F0ZS5naXQKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQgTmF0aGFuIFJhamxpY2ggPG5hdGhhbkB0b290YWxsbmF0ZS5uZXQ+Cj4gCj4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgo+IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKPiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKPiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAo+IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gY29uZGl0aW9uczoKPiAKPiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQo+IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+IAo+IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwo+IE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECj4gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKPiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKPiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCj4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB1dGlscy1tZXJnZQpMaWNlbnNlOiBNSVQKQnk6IEphcmVkIEhhbnNvbgpSZXBvc2l0b3J5OiBnaXQ6Ly9naXRodWIuY29tL2phcmVkaGFuc29uL3V0aWxzLW1lcmdlLmdpdAoKPiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBKYXJlZCBIYW5zb24KPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKPiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCj4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCj4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCj4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KPiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB2YXJ5CkxpY2Vuc2U6IE1JVApCeTogRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb24KUmVwb3NpdG9yeToganNodHRwL3ZhcnkKCj4gKFRoZSBNSVQgTGljZW5zZSkKPiAKPiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvbgo+IAo+IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwo+IGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKPiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCj4gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCj4gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCj4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+IAo+IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCj4gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gCj4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCj4gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgo+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCj4gQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKPiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQo+IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyB3cwpMaWNlbnNlOiBNSVQKQnk6IEVpbmFyIE90dG8gU3Rhbmd2aWsKUmVwb3NpdG9yeTogZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzLmdpdAoKPiBDb3B5cmlnaHQgKGMpIDIwMTEgRWluYXIgT3R0byBTdGFuZ3ZpayA8ZWluYXJvc0BnbWFpbC5jb20+Cj4gQ29weXJpZ2h0IChjKSAyMDEzIEFybm91dCBLYXplbWllciBhbmQgY29udHJpYnV0b3JzCj4gQ29weXJpZ2h0IChjKSAyMDE2IEx1aWdpIFBpbmNhIGFuZCBjb250cmlidXRvcnMKPiAKPiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCj4gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KPiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCj4gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKPiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCj4gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gCj4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCj4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiAKPiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCj4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCj4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCj4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KPiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo= - - - - - - thecodrr - fdir - 6.5.0 - The fastest directory crawler & globbing alternative to glob, fast-glob, & tiny-glob. Crawls 1m files in < 1s - - - MIT - - - pkg:npm/fdir@6.5.0 - - - git+https://github.com/thecodrr/fdir.git - as detected from PackageJson property "repository.url" - - - https://github.com/thecodrr/fdir#readme - as detected from PackageJson property "homepage" - - - https://github.com/thecodrr/fdir/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/router-devtools-core/node_modules/fdir - - - - - file: LICENSE - Q29weXJpZ2h0IDIwMjMgQWJkdWxsYWggQXR0YQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K - - - - - - Jon Schlinkert - picomatch - 4.0.3 - Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. - - - MIT - - - pkg:npm/picomatch@4.0.3 - - - git+https://github.com/micromatch/picomatch.git - as detected from PackageJson property "repository.url" - - - https://github.com/micromatch/picomatch - as detected from PackageJson property "homepage" - - - https://github.com/micromatch/picomatch/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz - as detected from npm-ls property "resolved" - - - - node_modules/@tanstack/router-devtools-core/node_modules/picomatch - - - - - file: LICENSE - VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTctcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgo= - - - - - @@ -12506,7 +13370,7 @@ - + The Babel Team @babel plugin-syntax-jsx @@ -12533,10 +13397,14 @@ https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cbc61334878aa3284677d3b4262cb3cb2aa4f207639ee9864d03eccf4c4e64e43646691525e675be699f22f1442aab9c046e9ac4918164313fee2239b2e508ff + + true node_modules/@babel/plugin-syntax-jsx @@ -12548,7 +13416,7 @@ - + The Babel Team @babel plugin-syntax-typescript @@ -12575,10 +13443,14 @@ https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c5f60204cc6f787ad13270169756653d73998f390df364c716f2e142115716df356791e737e12d524661bffcdc2a9993ddfce6599074cb0881adb0b7be881bc1 + + true node_modules/@babel/plugin-syntax-typescript @@ -12590,7 +13462,7 @@ - + The Babel Team @babel template @@ -12617,7 +13489,10 @@ https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2cf0d9f39684272612775f3f0e48cd878ff2d67b641392b05075938aa811c6bbae64bd85d72b879628151cbbdc1d8daf3075edb4a169267e8bc1f23b730ece0f + @@ -12632,7 +13507,7 @@ - + The Babel Team @babel traverse @@ -12659,7 +13534,10 @@ https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 604cee6e83f6aaf41abc072381035582cbc7203bfa669c17bdcbe39b2c923f60c832e0724bfea2a14e46f6962b58733a4f66037dcef181af6237360eb35d8215 + @@ -12674,7 +13552,7 @@ - + The Babel Team @babel types @@ -12701,7 +13579,10 @@ https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6e416a90b861de9301510424a558160d6abf96acdcdbaefc794c8395306146a8421c582e61818cd047e06bbb589384e8806ff7c7410497aebf390f9619b581fd + @@ -12716,7 +13597,7 @@ - + Tanner Linsley @tanstack router-generator @@ -12743,10 +13624,14 @@ https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.132.47.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b771c70d6450e020e49b5e3523ba65d7141feaf7a1346e789b987fd83a891ae81890fe02d71d23c6ace009b7a4d92bae1a8712d4ff8dad641ec8d16691422010 + + true node_modules/@tanstack/router-generator @@ -12758,7 +13643,7 @@ - + Tanner Linsley @tanstack router-utils @@ -12785,10 +13670,14 @@ https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.132.31.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b9ff26437c15e7c2bc4cbe575c1a1686463198257b2cb59b6dfe80bdcc5d8670a704d997046958f93f1176c4675f2236232a761df1da559fbc1f708441e7577f + + true node_modules/@tanstack/router-utils @@ -12800,7 +13689,7 @@ - + Tanner Linsley @tanstack virtual-file-routes @@ -12827,10 +13716,14 @@ https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.132.31.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + af14bc0a6da7217ae82ea926f6913ff17da514dbaf7132088858b9547e0fc33bcab1c02e696dd844c3755a66860c8da65449fe18b6a863a29cde339cccbe62e3 + + true node_modules/@tanstack/virtual-file-routes @@ -12842,7 +13735,7 @@ - + pcattori babel-dead-code-elimination 1.0.10 @@ -12868,10 +13761,14 @@ https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0d5e5b749653cd9d339f40c2db8bf78c3ecc9e2761eb184a6b819f2826eadec7d6f246968437598cfde2f3581e03c4f7ded758a962b0e03ddf56fd02c0480a54 + + true node_modules/babel-dead-code-elimination @@ -12883,7 +13780,7 @@ - + unplugin 2.3.10 Unified plugin system for build tools @@ -12908,14 +13805,18 @@ https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e8d08f92fd429701fefc1184f507a84c8974f67ba202dd204b6f279f53ef617b06291c0cd9309b140d908a29667a13c34d721eebce24e2b648d729770353c253 + + true node_modules/unplugin - + Jon Schlinkert picomatch 4.0.3 @@ -12941,10 +13842,14 @@ https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e604e680463fb2a2ba8055cb22c40d1f5f6559be1e6cf0cb03849d2cfeddb169085c75a51baea83ee56f5d21853e9a58673f190d9ab475862b6c77c109551bd5 + + true node_modules/unplugin/node_modules/picomatch @@ -12966,7 +13871,7 @@ - + Luke Edwards dequal 2.0.3 @@ -12992,7 +13897,10 @@ https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d237bea8f28710ca21bdf453084a370ab3c6e9c033018826ccacb1462612483912e9e1897725499bb59a600e4409a003f702c1d93e0411eca603968555c61708 + @@ -13007,7 +13915,7 @@ - + Sindre Sorhus indent-string 4.0.0 @@ -13033,10 +13941,14 @@ https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 11d0c366ee00d8ec882bb2ebff6cc6fb0e6399bba4d435419c4c11110bc1ceca412640846d16bc1b153596085871a1890a745689b8c35e5abbefd5f5ff2e71c2 + + true node_modules/indent-string @@ -13048,7 +13960,7 @@ - + Sindre Sorhus strip-indent 3.0.0 @@ -13074,10 +13986,14 @@ https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 95a2536b725bf95429682e83b1e1e117b75756a1d37c93c24436846e277f76b3a1822b60624bbf95eb4c52a397168595d3320851b8e9747dadfad623e1b40c45 + + true node_modules/strip-indent @@ -13089,7 +14005,7 @@ - + The Babel Team @babel code-frame @@ -13116,7 +14032,10 @@ https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 72343b66543432fddbe3b84006e4debf24ee60de22fa5a09286795f5f95c0a020adfb7025d187e2f56ddde20479729deae143b0610a49f604f6d050bfab1aa16 + @@ -13131,7 +14050,7 @@ - + @types aria-query 5.0.4 @@ -13157,10 +14076,14 @@ https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + adf4fddee8f9b343d12fb13371c18cb376eba6585cae08670e8576e8da8a842012d61568f9674db0fbc4ff26fa8a57ebe618b630493a77911625329dc60f2357 + + true node_modules/@types/aria-query @@ -13172,7 +14095,7 @@ - + dom-accessibility-api 0.5.16 Implements https://w3c.github.io/accname/ @@ -13197,10 +14120,14 @@ https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5fb049db2125b27389df4a59178b882037c1115805e17101c4bf41c61cba767ae6e61933aa6b161c64e21ea46221336133214bc808969dd2093fb675353b5e0e + + true node_modules/dom-accessibility-api @@ -13212,7 +14139,7 @@ - + pieroxy lz-string 1.5.0 @@ -13238,10 +14165,14 @@ https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8796e0256a7124db306d4eea0ab574b4829009a4b76e53c3aea296c7e431ceeccbd73194ce28fd5c258bad22ec24fbb9b7e79603fc9c7adcd800ee4838c71601 + + true node_modules/lz-string @@ -13253,7 +14184,7 @@ - + James Kyle pretty-format 27.5.1 @@ -13279,14 +14210,18 @@ https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 41bd60cb93ab3f9fb30dfd81be7cdd9778ec4dfd6a5d531acdbbc2a0a86d2aa56ce3f60ae28cd7e2029024957235ef9c6a334f9f42a80b4302dc552668758499 + + true node_modules/pretty-format - + Sindre Sorhus ansi-styles 5.2.0 @@ -13312,10 +14247,14 @@ https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0b1c29b7649f4f34ed5dc7ce97318479ef0ef9cf8c994806acd8817179ee5b1b852477ba6b91f3eeac21c1ee4e81a498234209be42ea597d40486f9c24e90488 + + true node_modules/pretty-format/node_modules/ansi-styles @@ -13337,7 +14276,7 @@ - + @typescript-eslint project-service 8.46.0 @@ -13363,10 +14302,14 @@ https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 38485e734987f94e497b635939e2b501b542766d028726a90324de5d52184cf5c3277174efe72ef3b3cf5dc1a862a67b33d60956f1677e91a0d5498222a33e41 + + true node_modules/@typescript-eslint/project-service @@ -13378,7 +14321,7 @@ - + @typescript-eslint tsconfig-utils 8.46.0 @@ -13404,10 +14347,14 @@ https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5ab61728600763cdfafcdef3a0afe4ce2ea9f2d5c585ab0787ca1c14bf55652024bc7f79ea07de45f72786cdf1cd1cbca90fddab7ab8e2fd63bd089e30583673 + + true node_modules/@typescript-eslint/tsconfig-utils @@ -13419,7 +14366,7 @@ - + Isaac Z. Schlueter minimatch 9.0.5 @@ -13445,7 +14392,10 @@ https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1ba4f4657e3cc60a33c7be7cee4a1e5fd62cd8d632e869affff3fcf6c12d7bd57dc2121aa4c345e2274ac675b642d09c2e24d695bff07c269b02d0055a1841a3 + @@ -13460,7 +14410,7 @@ - + ms 2.1.3 Tiny millisecond conversion utility @@ -13485,7 +14435,10 @@ https://registry.npmjs.org/ms/-/ms-2.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e85973b9b4cb646dc9d9afcd542025784863ceae68c601f268253dc985ef70bb2fa1568726afece715c8ebf5d73fab73ed1f7100eb479d23bfb57b45dd645394 + @@ -13500,7 +14453,7 @@ - + The Babel Team @babel generator @@ -13527,7 +14480,10 @@ https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + de54a9c4682f9e66739e60640919d54443d4149bf6c2bbfd880a050ef00325cd32a6674ec5d52d70b78180127acc4d0f31e4ca9f1790cf2934c5306ae04a7bcf + @@ -13542,7 +14498,7 @@ - + The Babel Team @babel helper-compilation-targets @@ -13569,10 +14525,14 @@ https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + dbed6d8465145968cb4d84c76562b59fc6206b48a3073d5702151770acbcd6b77983aca1ee11aa329e39bfb71a7526c41dcf46dce4efe394b29de44dde9b380d + + true node_modules/@babel/helper-compilation-targets @@ -13584,7 +14544,7 @@ - + The Babel Team @babel helper-module-transforms @@ -13611,10 +14571,14 @@ https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 832b5751bb3c936b174bd3e7429b73e68d109e92cbe754b001220e458e97681285f3c9ec393d19c3db332ea9521900cfff84e58c1003e72f7ca765357ea91db3 + + true node_modules/@babel/helper-module-transforms @@ -13626,7 +14590,7 @@ - + The Babel Team @babel helpers @@ -13653,10 +14617,14 @@ https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1c5379f4c9905c61d5c9869d28b56e998b00f5d045ba7fe5758c62a448f3038d7dea3a4b65df148c41012e46c492f7d8ade0ea2616716005853edadf84da63e3 + + true node_modules/@babel/helpers @@ -13668,7 +14636,7 @@ - + The Babel Team @babel parser @@ -13695,7 +14663,10 @@ https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c996c1a9e33a4e4a4ff5dbbf236a5466726c44c186bceb88ae18f30b50301f05beea17b89a78ba069fe6f228e7d223ae66e3c8d817e40a8491ba7a728e7ad02a + @@ -13710,7 +14681,7 @@ - + Justin Ridgewell @jridgewell remapping @@ -13737,10 +14708,14 @@ https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2c8f6effe95a606e03b354c3292256d983eb22571560ec22d9f502eb1078de5b9e0a383157895f7ce0990ad605887e9334e5feb50297c7ded3e082876e1c8711 + + true node_modules/@jridgewell/remapping @@ -13752,7 +14727,7 @@ - + Thorsten Lorenz convert-source-map 2.0.0 @@ -13778,10 +14753,14 @@ https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2afa78e7d1eb576144275080b22d4abbe318de46ac1f5f53172913cf6c5698c7aae9b936354dd75ef7c9f90eb59b4c64b56c2dfb51d261fdc966c4e6b3769126 + + true node_modules/convert-source-map @@ -13793,7 +14772,7 @@ - + Logan Smyth gensync 1.0.0-beta.2 @@ -13819,10 +14798,14 @@ https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + de137b35ab2462f3032d0639e609d6dcd43e99eb0401ea53aa583e5446e3ef3cea10c055361cdc19861ea85a3f4e5633e9e42215ca751dcb0264efa71a04bcce + + true node_modules/gensync @@ -13834,7 +14817,7 @@ - + Aseem Kishore json5 2.2.3 @@ -13860,10 +14843,14 @@ https://registry.npmjs.org/json5/-/json5-2.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5e63967bb7b21d81f5e1c2dd54fa3283e18e1f7ad85fef8aa73af2949c125bdf2ddcd93e53c5ce97c15628e830b7375bf255c67facd8c035337873167f16acca + + true node_modules/json5 @@ -13875,7 +14862,7 @@ - + The Babel Team @babel helper-plugin-utils @@ -13902,10 +14889,14 @@ https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d609f5529e585e46b761800718aa5b89d790e588dfd6d0daf6a61c832b33f9c3425ee9322e5e838cf5e10f7551c126fc73427db40e1bdbeac7119b5ce91d2d97 + + true node_modules/@babel/helper-plugin-utils @@ -13917,7 +14908,7 @@ - + @types babel__generator 7.27.0 @@ -13943,10 +14934,14 @@ https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b9f15dd978bdd8e0153d8b32f8fe27eff53b7baf1f7b1d3e11ef20486f4a5fb7a8d3ce025a2438b1dc64b6f765d1b38fba95ed5493d8d7dce4e84c16a9443c96 + + true node_modules/@types/babel__generator @@ -13958,7 +14953,7 @@ - + @types babel__template 7.4.4 @@ -13984,10 +14979,14 @@ https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 87f354692c86e44cb1048a7c611c68e1131edbfa9082fca8c11c1533385884108e35b5bc3d4b20e2590532b86066151ee73dcbdcc88b0eebf227f09a3dad80f0 + + true node_modules/@types/babel__template @@ -13999,7 +14998,7 @@ - + @types babel__traverse 7.28.0 @@ -14025,10 +15024,14 @@ https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f0fbdc5dfef48130d9060b7da6dc49f1e9417818dc2ce01c3ada0efe63c98ed8e2d7e09d19b1e09bbee89b51abb0fc6c884fae5c8a4d48aeb8518688c105dde1 + + true node_modules/@types/babel__traverse @@ -14040,7 +15043,7 @@ - + baseline-browser-mapping 2.8.12 A library for obtaining browser versions with their maximum supported Baseline feature set and Widely Available status. @@ -14065,10 +15068,14 @@ https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + bc03cc41d9f228206d926400e8530206f53da85229a52de7cf25e710cf8ba36200846e0ca63bfd702c4cb9d86057761d34d26fe9336a5f2f7b75f4552f62e669 + + true node_modules/baseline-browser-mapping @@ -14080,7 +15087,7 @@ - + Kilian Valkhof electron-to-chromium 1.5.232 @@ -14106,10 +15113,14 @@ https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.232.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 10d8ab49eef07fc5b3c8f0a26ea2941b50a0e3770f6b11f8c1147b009b17ecc0800421c120e16abda60e0d22ca52e65dadac544c7444ff403602af0160a1073a + + true node_modules/electron-to-chromium @@ -14121,7 +15132,7 @@ - + Sergey Rubanov node-releases 2.0.23 @@ -14147,10 +15158,14 @@ https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7029850cc4a6dba4bab50483a410a0fcd47c34436b54f8402527fe5dbc411b8acf15a6a89e512813dc07426ba7f9c96ce3df5340649bed9c8f05197380a7e97a + + true node_modules/node-releases @@ -14162,7 +15177,7 @@ - + Andrey Sitnik update-browserslist-db 1.1.3 @@ -14188,10 +15203,14 @@ https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 531848650f9022755dba790301a89acefbd3ffe7d72f93acaf4259949ba57a962ee8977ba89b4366396eaf47a64654fbd4437749c3e813b82fb2e20a28d6af2b + + true node_modules/update-browserslist-db @@ -14203,7 +15222,7 @@ - + Jordan Harband call-bind 1.0.8 @@ -14229,10 +15248,14 @@ https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a0a95214c70cc29520d9e767921438e78c1f5a253fba5dc29097bf3c41dc4caba25fa4696de854885317bb5dc76a5199c5f530090cd91bbe3b617067d629bdc3 + + true node_modules/call-bind @@ -14244,7 +15267,7 @@ - + Jordan Harband call-bound 1.0.4 @@ -14270,10 +15293,14 @@ https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fb2b3df7b53dea9a382b1fc0069042aa103d12ec49690583420ef6f791f8841a61bf72198346e804abb0629b78617a7a319e4099942753fb72313951a5a49e8e + + true node_modules/call-bound @@ -14285,7 +15312,7 @@ - + Jordan Harband define-properties 1.2.1 @@ -14311,10 +15338,14 @@ https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f109902aa10048b7799f1d14d41d6890b1256d4baeb6d27f0276264576db6c60d687ab92db4f048c3e17aaafc8f702bbbb4bfa3b4f178535a7b795ed11b47a0e + + true node_modules/define-properties @@ -14326,7 +15357,7 @@ - + Jordan Harband es-abstract 1.24.0 @@ -14352,10 +15383,14 @@ https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 592ccf82c74bb53710c26e0244e7d2e63bb659ad5041c55e4f7ee3163633745cf5afd6a169d0bc07cfdae2ac49c4cfb4f45d7c8ae9827519a5afde9962442f12 + + true node_modules/es-abstract @@ -14367,7 +15402,7 @@ - + Jordan Harband es-object-atoms 1.1.1 @@ -14393,10 +15428,14 @@ https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 146807da1f3328d8a6f658e3edd6a79053dc20220af42a796e6f9cda041261e3e1a5a1b9f9eb2b2ce0e2848a2b9fe3dee85189cd6857428b4fbfbde34da95d5c + + true node_modules/es-object-atoms @@ -14408,7 +15447,7 @@ - + Jordan Harband get-intrinsic 1.3.0 @@ -14434,10 +15473,14 @@ https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f5f4a349aa2cfdf448548a7ec5226513a95fc21112ecb36d29a08121a987b23af69dad418800493e8d263a38f3f062435116ab9823c6a9a89583999f8dbf7c09 + + true node_modules/get-intrinsic @@ -14449,7 +15492,7 @@ - + Jordan Harband is-string 1.1.1 @@ -14475,10 +15518,14 @@ https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 06d11e4aca1a4239523c17a631022b635318d2e33abe74b58397e6b9f60eb67c4b19464cdb5efc3ca6e1b24ec57efe7c217f99b5cbe81b071c62c8743e096400 + + true node_modules/is-string @@ -14490,7 +15537,7 @@ - + Jordan Harband math-intrinsics 1.1.0 @@ -14516,10 +15563,14 @@ https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fc85ed6f0124e474cfc84c32297ea11a4617c4cf676e3eb807e8a55499c2fd1e81d291f91b85776f4a556cbec3063e2d921040a696d05257fa17a5e5f4b1eed6 + + true node_modules/math-intrinsics @@ -14531,7 +15582,7 @@ - + Jordan Harband es-errors 1.3.0 @@ -14557,10 +15608,14 @@ https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 65fe47d8ac6ddb18d3bdb26f3f66562c4202c40ea3fa1026333225ca9cb8c5c060d6f2959f1f3d5b2d066d2fa47f9730095145cdd0858765d20853542d2e9cb3 + + true node_modules/es-errors @@ -14572,7 +15627,7 @@ - + Jordan Harband es-shim-unscopables 1.1.0 @@ -14598,10 +15653,14 @@ https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 77d4fcb9cb04861f018b5c285c27fe4c828321138b1b958293183c81e0426ef936da4cf00b91b63a75d530ee8552cbd09605145d0da2b5ea615832ea0f36de0b + + true node_modules/es-shim-unscopables @@ -14613,7 +15672,7 @@ - + Jordan Harband es-set-tostringtag 2.1.0 @@ -14639,10 +15698,14 @@ https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8fabd6cdfac655fc97c607be3b4c79b21e9cbf10288346bfe1175dd8adfacc2315e5e27effeb4e0278113bc70e0cc3566d545d5659866502f6612df247c6c850 + + true node_modules/es-set-tostringtag @@ -14654,7 +15717,7 @@ - + Raynos function-bind 1.1.2 @@ -14680,7 +15743,10 @@ https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ed71cdc47eea5fdc46e66230c6486e993a31fcc21135c3a00ebc56b0cb76a40af6dd61e9e8cad194dec50521690a9afea153b417be38894811f369c931f1b648 + @@ -14695,7 +15761,7 @@ - + Jordan Harband globalthis 1.0.4 @@ -14721,10 +15787,14 @@ https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0e92ca6cd5385b2969c49ca442e8df09cc185a257f2619b9d06a28d30ad520b02fe633abf5df87f944773e14820f6ac2084220d2e73e1be9ae053c03e782610d + + true node_modules/globalthis @@ -14736,7 +15806,7 @@ - + Jordan Harband gopd 1.2.0 @@ -14762,10 +15832,14 @@ https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 65429187afe4505a0089302d4d83d9277870f70371c7e04804e8a39e51bd3e7ac9b027128ecd70cb20fabc9a5a62d827cc3aca6114aa7f738ee917daf77c6c46 + + true node_modules/gopd @@ -14777,7 +15851,7 @@ - + Jordan Harband has-property-descriptors 1.0.2 @@ -14803,10 +15877,14 @@ https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e7924d2ae216fafab829ed418ce4e333661cb5022f093ec61731f099f64f1a8e709eb82489dd1842d9c095e152aae9999b86b3de7d814be7ab6f2e62a49760ae + + true node_modules/has-property-descriptors @@ -14818,7 +15896,7 @@ - + Jordan Harband has-proto 1.2.0 @@ -14844,10 +15922,14 @@ https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2882fb7903df1d0442f3e5e5b9a230ec11d4c30a8bd7d6d09f887336076bfb5c17a14d0a2a3eabb9fbb8ee5858eca6c94760ba4faf8f7f237411aef09124bea9 + + true node_modules/has-proto @@ -14859,7 +15941,7 @@ - + Jordan Harband has-symbols 1.1.0 @@ -14885,10 +15967,14 @@ https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d5c0cd77027625aa2199bdec8383a629a301c2e0b8f2c6278b91d4c360efb02f0b8c64cb2bd87e79bd57e91cae3877b8853d142c25baf22a26863528294aa53d + + true node_modules/has-symbols @@ -14900,7 +15986,7 @@ - + Jordan Harband internal-slot 1.1.0 @@ -14926,10 +16012,14 @@ https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e2077b56958d40d07850a28214555ca75015bfe14c3a0b3d34ace31cabac73c8d332177978bd4da90a8ea44d0accc76cf34e3fc87960969deec6096e3aa00f2f + + true node_modules/internal-slot @@ -14941,7 +16031,7 @@ - + Jordan Harband iterator.prototype 1.1.5 @@ -14967,10 +16057,14 @@ https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1f476442809addbd9511e29004ec45a61f8901b72b41d13b282d1492ac292e6bf6102e0fe354173feaeaa3dc18a1d002886e7f58ce6cf680c0a5353cbadc23f6 + + true node_modules/iterator.prototype @@ -14982,7 +16076,7 @@ - + Jordan Harband safe-array-concat 1.1.3 @@ -15008,10 +16102,14 @@ https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 014466e5fd236043b27418fb550955bc3ae378582d8437441791f574ffba98da685ce328d6ab90a89e30bc90f2459f7ea4ede4196a0e766574f1c4afd9a255e9 + + true node_modules/safe-array-concat @@ -15023,7 +16121,7 @@ - + Jordan Harband array.prototype.flat 1.3.3 @@ -15049,10 +16147,14 @@ https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + af01bf8dad677b22ea0ae199e5862bce703ad83e266578348b5708b242142928aa1770a37bdff05c096cf41f6cd566b67e898cb08bfc73307c8d970f9b109716 + + true node_modules/array.prototype.flat @@ -15064,7 +16166,7 @@ - + Jordan Harband object.assign 4.1.7 @@ -15090,10 +16192,14 @@ https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9cadbc58ea3e4088c190376e4c8344e09905fd42492b27f6109c6f24a7db943a7283443ea643873532f4430cba34fe85844fc49f357bdc1c71a9c25a5d8f5a9f + + true node_modules/object.assign @@ -15105,7 +16211,7 @@ - + Sindre Sorhus object-assign 4.1.1 @@ -15131,7 +16237,10 @@ https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ac98134279149c7d6c170f324fa552537cc3dec5a6bbab19848b1e63c557f8646edcfe85ec5bbe24d0e85df9251256cb2529dcdc55101d57b8714e618fe05c52 + @@ -15146,7 +16255,7 @@ - + Jordan Harband is-core-module 2.16.1 @@ -15172,7 +16281,10 @@ https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 51fa1e300e9f209f304d81445237a59da188ebbbfaf8deea5c912f42e2066bdf65e31b02aee498395490d2e3c0367e1d0339bc96460f68a2ebae28cbabbc76df + @@ -15187,7 +16299,7 @@ - + Javier Blanco path-parse 1.0.7 @@ -15213,7 +16325,10 @@ https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2c32733d510410f47ecb8f33f7703411dd325dbf29001c865a8fe4e5861d620a58dbfd84b0eb24b09aeaee5387c6bcab54e9f57a31baa00a7c6a1bce2100fcb3 + @@ -15228,7 +16343,7 @@ - + Jordan Harband supports-preserve-symlinks-flag 1.0.0 @@ -15254,7 +16369,10 @@ https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a2dd169d74bd7e076480871e3dee911cd935580f3e9ae3dae9c4a3791dd5f0adbbabd041d6b4c4dd1d69ec7bf4cf567201cf2ce95beff0323259febcd4c02dd3 + @@ -15269,7 +16387,7 @@ - + Jordan Harband regexp.prototype.flags 1.5.4 @@ -15295,10 +16413,14 @@ https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 758aa035265b0f091a27671e45df688c21a306afa63a6f4b9ad5e7027106c8784dff947b8835b64d1c3787ea3f8c2171bacdcfd8b7d62088b0a3002300d9bb20 + + true node_modules/regexp.prototype.flags @@ -15310,7 +16432,7 @@ - + Jordan Harband set-function-name 2.0.2 @@ -15336,10 +16458,14 @@ https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ecf185966b70b040036f4598caf08c6b5b7eca47ba75a206e168ab69fbabe6471ff8c8549cf9acd54791d02290753643f35c844b03076ed9fe4d1f9d32f89a91 + + true node_modules/set-function-name @@ -15351,7 +16477,7 @@ - + Jordan Harband side-channel 1.1.0 @@ -15377,10 +16503,14 @@ https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 657f7d7bab51c1ea145ea47e541aec96175ae75361e4c4d0c28bb9b6750381bb723347418268440ed5863ffc5b2a7ea1a9f3d11ee8d4370cf97f2ff06db867a7 + + true node_modules/side-channel @@ -15392,7 +16522,7 @@ - + Toru Nagashima eslint-visitor-keys 3.4.3 @@ -15418,10 +16548,14 @@ https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c2973e2d77a2ca28acc4f944914cd4eacbf24b57eb20edcc8318f57ddcbb3e6f1883382e6b1d8ddc56bf0ff6a0d56a9b3a9add23eb98eb031497cfdad86fa26a + + true node_modules/eslint-visitor-keys @@ -15433,7 +16567,7 @@ - + Nicholas C. Zakas @eslint object-schema @@ -15460,10 +16594,14 @@ https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 441320e4544bd08d20b39d4cfe0b92023e7f7b5e15438b6966740d5b0b834fae8fd78238dc8b663df2194613bd7d45483ce0105d4e3b6ad972c19fdcce8a853c + + true node_modules/@eslint/object-schema @@ -15475,7 +16613,7 @@ - + Sindre Sorhus globals 14.0.0 @@ -15501,10 +16639,14 @@ https://registry.npmjs.org/globals/-/globals-14.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a1a846bee3064253f0fe2bc86018d54ab5807d62c17a4bb9b693c4d9f38f2e2f961df7c859bba1dad0a38724214c13cc7f913d8c3107e053a64d8818c1b2b0b5 + + true node_modules/globals @@ -15516,7 +16658,7 @@ - + Sindre Sorhus import-fresh 3.3.1 @@ -15542,7 +16684,10 @@ https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4d1dca7eb4d94d82cf07a8d48dfc7a305f56716ac72fdb2ee5339b2b866462005d58a3ce1684a8408744b93b91f36a66b711f6b29586f61e9eb707ebd692c1a9 + @@ -15557,7 +16702,7 @@ - + Vladimir Zapparov js-yaml 4.1.0 @@ -15583,10 +16728,14 @@ https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c29c59b3d368c596891122462194f20c4698a65d0529203e141f5a262c9e98a84cc24c5083ade1e13d4a2605061e94ea3c33517269982ee82b46326506d5af44 + + true node_modules/js-yaml @@ -15598,7 +16747,7 @@ - + Sindre Sorhus strip-json-comments 3.1.1 @@ -15624,10 +16773,14 @@ https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e9f3dcf91e22870a8fe8dfda22fd9fd60307f25395b56407a2a0b8c8aea8483555a1cba602c7c2aa39179ea89832198cc12fe61072e9ed57a196ddea97a9448a + + true node_modules/strip-json-comments @@ -15639,7 +16792,7 @@ - + George Zahariev levn 0.4.1 @@ -15665,10 +16818,14 @@ https://registry.npmjs.org/levn/-/levn-0.4.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f9b4f6b87e04e4b184ee1fe7ddebdc4bfb109495c2a48a7aca6f0e589e5e57afbaec3b2a97f2da693eea24102ddabcdfa1aff94011818710e2c7574cb7691029 + + true node_modules/levn @@ -15680,7 +16837,7 @@ - + Nicholas C. Zakas @humanfs core @@ -15707,10 +16864,14 @@ https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e43c90e3ed49114cde8de2b524620272275ec9f51b1a2c604bd8cd81ec799ea916f9c63b59987106282689e379427c3d668b123550bd2902b26fe194686c8a50 + + true node_modules/@humanfs/core @@ -15722,7 +16883,7 @@ - + James Halliday fast-json-stable-stringify 2.1.0 @@ -15748,10 +16909,14 @@ https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 96177fc05f8b93df076684c2b6556b687b5f8795d88a32236a55dc93bb1a52db9a9d20f22ccc671e149710326a1f10fb9ac47c0f4b829aa964c23095f31bf01f + + true node_modules/fast-json-stable-stringify @@ -15763,7 +16928,7 @@ - + Evgeny Poberezkin json-schema-traverse 0.4.1 @@ -15789,10 +16954,14 @@ https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c5b6c21f9742614e53f0b704861ba1ec727cf075ee5b7aac237634cce64529f6441dca5688753f271ce4eb6f41aec69bfe63221d0b62f7030ffbce3944f7b756 + + true node_modules/json-schema-traverse @@ -15804,7 +16973,7 @@ - + Gary Court uri-js 4.4.1 @@ -15830,10 +16999,14 @@ https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + eeb294cb2df7435c9cf7ca50d430262edc17d74f45ed321f5a55b561da3c5a5d628b549e1e279e8741c77cf78bd9f3172bacf4b3c79c2acf5fac2b8b26f9dd06 + + true node_modules/uri-js @@ -15845,7 +17018,7 @@ - + Sindre Sorhus ansi-styles 4.3.0 @@ -15871,7 +17044,10 @@ https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cdb07dac22404f5adb8e25436f686a2851cd60bc60b64f0d511c59dc86700f717a36dc5b5d94029e74a2d4b931f880e885d3e5169db6db05402c885e64941212 + @@ -15886,7 +17062,7 @@ - + Sindre Sorhus supports-color 7.2.0 @@ -15912,10 +17088,14 @@ https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + aa9080bd197db2db8e1ef78ab27ec79dc251befe74d6a21a70acd094effe2f0c5cf7ed2adb02f2bf80dfbedf34fc33e7da9a8e06c25d0e2a205c647df8ebf047 + + true node_modules/supports-color @@ -15927,7 +17107,7 @@ - + Sindre Sorhus path-key 3.1.1 @@ -15953,7 +17133,10 @@ https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a2399e374a9dfb2d23b3312da18e3caf43deab97703049089423aee90e5fe3595f92cc17b8ab58ae18284e92e7c887079b6e1486ac7ee53aa6d889d2c0b844e9 + @@ -15968,7 +17151,7 @@ - + Kevin Mårtensson shebang-command 2.0.0 @@ -15994,7 +17177,10 @@ https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 907c6bdb366962d766acdd6a0e3aeb5ff675ad1d641bc0f1fa09292b51b87979af5ecc26704d614d6056614ce5ada630d7fc99a7a62e0d8efb62dbdb3747660c + @@ -16009,7 +17195,7 @@ - + Isaac Z. Schlueter which 2.0.2 @@ -16035,7 +17221,10 @@ https://registry.npmjs.org/which/-/which-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 04b2374e5d535b73ef97bd25df2ab763ae22f9ac29c17aac181616924a8cb676d782b303fb28fbae15b492e103c7325a6171a3116e6881aa4a34c10a34c8e26c + @@ -16050,7 +17239,7 @@ - + esrecurse 4.3.0 ECMAScript AST recursive visitor @@ -16075,15 +17264,19 @@ https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2a67ca2f76fa1be457bcff0dd6faf74ead642ffa021609f63585c4b6a3fcfcbde929aa540381bc70555aa05dd2537db7083e17ca947f7df8a81e692d8bafd36a + + true node_modules/esrecurse - + acorn-jsx 5.3.2 Modern, fast React.js JSX parser @@ -16108,10 +17301,14 @@ https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + aeaf6cf893617f4202863b435f196527b838d68664e52957b69d0b1f0c80e5c7a3c27eef2a62a9e293eb8ba60478fbf63d4eb9b00b1e81b5ed2229e60c50d781 + + true node_modules/acorn-jsx @@ -16123,7 +17320,7 @@ - + acorn 8.15.0 ECMAScript parser @@ -16148,10 +17345,14 @@ https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 359c896ab05f2fb9d6c08abe1432fa669ff21c485e3cc3679c9d32dea7e2782ae636f61cb7cbafb62578d54be549ee9aa407e4d1f63515b5b1f8dc1f9a9bed4e + + true node_modules/acorn @@ -16163,7 +17364,7 @@ - + Jared Wray flat-cache 4.0.1 @@ -16189,10 +17390,14 @@ https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7fb71c14f2b7497147a71d795081b2449fc525072db8a674cd5b8dddfac1a381e72b771acbd5445b447ac8f6051c2d0082a86e90fcca8eadb6b790e6032a86cb + + true node_modules/flat-cache @@ -16204,7 +17409,7 @@ - + Sindre Sorhus locate-path 6.0.0 @@ -16230,10 +17435,14 @@ https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 88f64ae9e6236f146edee078fd667712c10830914ca80a28a65dd1fb3baad148dc026fcc3ba282c1e0e03df3f77a54f3b6828fdcab67547c539f63470520d553 + + true node_modules/locate-path @@ -16245,7 +17454,7 @@ - + Sindre Sorhus path-exists 4.0.0 @@ -16271,10 +17480,14 @@ https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6a4f50cb943b8d86f65b071ecb9169be0d8aa0073f64884b48b392066466ca03ec1b091556dd1f65ad2aaed333fa6ead2530077d943c167981e0c1b82d6cbbff + + true node_modules/path-exists @@ -16286,7 +17499,7 @@ - + Jon Schlinkert is-extglob 2.1.1 @@ -16312,7 +17525,10 @@ https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 49b29b00d90deb4dd58b88c466fe3d2de549327e321b0b1bcd9c28ac4a32122badb0dde725875b3b7eb37e1189e90103a4e6481640ed9eae494719af9778eca1 + @@ -16327,7 +17543,7 @@ - + Thorsten Lorenz deep-is 0.1.4 @@ -16353,10 +17569,14 @@ https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a083f392c993838fccae289a6063bea245c34fbced9ffc37129b6fffe81221d31d2ac268d2ee027d834524fcbee1228cb82a86c36c319c0f9444c837b7c6bf6d + + true node_modules/deep-is @@ -16368,7 +17588,7 @@ - + Ramesh Nair fast-levenshtein 2.0.6 @@ -16394,10 +17614,14 @@ https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0c25eee887e1a9c92ced364a6371f1a77cbaaa9858e522599ab58c0eb29c11148e5d641d32153d220fcf62bcf2c3fba5f63388ca1d0de0cd2d6c2e61a1d83c77 + + true node_modules/fast-levenshtein @@ -16409,7 +17633,7 @@ - + George Zahariev prelude-ls 1.2.1 @@ -16435,10 +17659,14 @@ https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + be47033eb459a354192db9f944b18fa60fd698843ae6aa165a170629ffdbe5ea659246ab5f49bdcfca6909ab789a53aa52c5a9c8db9880edd5472ad81d2cd7e6 + + true node_modules/prelude-ls @@ -16450,7 +17678,7 @@ - + George Zahariev type-check 0.4.0 @@ -16476,10 +17704,14 @@ https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5e5794a1cf6ec065ea8d6c176944d9026ccc705679f39f10036befc7552be7121c8b15c83fef0b9c50e0469954df4bacead7aa765b2415fbbe69ee0aefd3a87b + + true node_modules/type-check @@ -16491,7 +17723,7 @@ - + Jon Schlinkert word-wrap 1.2.5 @@ -16517,10 +17749,14 @@ https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 04ddb607979a30c23d50cb63ac677983978260fa423c3532d052576d8b1a4f9cd8c6314e7244b9dd2403137a56915a16a475d56f706b61c10de13c1ae7907970 + + true node_modules/word-wrap @@ -16532,7 +17768,7 @@ - + asamuzaK @asamuzakjp css-color @@ -16559,14 +17795,18 @@ https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2b503acfcb52dd7b2608c33ceb1a16767ec591d9fd9ba45256da1c52b25823066715592783f3ef904a16b4e5a63fe49c73ab1a6161d66586e7744117c65db88f + + true node_modules/@asamuzakjp/css-color - + Isaac Z. Schlueter lru-cache 10.4.3 @@ -16592,10 +17832,14 @@ https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 24d03365c5eb0ade365462ee633d337c0cc37c0bc9596e807d8943050c835790c2948da6e6c0262be3883bbb39f577ec46c587a74da3009ad169d3d1193b7a49 + + true node_modules/@asamuzakjp/css-color/node_modules/lru-cache @@ -16617,7 +17861,7 @@ - + Nathan Rajlich agent-base 7.1.4 @@ -16643,10 +17887,14 @@ https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 32703e613f1fc1f24f801c779bad0c36a6a49b7d173a4c88a07d72ea1b9342f0b43f0646ee48bc35a70b05cacf6cda28f2f119cbb269ba4efe8cc3be094a2f4d + + true node_modules/agent-base @@ -16658,7 +17906,7 @@ - + Felix Boehm entities 6.0.1 @@ -16684,10 +17932,14 @@ https://registry.npmjs.org/entities/-/entities-6.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 68df7b357585e805814da85f54e22b07f352864ce2e47ec5f6bd6cf660f77038f82a8e5fdaa86156860c89b5c5ec694bbde6ff0f68a859acbc97123ded57a7de + + true node_modules/entities @@ -16699,7 +17951,7 @@ - + Louis-Dominique Dubeau xmlchars 2.2.0 @@ -16725,10 +17977,14 @@ https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2599c328af01d11083c3ce0535d0c022964af89b89c3eb3b2f3f2792c23b488b94dd45c926c954b61b22fae5815183b03c5c16ed6ecf44b45f50aa718ed8c50b + + true node_modules/xmlchars @@ -16740,7 +17996,7 @@ - + Rémi Berson tldts 6.1.86 @@ -16766,10 +18022,14 @@ https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 58c8bf390d9ac554dfff292a09081788872dfa64900c5747d9f93084fc20130bc9d644b36518a29dbd331765dbf2ee3e3aa3c2866c88e8c12ee047b3349cfe15 + + true node_modules/tldts @@ -16781,7 +18041,7 @@ - + Alexander Shtuchkin iconv-lite 0.6.3 @@ -16807,10 +18067,14 @@ https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e1f0a4efdc2c84c773329dab1f4eaa5ab244e22a25a8b842507f8e8ae22053ef91074fbde0d9432fcd5ab4eec65f9e6e50ab9ea34b711cdb6f13223a0fb59d33 + + true node_modules/iconv-lite @@ -16822,7 +18086,7 @@ - + Sebastian Mayr tr46 5.1.1 @@ -16848,10 +18112,14 @@ https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 85d1796608d3aa0027b4a924958c34474dcc1b6c7f6d2cd3b64c66211c3fb13355f185ec089d6d7cb017db7961c611c99447f709108e086196c37bc8dc66923f + + true node_modules/tr46 @@ -16863,7 +18131,7 @@ - + Simon Lydell js-tokens 4.0.0 @@ -16889,7 +18157,10 @@ https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 45d2547e5704ddc5332a232a420b02bb4e853eef5474824ed1b7986cf84737893a6a9809b627dca02b53f5b7313a9601b690f690233a49bce0e026aeb16fcf29 + @@ -16904,7 +18175,7 @@ - + @types mdast 3.0.15 @@ -16930,7 +18201,10 @@ https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2e7c03fa65047f158c6b54290eb69ccc89fa93411edd232272e6124b34ba65897680a4b4f440a59c960677c0eeeab7dce6bfc6644939a359916fc4da4e3d37b1 + @@ -16945,7 +18219,7 @@ - + Titus Wormer mdast-util-from-markdown 1.3.1 @@ -16971,7 +18245,10 @@ https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e314cefccf1cf36a8172741cd6d82936db9b1945bf635b414350748b90ad4a87a538b28562512522bddbbe04446183b9891a9b318d58baa667834195388f10c3 + @@ -16986,7 +18263,7 @@ - + Titus Wormer mdast-util-to-hast 12.3.0 @@ -17012,7 +18289,10 @@ https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a62b6cf77afc3e19c8a14e15cbd6e35b7f4cda327afed747ca36bdaeba2df6eba390ded44d4f520e713a58d273fc81b2424dd71d7eb234db6b047e9c4339bc1f + @@ -17027,7 +18307,7 @@ - + inline-style-parser 0.1.1 An inline style parser. @@ -17052,7 +18332,10 @@ https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ecd5e896c2b80804b9fb1bdd8f938c31b23deb6854ff0bf0a3193e2d647d124f5b56dcaeb9849c0cde9e4b4ad49ba4f1029169c3b097d68e2e27371de00c83dd + @@ -17060,7 +18343,7 @@ - + Titus Wormer bail 2.0.2 @@ -17086,7 +18369,10 @@ https://registry.npmjs.org/bail/-/bail-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d313ba99877b241d987acc432a995a7d1a6c88eccfb7d574d9d74f08b6d8d716063ce5f6e0d4f2379d2a9d4c6008f712a183212a902e0538d0a1164202450347 + @@ -17101,7 +18387,7 @@ - + Stefan Thomas extend 3.0.2 @@ -17127,7 +18413,10 @@ https://registry.npmjs.org/extend/-/extend-3.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7e3aae0b9f5c0fb0b25babab3572b4141b9f9197288861bcd304ee3ee8d7e7dd1c0794ed967db4136501e12fd601156a8577df665d8b3604be81074f2088a6fe + @@ -17142,7 +18431,7 @@ - + Feross Aboukhadijeh is-buffer 2.0.5 @@ -17168,7 +18457,10 @@ https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8b647accd143c20107272414b49124d17162d62d1d3c59ffa2a8cadffbcf09c0de26f5b9350f3757c41b89c7c5d52ba939a07487c9ed8010b662213b75fc9cb5 + @@ -17183,7 +18475,7 @@ - + Sindre Sorhus is-plain-obj 4.1.0 @@ -17209,7 +18501,10 @@ https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f8f822faf32e50d909c84c62301b792251683322a7af9ce127852ca73e7c58e841179428219905c8d1c86c102d1f0cd502093946d9dd54db0344deb5fe6983aa + @@ -17224,7 +18519,7 @@ - + Titus Wormer trough 2.2.0 @@ -17250,7 +18545,10 @@ https://registry.npmjs.org/trough/-/trough-2.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b663292b4d018d9894c95cafac12bb9277ab3609a0bdc57f28b572ba66bf482f9340dd7aec6acc45c880353cf4f7e937cd6f0bf2deb48d63b51a97e465d8d36b + @@ -17265,7 +18563,7 @@ - + Titus Wormer unist-util-is 5.2.1 @@ -17291,7 +18589,10 @@ https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + bbd9e3cb27c4878de7a5fd4cfb218a0c654f6d8fc95847a68399c7d399dc28f7e2fa405b2812684ddb2880cbb7dee872b6e2e5bfdcb43bb187edf11dc0b74b43 + @@ -17306,7 +18607,7 @@ - + Titus Wormer unist-util-visit-parents 5.1.3 @@ -17332,7 +18633,10 @@ https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c7afb2f20ef058cc9084bd6265f8483e10c0b3b5f06e7f67468b035e5eeaa0f4d20b2d323719ca73e856a241627d64080c68b5e78add52a2af6c26b8fb590b86 + @@ -17347,7 +18651,7 @@ - + Titus Wormer unist-util-stringify-position 3.0.3 @@ -17373,7 +18677,10 @@ https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9391b320167f41ab51f0de57db2f9dadfa561bc203073767563e8e22744d5a6d685ebcf27626804f6390880f033d1459c8029bf5be88d9ae8fc58925643d202a + @@ -17388,7 +18695,7 @@ - + Titus Wormer vfile-message 3.1.4 @@ -17414,7 +18721,10 @@ https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7dad19e8ff0752b40de0165a5f4e522155e273eee41376f4e4f580b4fb983fd40b1ec2ca611eff0252d6dcdb4eae95d12de6b0a432ccb159269390c6d0d5e05b + @@ -17429,7 +18739,7 @@ - + @emotion memoize 0.9.0 @@ -17455,7 +18765,10 @@ https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + df41408fbfc4a09e66c153ce5a1032097f853df303ad579c24033e230f4d4684a5e0104041eaa3e1c0291c7517395bc83e02d50ec085a33fe1183fb94100f519 + @@ -17470,7 +18783,7 @@ - + @emotion sheet 1.4.0 @@ -17496,7 +18809,10 @@ https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7d3056f7ff2bdb0ddd5d660ce07081d51769f0d2e26cec36f9710b1f99b9f8091688bfcaa985fa75cd2429895a6322a3ad0e9db37dcc09d30f13082cdb3d6baa + @@ -17511,7 +18827,7 @@ - + @emotion utils 1.4.2 @@ -17537,7 +18853,10 @@ https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + def2dc951a1f1738886b7276c0387d8e36e4533f6a939562dc867f1524ca56207493e79fd1f3d5edd62b508ba06e0ba9603c7bbfdb9dfd28ebb443fc638c4ba0 + @@ -17552,7 +18871,7 @@ - + @emotion weak-memoize 0.4.0 @@ -17578,7 +18897,10 @@ https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b272aab4f5b4d6d374ba2ef2bbdac6bfaf5a257aff6bf630be5d75b148cdb4471173e9e0fe642b8852f4c0b5cc79fef88876bf1247ed6c3cd4f45f2215b1fece + @@ -17593,7 +18915,7 @@ - + Sultan Tarimo stylis 4.2.0 @@ -17619,7 +18941,10 @@ https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3aba2fea0e81075b037d883359f4c70cec5a9ad5f56c4ff3a35d380e1f5ee9fa89dcfa288a96327c9d29526ad93b6c00bcef186c4c9e16b915f755d3b06312af + @@ -17634,7 +18959,7 @@ - + Kye Hohenberger @emotion babel-plugin @@ -17661,14 +18986,17 @@ https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a711c2a53d9ec7ed2af871fdd7fcec747930fe55dde3af0320ddb3bdfbcbb4f28b2cca3a8108fba0b39babc3e192bc4e65bfe0182ab4dd2dd9ecf0e14bca5db9 + node_modules/@emotion/babel-plugin - + Thorsten Lorenz convert-source-map 1.9.0 @@ -17694,7 +19022,10 @@ https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 012141ba9d0ccf5bb28888c035a9f58f32d06a68bdcf53e86126428a2616d857333db7a75dce3915974164bcce4feafafa2722b8432876d982b62fa18da024d0 + @@ -17709,7 +19040,7 @@ - + Nick Fitzgerald source-map 0.5.7 @@ -17735,7 +19066,10 @@ https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2dbae624e31449d115c482af75c273402fa74217bc1546504d7432ebe23be6c90d827dcea10d03640f189c56bb829f2daad2f728f7f5926a344790e802979219 + @@ -17760,7 +19094,7 @@ - + @emotion serialize 1.3.3 @@ -17786,7 +19120,10 @@ https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 108486aadeec48d587188efa842ef1d4292c8973da85bc443ab0b94639854494ea2f210af7ff6166f05b8989fbd1dc38c2ec0c2a210c094951e995d349642ac4 + @@ -17801,7 +19138,7 @@ - + @emotion use-insertion-effect-with-fallbacks 1.2.0 @@ -17827,7 +19164,10 @@ https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c8932d55d1f9f6cc62fda54906993d150abe391f25979193f2859de7b52979a28454669be35256682140ec544ba0c2e5a0e645fdcff0b0fa1ef9b7c69912a00e + @@ -17842,7 +19182,7 @@ - + Michael Ridgway hoist-non-react-statics 3.3.2 @@ -17868,14 +19208,17 @@ https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fe01a2bf18bc24f296366fd6d234a6cdc30fa5fa4f2dcddd63fe86c615f6850f621a3dda0df925578113ecd8caa528a72e9279bda7daf62886204660d7449f07 + node_modules/hoist-non-react-statics - + react-is 16.13.1 Brand checking of React Elements. @@ -17900,7 +19243,10 @@ https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + db87baca71361fe38ab7892ab0ebcd77c901a55eb9ce8c5b038055b04381dc0455590922fc31f3694a02e4ab8e37f06271c0da0824d906e39c7d9b3bd2447c6d + @@ -17925,7 +19271,7 @@ - + atomiks @floating-ui core @@ -17952,7 +19298,10 @@ https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b069ef6f9766ac968a119f8b0c8a60baf757ddb0e5125966bf8fc2950f5ac1c98266b971e63432c8c58533990123e13234e0830e22a4f22974cdeb97dd9960ff + @@ -17967,7 +19316,7 @@ - + atomiks @floating-ui utils @@ -17994,7 +19343,10 @@ https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6864f16e96e0f3f6f925f5351d74ab6c7df05d9b8b3c970d11c65014cc4bb37a12ce0b55bba9c53e46db18652f05c523295d98c81f56c7169ba3e1c41fdb5c45 + @@ -18009,7 +19361,7 @@ - + Jason Quense dom-helpers 5.2.1 @@ -18035,7 +19387,10 @@ https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9d109aec22b7553accd8d986908cb871b2bb219960044fcf60c9f9e6bad779faf9c570cfd0b76d7cf9db9450e855d7007ec949ee8afa8aa0149f1d0208621640 + @@ -18050,7 +19405,7 @@ - + Elan Shanker anymatch 3.1.3 @@ -18076,7 +19431,10 @@ https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 28c45e154af4078b7e0fe381923477298aafa1ca765da4b33b9e54701ea681031ddca6dc13e9964f2bd557b0ffcec7446cd9d5e9a71952eb64887417bd3af547 + @@ -18091,7 +19449,7 @@ - + Jon Schlinkert braces 3.0.3 @@ -18117,7 +19475,10 @@ https://registry.npmjs.org/braces/-/braces-3.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c906d780efce499543d88b222e5ae8fbb1dfe90d7c109aca484b1da0ccca78f29772dde0bc3f282dc390748cc6ba9af9163f840def203bf9717350737cca71bc + @@ -18132,7 +19493,7 @@ - + Gulp Team glob-parent 5.1.2 @@ -18158,7 +19519,10 @@ https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 00e22049009ea62258c0fdc04671b1fb95674eed870587736c63f8e5e2f0d6faf7cc1def64b7b279dd6c0bd8676dc39cf7f4ab33233944f42b906cf8692f59a3 + @@ -18173,7 +19537,7 @@ - + Sindre Sorhus is-binary-path 2.1.0 @@ -18199,7 +19563,10 @@ https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 64c11161eb3aa43c9dcae1a276c7bb3ac1f1b5b23b595794128ce047f83baddd31522998365bd9444fcad8c8194e35b2ef6e487de94b79570433dee69ad4465f + @@ -18214,7 +19581,7 @@ - + Thorsten Lorenz readdirp 3.6.0 @@ -18240,7 +19607,10 @@ https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 84e4b4f3da27f1176ea9d6e1bd0e59dfb0341128ecab3eaa9d171f7ec314df8f7916e4dda929beedb849dbd26f20eb010c41276a7e433eef6ddd3a3d55194ccc + @@ -18255,7 +19625,7 @@ - + @nodelib fs.stat 2.0.5 @@ -18281,7 +19651,10 @@ https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 46484f3e9db3aea0c0400ff68cd867ced70f025bfae17761229edaef8e78039a2f23b06e93182decc5fbb9dc00bb7ce0d437293d4d2bcf7555d5279aaaf638f8 + @@ -18296,7 +19669,7 @@ - + @nodelib fs.walk 1.2.8 @@ -18322,7 +19695,10 @@ https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a0607e53196059c810920c28f067041b07a6a1316ddc520ef5a6da6c199a1b05c8a01299f864f2d293f5f396de1a0ecb96287f3521d25765c0b35967ce7a1c4a + @@ -18337,7 +19713,7 @@ - + merge2 1.4.1 Merge multiple streams into one stream in sequence or parallel. @@ -18362,7 +19738,10 @@ https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f2aed51203095b827cb5c7d53f2f20d3d35c43065d6f0144aa17bf5999282338e7ff74c60f0b4e098b571b10373bcb4fce97330820e0bfe3f63f9cb4d1924e3a + @@ -18377,7 +19756,7 @@ - + Jon Schlinkert picomatch 2.3.1 @@ -18403,7 +19782,10 @@ https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 254ded7874cd8e6136542185cee63c117cc20d5c04a81d9af1fb08bf0692b4784058911e55dd68d500fcd0253af997445d748b6d2b2e2f0263902056a9141454 + @@ -18418,7 +19800,7 @@ - + Bogdan Chadkin read-cache 1.0.0 @@ -18444,7 +19826,10 @@ https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3b076ffc5b7b2233a09bf8b4c6f3436752eb4403517dec386f6a6b1773963102f12dfbb76d2f055610acad208c2b8951e7a63dc9af804e1a13a43093c429a944 + @@ -18459,7 +19844,7 @@ - + Steven Vachon camelcase-css 2.0.1 @@ -18485,7 +19870,10 @@ https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 40e4af7af86c9628e0630471e91bfbcca74c17c95b466c7eb901b1dbebc373e288fde067b32f648ade5a8f6dc0806bb7a5ae2df408306e75d6a92fa2398fb668 + @@ -18500,7 +19888,7 @@ - + Mathias Bynens cssesc 3.0.0 @@ -18526,7 +19914,10 @@ https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fd36ff25c8cad75d67352706a1be4c36db27b4d3356823540e2a41fd39306458720ebac4e3b48ec7fd7cc05d9b6e381cdd9cc248a5b54f99ede446c5a00cff56 + @@ -18541,7 +19932,7 @@ - + Nathan Rajlich util-deprecate 1.0.2 @@ -18567,7 +19958,10 @@ https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 10f0f9ab5b97c85c49a42acb9c27359c79eade039ae83641a1c008888d93692080ed5089d5424331a802cc891736c5187c3d5d68afff2d3110f318886eb1ed73 + @@ -18582,7 +19976,7 @@ - + Justin Ridgewell @jridgewell gen-mapping @@ -18609,7 +20003,10 @@ https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + da492dffb9e227a32010fc45d1b61d43a7ad65a03e7d0bc370b29c921cb5c8840ecdaa0a8c10634a3eb7fda2d58d8137aa146de5dbccfae5327c283a50a0816c + @@ -18624,7 +20021,7 @@ - + TJ Holowaychuk commander 4.1.1 @@ -18650,7 +20047,10 @@ https://registry.npmjs.org/commander/-/commander-4.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 34e2a6f31864cc08f3171f01dafe4e0074febb9a5141cd9409ad95abd8d82ffdf5a36c22f66c4103b2c816cdec5795520b8f73ea91217db3142ef4a12a3dba58 + @@ -18665,7 +20065,7 @@ - + Isaac Z. Schlueter glob 10.4.5 @@ -18691,7 +20091,10 @@ https://registry.npmjs.org/glob/-/glob-10.4.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ec1bfc445d24eb18e8edde00fcfc582db5027dbe9cf95a5ddbf981db244395ec3b25be611178820fd89b7ceef0a64f22e2c7af2ba0c59f2f61ec461b337fec1e + @@ -18706,7 +20109,7 @@ - + Brian Donovan lines-and-columns 1.2.4 @@ -18732,7 +20135,10 @@ https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ef297295eb1943f3d5dbd8e110397751f8e8e995fb802a89af917b3caaea73ddefedfcd2ca6b75069c0453c9c0517b3cab3cefaa16e384ae50660e8cb7f1e406 + @@ -18747,7 +20153,7 @@ - + Jonathan Ong mz 2.7.0 @@ -18773,7 +20179,10 @@ https://registry.npmjs.org/mz/-/mz-2.7.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cfcd4634eee79d830486b1a1f4b7b29a8138f98af45a7e4c70721930ae5c7d00a5f8d0d7d3cb0266051cf7fe8c1e78bd216b852e6d59dc74c25eedb3f5f37ad9 + @@ -18788,7 +20197,7 @@ - + Ari Porad pirates 4.0.7 @@ -18814,7 +20223,10 @@ https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4dfc92aecff99e6f1f4090dc043b949e0dd53942ac77b4beceabdb3938865c77f15f8c0adf56ab77e86836ebe489c33fd981739690e000139ebca4ac0781bf14 + @@ -18829,7 +20241,7 @@ - + Dmitry S, Grist Labs ts-interface-checker 0.1.13 @@ -18855,7 +20267,10 @@ https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 63f6abbdb9feaebcf72422a5f42e2454d7d37d29b6fe6129e454b3e44b194803463d2950ae9448e4ce0f285fa6267139da338ef743e73d273752bddb4d0c3480 + @@ -18870,129 +20285,7 @@ - - graceful-fs - 4.2.11 - A drop-in replacement for fs, making various improvements. - - - ISC - - - pkg:npm/graceful-fs@4.2.11 - - - git+https://github.com/isaacs/node-graceful-fs.git - as detected from PackageJson property "repository.url" - - - https://github.com/isaacs/node-graceful-fs#readme - as detected from PackageJson property "homepage" - - - https://github.com/isaacs/node-graceful-fs/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz - as detected from npm-ls property "resolved" - - - - node_modules/graceful-fs - - - - - file: LICENSE - VGhlIElTQyBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTEtMjAyMiBJc2FhYyBaLiBTY2hsdWV0ZXIsIEJlbiBOb29yZGh1aXMsIGFuZCBDb250cmlidXRvcnMKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQpwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCmNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgpNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgpBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCldIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgpBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgpJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgo= - - - - - - JP Richardson - jsonfile - 6.2.0 - Easily read/write JSON files. - - - MIT - - - pkg:npm/jsonfile@6.2.0 - - - git+ssh://git@github.com/jprichardson/node-jsonfile.git - as detected from PackageJson property "repository.url" - - - https://github.com/jprichardson/node-jsonfile#readme - as detected from PackageJson property "homepage" - - - https://github.com/jprichardson/node-jsonfile/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz - as detected from npm-ls property "resolved" - - - - node_modules/jsonfile - - - - - file: LICENSE - KFRoZSBNSVQgTGljZW5zZSkKCkNvcHlyaWdodCAoYykgMjAxMi0yMDE1LCBKUCBSaWNoYXJkc29uIDxqcHJpY2hhcmRzb25AZ21haWwuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKHRoZSAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUKV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTCk9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K - - - - - - Ryan Zimmerman - universalify - 2.0.1 - Make a callback- or promise-based function support both promises and callbacks. - - - MIT - - - pkg:npm/universalify@2.0.1 - - - git+https://github.com/RyanZim/universalify.git - as detected from PackageJson property "repository.url" - - - https://github.com/RyanZim/universalify#readme - as detected from PackageJson property "homepage" - - - https://github.com/RyanZim/universalify/issues - as detected from PackageJson property "bugs.url" - - - https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz - as detected from npm-ls property "resolved" - - - - node_modules/universalify - - - - - file: LICENSE - KFRoZSBNSVQgTGljZW5zZSkKCkNvcHlyaWdodCAoYykgMjAxNywgUnlhbiBaaW1tZXJtYW4gPG9wZW5zcmNAcnlhbnppbS5jb20+CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLApzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCkNPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgpJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgpDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo= - - - - - + Rich Harris estree-walker 2.0.2 @@ -19018,10 +20311,14 @@ https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 45f924fcca7f0cbec95637b7bb5f05c45ba34254cd476aba41f312301ec0bc2071f753468ff6dade409fcdad1fe9d5436f0ed89517ff9c3ae7ee942b082c90ff + + true node_modules/estree-walker @@ -19033,7 +20330,7 @@ - + Greg Bergé @svgr babel-preset @@ -19060,10 +20357,14 @@ https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ec46036c713b3311e9bf8b31be754f9e0c397ee47aa70efd4a472b20b1c9fe2329b8ac923429795b5a9cc0f12953e2e0c915ce6801601f42a1c03d7cc3083aba + + true node_modules/@svgr/babel-preset @@ -19075,7 +20376,7 @@ - + Sindre Sorhus camelcase 6.3.0 @@ -19101,10 +20402,14 @@ https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1a6cba161625098eee3849595126f1a365020c7f28c0493df7a8246eba6c806b6b24b33727b8c6c65f4873b430c23e22bce13901665644c79c0dd17b86a1a314 + + true node_modules/camelcase @@ -19116,7 +20421,7 @@ - + Blake Embrey snake-case 3.0.4 @@ -19142,10 +20447,14 @@ https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2c03a1e33f3d6c642f97da457cd17c575e3a8bba3bfc2a853dbab36203fec98cc3203792f4768d16d5c005a9915be010cc454e0dcbc4efd96327ef1af5849d32 + + true node_modules/snake-case @@ -19157,7 +20466,7 @@ - + Greg Bergé @svgr hast-util-to-babel-ast @@ -19184,14 +20493,18 @@ https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 11b0cac0ef46a5f58fe2337db06758c0f054d2476899a3c82f612ee18c2680ffac25e5d3f8bedb3302540678737c7f10daa301a99e1f270a42c98b003779add9 + + true node_modules/@svgr/hast-util-to-babel-ast - + Felix Boehm entities 4.5.0 @@ -19217,10 +20530,14 @@ https://registry.npmjs.org/entities/-/entities-4.5.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5748631f87463e1f40a39a74328458e8156ab700a3873eaf2392d3f00279e47fb883dff8bdb1f1d48e787d2d17b9c94b8431c0acf40288c8c3c6368bf1f3f187 + + true node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities @@ -19242,7 +20559,7 @@ - + Rich Harris svg-parser 2.0.4 @@ -19268,19 +20585,144 @@ https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7b8846d61470a0e7516f7edc20c4a0ccdb31cb329f6b25ba54e7e5af0bd1fbf6f3ae4cb163fdf55a46e09d0a60b6b369d5276926fa540064dafd9a223cd0ee45 + + true node_modules/svg-parser - + + @esbuild + aix-ppc64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/aix-ppc64@0.25.10 + + + https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + d0d1569c0fbb978d62acdb9a49594b7e0353d7671a58954bce9e5e015859d33d6aa716e872471c12ddecfb5e3dac4eb8554237325db3b7c36fe4955ce105d3b3 + + + + + node_modules/@esbuild/aix-ppc64 + + + + @esbuild + android-arm + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/android-arm@0.25.10 + + + https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 750031175756d42df3a5e0837392aa218b99d6d8007515cda193fbbe404846d2993d87b6c55aff7774a48ab925087b9d5b5078e6d1a2525cf6a545837db0c3e3 + + + + + node_modules/@esbuild/android-arm + + + + @esbuild + android-arm64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/android-arm64@0.25.10 + + + https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 2d241aede0da872a6ffd53ba58aa216463d2243ab93953a8dd4a05475138b781a3d56ef3110314848fa5a3cd47f83b41fa43feb43801a7e338a0d0b0a7a91f7e + + + + + node_modules/@esbuild/android-arm64 + + + + @esbuild + android-x64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/android-x64@0.25.10 + + + https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 3220bd09674fadf8626dc5f0af7f69f616b5c7495927d29a55fbf30345b1c33f444d7e2fe421df174f5bc7ddf99c79618be331840eb774a45140b89581252d12 + + + + + node_modules/@esbuild/android-x64 + + + + @esbuild + darwin-arm64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/darwin-arm64@0.25.10 + + + https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 242ef86dd5dc404a56f4a915df6e96a596632e0b926770df4bcc2baef3cc1e040e204206fec3d710dfd5f08b2ca0985b79f2d1711ab0e91407d8d9e9769aed30 + + + + + node_modules/@esbuild/darwin-arm64 + + + @esbuild darwin-x64 0.25.10 The macOS 64-bit binary for esbuild, a JavaScript bundler. + optional MIT @@ -19302,7 +20744,10 @@ https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b60b96835a2517a0c6ab3c2cf7ba4a67c1b62fb220d6f8c39864f0713b981dbb94e934e325ee455db82ce42d410731db2766e8d66dd69100db58ed8fbda99172 + @@ -19310,12 +20755,565 @@ - + + @esbuild + freebsd-arm64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/freebsd-arm64@0.25.10 + + + https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + dd98a84904a0d474f6374e58c5e256611f8b89b7b76d111549d5a1104804c56683b7215b6d759be3d4203ef147f2ed37bd43d7d7426124f733eecf6df7e6e85a + + + + + node_modules/@esbuild/freebsd-arm64 + + + + @esbuild + freebsd-x64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/freebsd-x64@0.25.10 + + + https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 2cb8097c7264d35e006b86a71836e1f1b988e4b93e422743986cee0b60febcfee6bff19e48df87dfdcce7fba4de4df29d39f4570e7ecd9b565ad1af848af56c4 + + + + + node_modules/@esbuild/freebsd-x64 + + + + @esbuild + linux-arm + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-arm@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + a11df51ad0531580aa10100b23dafa5b1a14fd9a1f665f7ada9a2e6514c46040af345fddb572a4bbc61770992180afdb794fb379d5df2331e28d245aa49637be + + + + + node_modules/@esbuild/linux-arm + + + + @esbuild + linux-arm64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-arm64@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + e65b8958de98281b1ac1de5ff62e3e73e81e622544c36d05556e71d2fd6410c58dabc51cb458c388c0130712ef9a61c0e1b7fb17a85345a260b60845afd8b389 + + + + + node_modules/@esbuild/linux-arm64 + + + + @esbuild + linux-ia32 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-ia32@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 36b482c762a29b71279d6812e13c67d101add178a9a2e99beb3eac52d9796ce1192152a1cdfca9fcbcb0e02d43218bf3796ff999660f045254ddaffc62bef90d + + + + + node_modules/@esbuild/linux-ia32 + + + + @esbuild + linux-loong64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-loong64@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + c684a986b77801975af3ead40c37c3f49e8550c8eb913cfc8ada53213338ff181eac06597055bb0effacba7ef7df721f2b1186f2002afb735b7c43097e263e12 + + + + + node_modules/@esbuild/linux-loong64 + + + + @esbuild + linux-mips64el + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-mips64el@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 69be9e8ae0b0a0c9980f24e7ca9b682a4552de4f1fcbfd54beaec38f97335c8e831761aa0f64e8227048d121cea79fd7d41759dba44a739faa8d03464417a544 + + + + + node_modules/@esbuild/linux-mips64el + + + + @esbuild + linux-ppc64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-ppc64@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 34b8a7cf33a0650b06a6c4e411b7494c26a7c00e7fc28ccdf5d4a0125d7685a5c9073313a6cb1e6ee5d1e366ed84e177cfbcd71561f5026bd6ba750290113810 + + + + + node_modules/@esbuild/linux-ppc64 + + + + @esbuild + linux-riscv64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-riscv64@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 144e79ed77590ebb57f0d308780f0b0495f7742d8cf15197c1fad0594ecb07948b39a8df248c6649dc8bfe05359bae19b3d0812af9b8500b81a79689f0e827ac + + + + + node_modules/@esbuild/linux-riscv64 + + + + @esbuild + linux-s390x + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-s390x@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + dc10526e0cee07d6a32e8559934986bbe107941c24bac46678d61daa6ce798c73dcc60121634acc6090db2a997ba0a4f934d2027424d2a1ffdee7c668dcb5d7b + + + + + node_modules/@esbuild/linux-s390x + + + + @esbuild + linux-x64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/linux-x64@0.25.10 + + + https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 4125fcd4a845a191b07a75723e86deae081d5b59eb4194af7d50c02145ebdd6a8b459199a9693f3f84fca7648ff9d7b64abe473dcbe385c273122ba52a09f1b4 + + + + + node_modules/@esbuild/linux-x64 + + + + @esbuild + netbsd-arm64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/netbsd-arm64@0.25.10 + + + https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 00a40cde07d87d25bc5d193c0dd302cda2d4141d79753ad97e75fc597428394a54050f8d6801423f590f4bfca46db198cfbaf19f4592e3cffcd65f61165deee0 + + + + + node_modules/@esbuild/netbsd-arm64 + + + + @esbuild + netbsd-x64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/netbsd-x64@0.25.10 + + + https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + ed14f2b433c653a7de93f856b8df6a4297863c16457c1e33660733d952b6679569754c4423c24a62c83725f3b49ff67513fea5d399f4ba70c235ce079e14068a + + + + + node_modules/@esbuild/netbsd-x64 + + + + @esbuild + openbsd-arm64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/openbsd-arm64@0.25.10 + + + https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + e527b454cf56b6aefded8167f9d2e299fd99c7a31cb6db07da895406c0e697e966d0638245579b45652f0ed918e01598bffdcd8334bc6ff50cde340d879858cb + + + + + node_modules/@esbuild/openbsd-arm64 + + + + @esbuild + openbsd-x64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/openbsd-x64@0.25.10 + + + https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 5e40387ebab54cb8f86c4301fb61e7234fb84678dbb8665f7adda0b3f2cdb391dcec3f3d65004743480bd8d0fa2f3bb5f905648e9df1d6021c3cacd134ff1b5f + + + + + node_modules/@esbuild/openbsd-x64 + + + + @esbuild + openharmony-arm64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/openharmony-arm64@0.25.10 + + + https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 0154d20614d7f18fc5cfa3a6215062a7db49cd9114718f162e1ec8e7dfaea5ae7f18f861dbf68ce9bbce310c92b299c2087bc58bbf6432d7494b5c340d701e6a + + + + + node_modules/@esbuild/openharmony-arm64 + + + + @esbuild + sunos-x64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/sunos-x64@0.25.10 + + + https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 7ecc24dd74f451fda918998ea4307bca49ea85590942401039c5bf71c54eb5fc74e4b91b58e69102d9f949aa97ca978a42b6b541a11af38d4f82b48bf6e6d23d + + + + + node_modules/@esbuild/sunos-x64 + + + + @esbuild + win32-arm64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/win32-arm64@0.25.10 + + + https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 6a1fbd6f9f4a0d349fa5a0a0e95749a0e42f2a3237de74da42be1496e4305bb684c1942c6cc09f4e67c43b85727b03b1c7845a0d3ff10b2f6b6b618f5a63bb2b + + + + + node_modules/@esbuild/win32-arm64 + + + + @esbuild + win32-ia32 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/win32-ia32@0.25.10 + + + https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 4073c36ca92b18ef3f733f4b2959c9536d873a2e29c599d98610361d81decf93f3e0979f7e10e37fce44e7b3b2728d7adc69f334256464ad1bfe7e18d141dc4b + + + + + node_modules/@esbuild/win32-ia32 + + + + @esbuild + win32-x64 + 0.25.10 + excluded + + + MIT + + + pkg:npm/%40esbuild/win32-x64@0.25.10 + + + https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz + as detected from npm-ls property "resolved" and property "integrity" + + f4aa71495142bb488ad68c287b3e9a0bfb3f11d5102c337769d4f1182ab131586b3c38fa6ede5d6eb1c35d4baaf81b36bc04c5041ad04b9bdd43f11dd8ffa76f + + + + + node_modules/@esbuild/win32-x64 + + + + @rollup + rollup-android-arm-eabi + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-android-arm-eabi@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 0539b6a8a3675884396ae7f875ea1eb483499b6273be286f19bf51e8afc44f028baa5fc16f7120d87d45069d6051be1819bc9d300de372641347bdeaec9f8600 + + + + + node_modules/@rollup/rollup-android-arm-eabi + + + + @rollup + rollup-android-arm64 + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-android-arm64@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 3fd2c34220b9be9806160cfb19233a74a3c28aa4775d83755b024a038fc15150e31e962c7f7881126573eb6bb2ab6d0d1986e218f47970d1c8ed3d47ab136cdb + + + + + node_modules/@rollup/rollup-android-arm64 + + + + @rollup + rollup-darwin-arm64 + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-darwin-arm64@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 4115925be6d571c02f645e9c6cd64127001e866bc6f4dc1f587c0ccb819b5a2fc140803f95a4c892d79b4f68a956336772a13a18b3f13a893986c102800c4666 + + + + + node_modules/@rollup/rollup-darwin-arm64 + + + Lukas Taegert-Atkinson @rollup rollup-darwin-x64 4.52.4 Native bindings for Rollup + optional MIT @@ -19337,7 +21335,10 @@ https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 85980fd39a517ac024449c4bd5bfbbcb10a75cf1ac5d4d1f1bd61f77a7546a81a4f8585d3ca089e4bd52ba6cb19fc92fc3c422e4fbd0f2e95e9d46d18f37824f + @@ -19345,7 +21346,439 @@ - + + @rollup + rollup-freebsd-arm64 + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-freebsd-arm64@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + c66737d15b21b81354779f179384ca004711647697955fad0b121710b884f6c42e2b7906f1916048f8b9ed4049b7cfe881f8401793b3e1949404defbc1e33e99 + + + + + node_modules/@rollup/rollup-freebsd-arm64 + + + + @rollup + rollup-freebsd-x64 + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-freebsd-x64@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 59d48ba59163384a8d6469877e5c7289fa25c00899983433b8ecc8abd2f6ec1bada425690fb2b34d1b441b5234c0c3c5ca2c9474e3bee2df06beb9c12d04b0a7 + + + + + node_modules/@rollup/rollup-freebsd-x64 + + + + @rollup + rollup-linux-arm-gnueabihf + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-arm-gnueabihf@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + c5188ebbd39fd456784b155b0748840d773875d21c8c2bf66a3d377665bc52b6485bb68843d8d525d2c1221c4123e31a4e71802b2bccc0fc109e8384bcfec581 + + + + + node_modules/@rollup/rollup-linux-arm-gnueabihf + + + + @rollup + rollup-linux-arm-musleabihf + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-arm-musleabihf@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 15b84cda9f53240984204848833478b2851cb16e3d7bdbde0100b38b06d1f97581db3a89d766f88bffa17a5f722e20fca4b9dc0c7e1f2883c86ede76dfcdf8d5 + + + + + node_modules/@rollup/rollup-linux-arm-musleabihf + + + + @rollup + rollup-linux-arm64-gnu + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-arm64-gnu@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + e27e2057084f1d1f6afe0f25282cb3d32b9a0f432f0dfedd5787fdb47b740bbdcca7c877f140ad482484e91f620654db5e5980f028e9b19a2e8e1b3379faae7a + + + + + node_modules/@rollup/rollup-linux-arm64-gnu + + + + @rollup + rollup-linux-arm64-musl + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-arm64-musl@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + bb49f5ee7180d27be2ff5d607192ac8e42e3d5022902e3c541b478f12b9ba3b4a66499c6c43a6ca72c3691ba6ea109f22bef69c1fde90281177ab26cffc322f6 + + + + + node_modules/@rollup/rollup-linux-arm64-musl + + + + @rollup + rollup-linux-loong64-gnu + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-loong64-gnu@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + d06d9cda5a58b5b4ee5e8f0a109903902944ffeff60053dd3c06e6687a04f3bd1fa1116ce2906b0de86294c72b49272b37f7c1ff51d36963b86eac3e7b007331 + + + + + node_modules/@rollup/rollup-linux-loong64-gnu + + + + @rollup + rollup-linux-ppc64-gnu + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-ppc64-gnu@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + b5e4800ae8351b264798f0efd7854d6ef6455fbefd52a593b1decab5333d2486510c8e4d530612212df493323c9b4ea038f07ffe3b69aa5866ada43af1be57da + + + + + node_modules/@rollup/rollup-linux-ppc64-gnu + + + + @rollup + rollup-linux-riscv64-gnu + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-riscv64-gnu@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + fcc3845b76878e3b35a783f0d57938fb77a045ebf1f098bd37a1d4200d487e1f10f9c83d76b7a6bc50946ce5f665e6f3f340702488020547a68ea854e5723912 + + + + + node_modules/@rollup/rollup-linux-riscv64-gnu + + + + @rollup + rollup-linux-riscv64-musl + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-riscv64-musl@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + d471e6b11ca1f38e500e9116cce16d302a61e53b3ef7eca5942ad112e051fef836468800406181442f250cfacf38c9eb74e27e9add562cc382d8a6a8fd4c1cbc + + + + + node_modules/@rollup/rollup-linux-riscv64-musl + + + + @rollup + rollup-linux-s390x-gnu + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-s390x-gnu@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + b1ea1e669e0bffa0f5314ca35a438c454ebf88b9825361236cc4f2006e2820eb35fc8f3663995379ac56d0a05f91474701637b8f6e5ba64b74ae39ce80071070 + + + + + node_modules/@rollup/rollup-linux-s390x-gnu + + + + @rollup + rollup-linux-x64-gnu + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-x64-gnu@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 5a2e805dfd24d0bec4da0b5e36c34752ced433008886c093b3afada90e463f055158c69f96a19e73849df27ebe14d143c3dbc67117aa9362b30438426b50cb62 + + + + + node_modules/@rollup/rollup-linux-x64-gnu + + + + @rollup + rollup-linux-x64-musl + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-linux-x64-musl@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 76d0596230e6090f615be5a012469f7ef45108a9bbebbc16871b055b72f0f3a557cffb8946e0f8dfcfd7bdb653fff07de95b3ca1303c43803401f1dbaf13fdcf + + + + + node_modules/@rollup/rollup-linux-x64-musl + + + + @rollup + rollup-openharmony-arm64 + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-openharmony-arm64@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + d68c7e1aa8115aa681d519f26572fc3c3e84e5fed8c915096270aa2a9373c733f44e4694875d76343ad1f53b7e0bcac9e31e46f4c93c3d0477a3b2aed912aa28 + + + + + node_modules/@rollup/rollup-openharmony-arm64 + + + + @rollup + rollup-win32-arm64-msvc + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-win32-arm64-msvc@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + f062abeb8d0f745357c33204d08ae431650d5289882cb91f7878d7062fe752f165a593fe140f012862a969c8d6e8e5141da348eac51447147653683bf0538759 + + + + + node_modules/@rollup/rollup-win32-arm64-msvc + + + + @rollup + rollup-win32-ia32-msvc + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-win32-ia32-msvc@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 008cbf8dd27b5ad27f17a11c7ce6f61a347d53078ed27e378cd39b40c6faa06c646137cb72737bbd86291be08dde52f1ad09335a730ea0d4874d6e78a606d5c7 + + + + + node_modules/@rollup/rollup-win32-ia32-msvc + + + + @rollup + rollup-win32-x64-gnu + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-win32-x64-gnu@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 505f4a7ec1fdc846a6d148d3c0081d2b46a7950edcf3fa563d4db2563c96705d48d6d84006de965c4e3b708ef5a46899f301afc68841a0b9f1334e0bff08fc99 + + + + + node_modules/@rollup/rollup-win32-x64-gnu + + + + @rollup + rollup-win32-x64-msvc + 4.52.4 + excluded + + + MIT + + + pkg:npm/%40rollup/rollup-win32-x64-msvc@4.52.4 + + + https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz + as detected from npm-ls property "resolved" and property "integrity" + + 6dff4fb546b4bbc2170d5c73453a0540ab0d091cfda8b61f47f329102c65e264685988c07858e0c63d57759af633f18d5694f4e69f8b810387a29603954bbaff + + + + + node_modules/@rollup/rollup-win32-x64-msvc + + + Hiroki Osame get-tsconfig 4.11.0 @@ -19371,10 +21804,14 @@ https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.11.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b0db2a7fb5ca437f086b089518f3a8025a99a350ccaceed353e65c6708bbc8b97bffb4b42709a804c2b3fc89143e14a85ccd0d837bd3d320758827b95dabc379 + + true node_modules/get-tsconfig @@ -19386,7 +21823,7 @@ - + @types deep-eql 4.0.2 @@ -19412,10 +21849,14 @@ https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 73d87d75554c8a030f7386f04ef0b9771aada8967040f78fb168cf96948e9e88dba2bea91aa764e78d657c0ec0a8542be6907505176ad23b98f5d6fcd41c3217 + + true node_modules/@types/deep-eql @@ -19427,7 +21868,7 @@ - + @types ms 2.1.0 @@ -19453,7 +21894,10 @@ https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1ac0822190c4fe9de2f7abed12ac7eedd054197adcef37922b7c303c721a453852fbd3a15885d1ab3b3877a93549553c83dd43acd456c56506869e4a5d06f654 + @@ -19468,7 +21912,7 @@ - + Anthony Fu strip-literal 3.1.0 @@ -19494,14 +21938,18 @@ https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f2bde690833fdbe3e98c7a0eb62016f118378c92c7695ef13f01be6111abbfa14fd30c24feda13a404f1598396d0129d5b097cd954f6b45622e4395139ad0cc6 + + true node_modules/strip-literal - + Simon Lydell js-tokens 9.0.1 @@ -19527,10 +21975,14 @@ https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9b16bd13d21314eb746da9f78fa2f93298f07a01b3ea505098cd4826459e05919c331b68e74f9e59d8c2ff9db10db4b6bf2d24eef20c2b415edb07cbf4e412a5 + + true node_modules/strip-literal/node_modules/js-tokens @@ -19552,7 +22004,7 @@ - + tinyspy 4.0.4 A minimal fork of nanospy, with more features @@ -19577,10 +22029,14 @@ https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6b397eb74cfba70ff3f79f06cbdb2f393bb3a8893ac6af8d4a1789ce7e4c316b564c5cb021a720db0525cca146b6dddcb61c74af64b130ad32cc9391d08112ed + + true node_modules/tinyspy @@ -19592,7 +22048,7 @@ - + Veselin Todorov loupe 3.2.1 @@ -19618,10 +22074,14 @@ https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 09dceaa3044909e2d4ef66c7bd6ab04410652dc304b48bc6ae5bde7fbe24327576028952f58f3152fd48d14fcc34058c84194a228cae120a09d2dfdb6f01db2d + + true node_modules/loupe @@ -19633,7 +22093,7 @@ - + Jake Luer assertion-error 2.0.1 @@ -19659,10 +22119,14 @@ https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2338bc45071f7ea09e3558058a02a58b5b2c92521ba479c261ce809275c662807a82b26ac9e6f2ee3bf5d895108264c09c80e76dc935bb192c4f87733773d604 + + true node_modules/assertion-error @@ -19674,7 +22138,7 @@ - + Jake Luer check-error 2.1.1 @@ -19700,10 +22164,14 @@ https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 38095bf93ed5e0ea7d3b07648e682e611aa771d971e498a87f038052499317e8cd747c334da4ece2c4401a9ccb177a0ecf9c40c831ab3e07880c54260ce4e227 + + true node_modules/check-error @@ -19715,7 +22183,7 @@ - + Jake Luer deep-eql 5.0.2 @@ -19741,10 +22209,14 @@ https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 87993fe54e74209245a737cbea73bd8da6ae99f8cefdfd8d8cafe8601d838f39b8a7d2fedd3f6a5a966a6768406cb3eeb98abdc2b534f164320532f919b3e4e5 + + true node_modules/deep-eql @@ -19756,7 +22228,7 @@ - + Veselin Todorov pathval 2.0.1 @@ -19782,10 +22254,14 @@ https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fff9ec8660f9e5ce3a16e170dbac55ff1140681e4717d5dd6a9ec7241067aca74077afc6c4305a340d7cef43bbf7ef6e7a0eb57192d255cf8e68595f98e6d855 + + true node_modules/pathval @@ -19797,7 +22273,7 @@ - + Justin Ridgewell @jridgewell sourcemap-codec @@ -19824,7 +22300,10 @@ https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 71843ddf5d20aeac6e7966e5f96b885086a251a0dc8fb58eab97d58449633558117ce52163d7f2db34ef7e8a96b2779b87c4a5ef45527056c80af2672ca0743a + @@ -19839,7 +22318,7 @@ - + egoist cac 6.7.14 @@ -19865,10 +22344,14 @@ https://registry.npmjs.org/cac/-/cac-6.7.14.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6fa225bacf9cdd1add0e4f8984b2940107f3ce02c43f2eb0717a92edfff17b51044efb033fa18e446ed216e3ace9c203e5892a7215bf2d765b5f96dcf23ed971 + + true node_modules/cac @@ -19880,7 +22363,7 @@ - + Guy Bedford es-module-lexer 1.7.0 @@ -19906,10 +22389,14 @@ https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8c44280b093c8726f6019ce220e2e10eaa66e7edb0c39b8813a9643bfea370e0aeb1f93a2e1307a575df04b5d367b61dcadd23e15a1442feae18d61b756fa404 + + true node_modules/es-module-lexer @@ -19921,7 +22408,7 @@ - + Emil Bay siginfo 2.0.0 @@ -19947,10 +22434,14 @@ https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c9bc7458ed7ff1b4812c459766f11dee0316dd29f7245956dd3bd7d674446c32d135035a78d37c58ad26781c0f74068e23b4ed4514499ff12cd7386bac21eeee + + true node_modules/siginfo @@ -19962,7 +22453,7 @@ - + Roman Shtylman stackback 0.0.2 @@ -19988,15 +22479,19 @@ https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d573091397d0a358c61fa63fede6e7c0f3811242049d3e10177d9de51d7e557757bde334201309b7ccdf6b15f53f7421570ad87bee7bebe8e400db524b69816f + + true node_modules/stackback - + @radix-ui react-use-effect-event 0.0.2 @@ -20021,7 +22516,10 @@ https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 429f166d93817be6e5829b944fe970db185e2cff2ad286ad73d5299a27a61080b11af14b6261e6f50a30559187b499466d2e80eb227789589a77fd9c5639ce88 + @@ -20036,7 +22534,7 @@ - + @radix-ui react-use-escape-keydown 1.1.1 @@ -20061,7 +22559,10 @@ https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 225d3e6e813bc3f5de6d41f2063ae813e0db072391191f4a2a6213cdb47b3324386a4a4e4583ff6666e102bd031bb466981aa83a765dcb6425bda8c9d90039f6 + @@ -20069,7 +22570,7 @@ - + Microsoft Corp. tslib 2.8.1 @@ -20095,7 +22596,10 @@ https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a0916ef781d06fe29576e49440bef09e99aa9df98bb0e03f9c087a6fa107d30084a0ad3f98f79753a737c0a0d5f373243ae1cf447b525ca294f7d2016b34bfdb + @@ -20110,7 +22614,7 @@ - + Anton Korzunov react-remove-scroll-bar 2.3.8 @@ -20136,7 +22640,10 @@ https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f6bfb28bdfa6814df700a723e886d3f684423bbf16ae24a3eadfdc17c0d605927d68e18f393103bdd503cf51702a29bb4175b0987aad7479d125f840c441b8e9 + @@ -20144,7 +22651,7 @@ - + Anton Korzunov react-style-singleton 2.2.3 @@ -20170,7 +22677,10 @@ https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6fa8d2bf1bd59f2a6d0222e36e458b13f94e9d1e257d3b43025f9e502ed1672f9041673ac11cc8576084eb106e3260f1736a888a1b430990f934f38597b7d105 + @@ -20185,7 +22695,7 @@ - + theKashey use-callback-ref 1.3.3 @@ -20211,7 +22721,10 @@ https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8d02f79519e871a16dbb7574d094e8633ff8424356b30c628c368254d6518914cedc74032ec76ed59b66214bd5e323e9fabbd69b98f4cb44c6fd2eb572e8a34e + @@ -20226,7 +22739,7 @@ - + theKashey use-sidecar 1.1.3 @@ -20252,7 +22765,10 @@ https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 15e770d1a66f921ca7a0f625039597acc080326fa7496759b7a973250ece93c4ba43e56c1e61e94569dd55127c05ed196e47cf7392d1607fb95ebcd770478b45 + @@ -20267,7 +22783,7 @@ - + atomiks @floating-ui react-dom @@ -20294,7 +22810,10 @@ https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e095faac46ad404be59a053cd30672abd453f7a1d925af3cabc869d2905df8badccde0c8e28eae03633ebafc678151e8e0886bf2e89b5f11fafbbd3384016b57 + @@ -20309,7 +22828,7 @@ - + @radix-ui react-arrow 1.1.7 @@ -20334,7 +22853,10 @@ https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 17e335b4b84efa695068e5aca44f16b2d83ecfa3f0c7045df2843c21771e5b3f7691f0266a54d17f4123ae8b907a8ed0b2c10f7c29f4e41e0886cd4af5643fef + @@ -20349,7 +22871,7 @@ - + @radix-ui react-use-rect 1.1.1 @@ -20374,7 +22896,10 @@ https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 41362e0deb12d15b6e1cd36f321f828e5289e0b26272408c500aa3944dfe8fcc3e465469c325f76a91102861736d919da3b5cd1b5b576be6d0a8813b1c85d3db + @@ -20382,7 +22907,7 @@ - + @radix-ui rect 1.1.1 @@ -20407,7 +22932,10 @@ https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1cfc29188ce4976f265b266a1b9da38aa0c9d76c1a3f5d4f6b5946a22c9490812e30b04fd2878afc2f3d7ac6d7af1b24cb9c1eedd7ddf14e7c9e6d128005a957 + @@ -20415,7 +22943,7 @@ - + The Babel Team @babel helper-globals @@ -20442,7 +22970,10 @@ https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f96e9c21291715ad635ec0c475803c1de7af413fc550b871cd1f7da71a6196d65c55aba0a6ce774c709e89603c4a0bb1c694a9de028f8ae61f496a2990b43887 + @@ -20457,7 +22988,7 @@ - + The Babel Team @babel helper-string-parser @@ -20484,7 +23015,10 @@ https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a8c952c4a6e946502b89d0c4c64f769d2a1bc837693e28d4ab60d6ea80e752a77488e1b19908f2aa13088a123dfb3bf82cfc997518ded9c6af58f6c26d69b778 + @@ -20499,7 +23033,7 @@ - + The Babel Team @babel helper-validator-identifier @@ -20526,7 +23060,10 @@ https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0f684ff5e03e4aac75901660cf1661d32d6dadbb94f89a03922130aa1437ea7a1d62a270c842213d274c35dee53a6ff88a8ef696e4cf587db461d6b4c4eb94a3 + @@ -20541,7 +23078,7 @@ - + James Long prettier 3.6.2 @@ -20567,10 +23104,14 @@ https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 23b0088396e802be51d0516d27aac27c3f8b16c587a7cd5da25ac50fc4bbf54f6d6fc033da71ab2677273129f2b3e6e94097d1533aacf619c0f35380037842b9 + + true node_modules/prettier @@ -20582,7 +23123,7 @@ - + Ben Newman recast 0.23.11 @@ -20608,14 +23149,18 @@ https://registry.npmjs.org/recast/-/recast-0.23.11.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 613528f85966c386578967d0286730c1cd752a7a11018833004d84ee65ca0a34af89329286dc41b0de98514041da0b5a0732b378aba7c6153034742e46bca158 + + true node_modules/recast - + Nick Fitzgerald source-map 0.6.1 @@ -20641,10 +23186,14 @@ https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 52381aa6e99695b3219018334fb624739617513e3a17488abbc4865ead1b7303f9773fe1d0f963e9e9c9aa3cf565bab697959aa989eb55bc16396332177178ee + + true node_modules/recast/node_modules/source-map @@ -20666,7 +23215,7 @@ - + Nick Fitzgerald source-map 0.7.6 @@ -20692,10 +23241,14 @@ https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8b9bafb7c0b78a489678d65255935671f64f22d1503ac6135003a47143c677c0ea0f2d6e3948a48ede5d1beb91970caf475d3c15bf4339de06bd77d3d0ddbfb9 + + true node_modules/source-map @@ -20707,7 +23260,7 @@ - + The Babel Team @babel preset-typescript @@ -20734,10 +23287,14 @@ https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 97b59f41f5f458ae0cd2fd91b9d8ee40ae2ef7d052eb22c760499db553cfee5295d35df3afd0f2805b963659dbbd0f4b47e2d2d04833fd702f1b1e54f4c5f47d + + true node_modules/@babel/preset-typescript @@ -20749,7 +23306,7 @@ - + webdiscus ansis 4.2.0 @@ -20775,10 +23332,14 @@ https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1ea679ad69458c6895d2d0e6dd4c7180d46ab0e4e78aaa0a66ed292007e1ed3650306b992be847d1daf24adcb4b22d105e3d627a8a78f929127cf6413cf9078a + + true node_modules/ansis @@ -20790,7 +23351,7 @@ - + diff 8.0.2 A JavaScript text diff implementation. @@ -20815,10 +23376,14 @@ https://registry.npmjs.org/diff/-/diff-8.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b12bb1594e63e5247d4108e2fe8daa32fa9135844339c05382c27f0de09fe2248de205be80d31733bc0520ff9f757671a0d8809c75131a30abf934965dd4432a + + true node_modules/diff @@ -20830,7 +23395,7 @@ - + SysGears INC webpack-virtual-modules 0.6.2 @@ -20856,10 +23421,14 @@ https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ebafd5da2e6141a9c2e75bc140a3c7e1a23c34c01c056e7d15506cfab0bb7861eea4cc9f9f7e2aeeb64813e113949f974debea7d485554181250d496d9f94451 + + true node_modules/webpack-virtual-modules @@ -20871,7 +23440,7 @@ - + James Kyle min-indent 1.0.1 @@ -20897,10 +23466,14 @@ https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 23d8f0327d3b4b2fc8c0e8f7cd59158a4d894ef8296b29036448a02fa471e8df4b6cccb0c1448cb71113fbb955a032cb7773b7217c09c2fbae9ecf1407f1de02 + + true node_modules/min-indent @@ -20912,7 +23485,7 @@ - + Sindre Sorhus ansi-regex 5.0.1 @@ -20938,7 +23511,10 @@ https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + aae2505e54d25062f62c7f52517a3c570b18e2ca1a9e1828e8b3529bce04d4b05c13cb373b4c29762473c91f73fd9649325316bf7eea38e6fda5d26531410a15 + @@ -20953,7 +23529,7 @@ - + react-is 17.0.2 Brand checking of React Elements. @@ -20978,10 +23554,14 @@ https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c361accae90beb62099e569f7ff9d17a03d047de02fd75da9af3169921d1278cbb4ecff8a1c1919931ef3acf0f484ea90777563ab0ff9ee7ae539b1db81b10e3 + + true node_modules/react-is @@ -20993,7 +23573,7 @@ - + Julian Gruber brace-expansion 2.0.2 @@ -21019,7 +23599,10 @@ https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 26dd2f1f233e8e6501aa88c1ec4d4d21869db74bc8d10c63c5dd9312b5bde300f3f84d8b026e6f28c5d7c20e996414c73ee5250e0407297be318175f705d590d + @@ -21034,7 +23617,7 @@ - + Justin Ridgewell @jridgewell trace-mapping @@ -21061,7 +23644,10 @@ https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cf3351f9275048327373c8e869e3fc410a0242bf0db98c76748232b65d507811191c9f6e5ba85e6ecad881bcfc849c1441aa374d608cb667d5f0dbb5b7038b03 + @@ -21076,7 +23662,7 @@ - + Mathias Bynens jsesc 3.1.0 @@ -21102,7 +23688,10 @@ https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fec33774ed853b35e3290849ba8d10d7bdf07f628ea3cb7823cbc7cba945f69a14a7b6ca4f4fcd1c4f1f3d7db73f07e19f291faa70b6c51c4e9d5c395ee18868 + @@ -21117,7 +23706,7 @@ - + The Babel Team @babel compat-data @@ -21144,10 +23733,14 @@ https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 62c992282dbd309c1fd2017c4638eb8392d00a6ca1fa3fe70fcfde3fb7fe05ea104ca62ab3d46859b8c639dcb4fb5124afaf1125931438f5506908ac9c8a3847 + + true node_modules/@babel/compat-data @@ -21159,7 +23752,7 @@ - + The Babel Team @babel helper-validator-option @@ -21186,10 +23779,14 @@ https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 62f8c9a30f45c5b84514a0d2b859d509ed96c57935cd6736d9f15e3d5344696244bbc22b65595d6ba374b87c3366b50cd6297b342f4c969e0c68961b61df494a + + true node_modules/@babel/helper-validator-option @@ -21201,7 +23798,7 @@ - + Isaac Z. Schlueter lru-cache 5.1.1 @@ -21227,10 +23824,14 @@ https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2a9340450037230bfe8d3034bad51555bae1f8996baf516fd1ee7a186cc014e5cdedd93f16f89a0d6f0b1e62b9d8395c1f858fda7ea023cbcdd5a7ac045828f7 + + true node_modules/lru-cache @@ -21242,7 +23843,7 @@ - + The Babel Team @babel helper-module-imports @@ -21269,7 +23870,10 @@ https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d204855943cd5cda29aad20f42f943e56817608e4663690fd9c0afa13f247338db7dc7ee2258d36dc5abba50f50883c85f682dd708216c3cb4f32135a7efebdf + @@ -21284,7 +23888,7 @@ - + Luke Edwards escalade 3.2.0 @@ -21310,10 +23914,14 @@ https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5948f6aa5c5a42d3b883a3eae5cdbd193716183c9df22b4bf334e58a98040b3dc97ac02288e2a8b5df0953aa2d0773c00a01bac64254c9585ba0c4be6e37bf8c + + true node_modules/escalade @@ -21325,7 +23933,7 @@ - + Jordan Harband call-bind-apply-helpers 1.0.2 @@ -21351,10 +23959,14 @@ https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4a9d5a6e52748af0e44b38dc68977112e9cde7f5ef92c149dac30115fabac74af285057fd9bfcac057b6d5c329987b4f3928a3f0af7dff049fa04b9339b9ae31 + + true node_modules/call-bind-apply-helpers @@ -21366,7 +23978,7 @@ - + Jordan Harband es-define-property 1.0.1 @@ -21392,10 +24004,14 @@ https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7b79d17e07d4678acd18bdb7da05205f4e90372c9ecf4e0a76316b17e2d34683979ab3a014a0e0e0109db235bc1274faf5ea9d606991a49c223d560dac2696de + + true node_modules/es-define-property @@ -21407,7 +24023,7 @@ - + Jordan Harband set-function-length 1.2.2 @@ -21433,10 +24049,14 @@ https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a6045ce21278fec363582492f409a74b8d31ddb34c0d39271e02f951a3014ccc899d4f741205a1d51cfe302f5e16ee01b8dfd4c198ca42e63fd6fdeb33b1cc7e + + true node_modules/set-function-length @@ -21448,7 +24068,7 @@ - + Jordan Harband define-data-property 1.1.4 @@ -21474,10 +24094,14 @@ https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ac132f23396903cbfa13e489668a3ef87018aac2eb920ecc49f2229cc3c5866928af0ed7f9d39754942cf904faf731a4cccc9f0e720c3765a2775f8d6cbdd3f8 + + true node_modules/define-data-property @@ -21489,7 +24113,7 @@ - + Jordan Harband object-keys 1.1.1 @@ -21515,10 +24139,14 @@ https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 36e00449439432b9485ce7c72b30fa6e93eeded62ddf1be335d44843e15e4f494d6f82bc591ef409a0f186e360b92d971be1a39323303b3b0de5992d2267e12c + + true node_modules/object-keys @@ -21530,7 +24158,7 @@ - + Jordan Harband array-buffer-byte-length 1.0.2 @@ -21556,10 +24184,14 @@ https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2c713ef01b91ed16060cabe7ae672e4aaded0dc2aff4e1445d0b7f1e96d9858ed5ea1d339545eeb67003f361a2171f6b76278232392fb5cb0fa81c20525d488b + + true node_modules/array-buffer-byte-length @@ -21571,7 +24203,7 @@ - + Jordan Harband arraybuffer.prototype.slice 1.0.4 @@ -21597,10 +24229,14 @@ https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 04da0263a4975cf43b805da8a483f818113e5f0ed4fa91cc60abb38e008ddc6c22688474f5451e29f85ec88af2efb42dac20650b428ad2ae7f4c447fb588773d + + true node_modules/arraybuffer.prototype.slice @@ -21612,7 +24248,7 @@ - + Jordan Harband available-typed-arrays 1.0.7 @@ -21638,10 +24274,14 @@ https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c2f52306d48637bfbb4a3369abff4cd93837e745190f7abad881592db4404756d23250a8d5969e5be049f83d3dd1ee2120864b05c4c359ee0c8788ef5036a3cd + + true node_modules/available-typed-arrays @@ -21653,7 +24293,7 @@ - + Jordan Harband data-view-buffer 1.0.2 @@ -21679,10 +24319,14 @@ https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 12628ee55dce2d7875aed2b6c205d16a7b1a2b5fe6b557535048842345bc464be04f4e647f1687dbd3e588b9e92cfef7c983bad78d90ef640d6bc5b1fc0e42a9 + + true node_modules/data-view-buffer @@ -21694,7 +24338,7 @@ - + Jordan Harband data-view-byte-length 1.0.2 @@ -21720,10 +24364,14 @@ https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b6e8466c4e827d333dfb900d19ffa841bef62b2ff4facdf1294a47bd285f8b3d91c4c16014f8ec5ee44b05532dbccb35e5ac1ee394916fcdc3eb01f87b0eb095 + + true node_modules/data-view-byte-length @@ -21735,7 +24383,7 @@ - + Jordan Harband data-view-byte-offset 1.0.1 @@ -21761,10 +24409,14 @@ https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 052f0f7e6b431a7ae061d3a89c665074b66c95621e08614ff6da5a9f4862d42a3666bd8d2800ecbc6600f17c6e1bfe145a027a0a3b6ff9826707a30cebd40695 + + true node_modules/data-view-byte-offset @@ -21776,7 +24428,7 @@ - + Jordan Harband es-to-primitive 1.3.0 @@ -21802,10 +24454,14 @@ https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c3ee662771ae14bf8d8d5b4996fc9d4a1a84d5e3778773db23bff92c0b1824fff6aadb8c5e37cbd8ba47491aa8e1be1e485e4afc31f5257294007481d945b9d2 + + true node_modules/es-to-primitive @@ -21817,7 +24473,7 @@ - + Jordan Harband function.prototype.name 1.1.8 @@ -21843,10 +24499,14 @@ https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7b98b0ca874e1e16ccaffc8dadcedf0d81b8aa56c8bc8e606a3cb33e76f94c2c32863029ce7421d41305a2ef5bdf449ebd8e3780224a5f27280818cc6ecb96d1 + + true node_modules/function.prototype.name @@ -21858,7 +24518,7 @@ - + Jordan Harband get-proto 1.0.1 @@ -21884,10 +24544,14 @@ https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b1349f063a17069f3d26f20a21e7eac3b53608279bb1cef892263a6b0886a202ada1219b823604fc6ffe97db05dcc5853cd73d21ca0e0b83837ca1dfc459a9d2 + + true node_modules/get-proto @@ -21899,7 +24563,7 @@ - + Jordan Harband get-symbol-description 1.1.0 @@ -21925,10 +24589,14 @@ https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c3d50ca96c09c4734ebe8373489da83c5e70bd872f3fb8d4bd8ce1a7aef21214e2d7b6430410b5cfda53746bb38c3f84148a8b4984707998ea7e23f3434e846e + + true node_modules/get-symbol-description @@ -21940,7 +24608,7 @@ - + Jordan Harband is-array-buffer 3.0.5 @@ -21966,10 +24634,14 @@ https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0c37c03548a21b6c02d6a6b03faeaa953ba025e2f91f2ccca5fafc94b2be8cc422ac6ccda1dd01d7670507ff6af37f11bb6eec0707f0efcfeb76853b444473e8 + + true node_modules/is-array-buffer @@ -21981,7 +24653,7 @@ - + Jordan Harband is-callable 1.2.7 @@ -22007,10 +24679,14 @@ https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d410b40551614bfa74aadc3a7a7a7c7bef0e0f452b2b4a052f3b528cdce170a037583b89c7100f5f33ee3ed2a48c463d514a045a55fff1f80a7aed92f22f494c + + true node_modules/is-callable @@ -22022,7 +24698,7 @@ - + Jordan Harband is-data-view 1.0.2 @@ -22048,10 +24724,14 @@ https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 44ab5617ca46992f3b8b60fa82a42efe5ec461195575fcde98224dfcfdd43acfffc75404ee67e1bf31c802905345fedac6f4fa0cc1b04b00576024f49df07dc7 + + true node_modules/is-data-view @@ -22063,7 +24743,7 @@ - + Jordan Harband is-negative-zero 2.0.3 @@ -22089,10 +24769,14 @@ https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e4aa08bb6360a727a4ef98d7a1d16f9da7c1e83260af7bbcbae2b42c46498eb535f43acc0f7115111691f2c8f3f0208682966fc4f97d4ae13518c54f147c759b + + true node_modules/is-negative-zero @@ -22104,7 +24788,7 @@ - + Jordan Harband is-regex 1.2.1 @@ -22130,10 +24814,14 @@ https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 32362c2873b93bb982b26446c5670b5a1785a8df4327fd939a782f8ca5e285ee9e7d588fa9cdbbe3e171ff87d88ffaf4dfe112bc17535cad15ead037ae07b3d6 + + true node_modules/is-regex @@ -22145,7 +24833,7 @@ - + Jordan Harband is-set 2.0.3 @@ -22171,10 +24859,14 @@ https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 88f0237abaec7b6effca018bc70f84051f5a82ff58eae2de61524cbbe40d0a8a2e275ff5ae2d261ab716a5f0aa159bb3cf1dd68edc311b4f7c5fe9f83ae4643e + + true node_modules/is-set @@ -22186,7 +24878,7 @@ - + Jordan Harband is-shared-array-buffer 1.0.4 @@ -22212,10 +24904,14 @@ https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 21259a73c76bbf86467f02a5e6c9691c6f4ec0f36dcb88ce58f448841a713a80fe86a2138b0ba2a4e4366cdb61033c00dc1e1f2233b83659fbe0dd12f5bcaaf0 + + true node_modules/is-shared-array-buffer @@ -22227,7 +24923,7 @@ - + Jordan Harband is-typed-array 1.1.15 @@ -22253,10 +24949,14 @@ https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a7711cb227178e2b7b49ab245c7b35840f75431813c38e85bfa10528a192e434452c3f322a7a218c5de1c688eef786ff39c319a10ba4ce93e9044f6e2d52b381 + + true node_modules/is-typed-array @@ -22268,7 +24968,7 @@ - + Jordan Harband is-weakref 1.1.1 @@ -22294,10 +24994,14 @@ https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ea2f661964a5ab334c12aa42a7ddcac114b5b943a8764d8e27a6feb2aed93c34b2d96b88e4d148c69ff6e784f2b51f1fb5e7dec645a7e713621d43693ce7d27b + + true node_modules/is-weakref @@ -22309,7 +25013,7 @@ - + James Halliday object-inspect 1.13.4 @@ -22335,10 +25039,14 @@ https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5baee22e5e09d845c41936df78709f7eb8c37e2b6f2c0360d14957df01545124f1f762974457a0307515812a84fb0be101b8b85aa8c683d733cac4d5d84a5b7b + + true node_modules/object-inspect @@ -22350,7 +25058,7 @@ - + Jordan Harband own-keys 1.0.1 @@ -22376,10 +25084,14 @@ https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a853b22b93e389665df9040887ed6385d6fd2e9c53174aacecf9bca39407619d0cdef2aa4aacec65a101ea85a5c59faadac241308fcab607763796704284477e + + true node_modules/own-keys @@ -22391,7 +25103,7 @@ - + Jordan Harband safe-push-apply 1.0.0 @@ -22417,10 +25129,14 @@ https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 88a13dc3f67bc42cd430866a741b29ea9110bf0b8479b1f8bdda637035a7cb3688eb297a3bd147bd5a6619e96f10736ca18eb019b964c51e99b72fe1d345a248 + + true node_modules/safe-push-apply @@ -22432,7 +25148,7 @@ - + Jordan Harband safe-regex-test 1.1.0 @@ -22458,10 +25174,14 @@ https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c7ff82cf862b8a643141c7097f998a11b21ad4dcde091348e44725fde92695869a9a974d2cf6a557221c09934d1f732f9aa06e815e53318657bf4963b255256b + + true node_modules/safe-regex-test @@ -22473,7 +25193,7 @@ - + Jordan Harband set-proto 1.0.0 @@ -22499,10 +25219,14 @@ https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 44945dbc2a3a2009cf76cbcfffb9ba6ec42a3679f5142057e5936d14bf7c326145ff8c402094c883561b1d6e430b65b948a65a9eb0ba8b81ec26a95a8f0fdd67 + + true node_modules/set-proto @@ -22514,7 +25238,7 @@ - + Jordan Harband stop-iteration-iterator 1.1.0 @@ -22540,10 +25264,14 @@ https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 78ba175bf0c7ca5eb6cf1638482688827461b8cafaae2e23b84600452f04eac084ab32a93a2139db551ca1f771f8a9c3665e719af19869a2829391443b1242a1 + + true node_modules/stop-iteration-iterator @@ -22555,7 +25283,7 @@ - + Jordan Harband string.prototype.trim 1.2.10 @@ -22581,10 +25309,14 @@ https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 46ceba1743ffd6479d9399726321fdb81cee888fe43519b024047daae2ba54eb48a59d86fa131977e1d06dbbf6e4c80203a8047dfa0c658c654e877859c76b28 + + true node_modules/string.prototype.trim @@ -22596,7 +25328,7 @@ - + Jordan Harband string.prototype.trimend 1.0.9 @@ -22622,10 +25354,14 @@ https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1bb3a4e42e84fe3e1219fc8b0a5a174eb9e0408414dcf5ad5c6b2ddf233b05e6bd1515117f54b8d991e5659b6c36ab9ed853763e85217d95d82cd5b012be1d2d + + true node_modules/string.prototype.trimend @@ -22637,7 +25373,7 @@ - + Jordan Harband string.prototype.trimstart 1.0.8 @@ -22663,10 +25399,14 @@ https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 517487dbad82499635b5fbb71b749e72beae18b08554f32122a1e3960094b4209c82285873fc4ab3d76331331439bda3d66552794f0453a35673f890294e867e + + true node_modules/string.prototype.trimstart @@ -22678,7 +25418,7 @@ - + Jordan Harband typed-array-buffer 1.0.3 @@ -22704,10 +25444,14 @@ https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9c0618c1f637aa7cd7df422403a01066355bb4ae9db86a27b5c426d56486d4c0fde182ea2b4e75e46340a57928c4a39632eb15b2c00758b87d49e6a879f6051b + + true node_modules/typed-array-buffer @@ -22719,7 +25463,7 @@ - + Jordan Harband typed-array-byte-length 1.0.3 @@ -22745,10 +25489,14 @@ https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 05a5e03ae231cfc9fca48ab77bb02d83feecf83a6262bc67e2f768b77c3d29b9c185c450abaa37c5e9907487f29ea49e5de0eb177db1f96bdfce63a33e263d96 + + true node_modules/typed-array-byte-length @@ -22760,7 +25508,7 @@ - + Jordan Harband typed-array-byte-offset 1.0.4 @@ -22786,10 +25534,14 @@ https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6d3940141fc505831cb97f3581b2f839ca47e4f9a5147aa5082a4097c025133333e64e77a0d0ef37ca753cd3962c4988db1e28ae9deb68e141e75b6ff57f8c15 + + true node_modules/typed-array-byte-offset @@ -22801,7 +25553,7 @@ - + Jordan Harband typed-array-length 1.0.7 @@ -22827,10 +25579,14 @@ https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + dca4b66fe90bedfb2e93f78967b1107671264286a1a3fafa29479fee1c6f96d340e4347c34050cfbcc0931b2726781bdffb8b7bf9ccf04830de5ac9b021dbf26 + + true node_modules/typed-array-length @@ -22842,7 +25598,7 @@ - + Jordan Harband unbox-primitive 1.1.0 @@ -22868,10 +25624,14 @@ https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9d627dd438de3a47a3fd303ca574379b2aee2a9284620aafa70f65cf838f1e3fcd585365b98ae36f3f63d35089f322907768388c5a0e9083424d6d88e4b104cb + + true node_modules/unbox-primitive @@ -22883,7 +25643,7 @@ - + Jordan Harband which-typed-array 1.1.19 @@ -22909,10 +25669,14 @@ https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ac4bebf7405c938599b7d1c7142e0324cb23beeef1fabe9b226cf4fc1adb59bec0d9d8c9f219d932b5a71e8f45f2cb2fd0e304adab0385fb6b7d1393caa483af + + true node_modules/which-typed-array @@ -22924,7 +25688,7 @@ - + Jordan Harband has-tostringtag 1.0.2 @@ -22950,10 +25714,14 @@ https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 36a00307c5633c52ccd95d15bc751ec30c2cc3465605a21d828fa2787b4ade16ac2f3e2a78246361ca9f07a010ac182044aa69285f0be76fd5a9d56c3b8ec397 + + true node_modules/has-tostringtag @@ -22965,7 +25733,7 @@ - + Jordan Harband dunder-proto 1.0.1 @@ -22991,10 +25759,14 @@ https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 28837f9c3241411717c3430b561644f62407986ebca80548060f42aa65188e64088608a3f54e4c16faea9142f915bb72cb366e39e3add3375e45ee1463b72df8 + + true node_modules/dunder-proto @@ -23006,7 +25778,7 @@ - + Julian Gruber isarray 2.0.5 @@ -23032,10 +25804,14 @@ https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c478e10ebddc3412b40737542523d7667b50531fe6c0c4b9470e00ee53c9f745c600ee8848ffde3c336ea34be1a8e654f940f9268a1dc02000a1941ddc57802b + + true node_modules/isarray @@ -23047,7 +25823,7 @@ - + Julian Gruber balanced-match 1.0.2 @@ -23073,7 +25849,10 @@ https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + de849e50ed13315ebb84dd4099b5ec2b8c9aa94eed8e21e56f144364ea47d0a5bdf82797e1b440697d009f1b74b71d8cae94695b041a3f02252121098585393f + @@ -23088,7 +25867,7 @@ - + James Halliday concat-map 0.0.1 @@ -23114,10 +25893,14 @@ https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fd2aefe1db30c903417e8846a73f68e986f71b3dd2ad40ea047e6b4ee84647b6a1b656d82a7571c366c214c4658da03b1171da5d9f30b07768745bdb9212a6aa + + true node_modules/concat-map @@ -23129,7 +25912,7 @@ - + Jordan Harband functions-have-names 1.2.3 @@ -23155,10 +25938,14 @@ https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c5c901517c9322a4fdeedab6c7600c6fe835eb76f9245cac624d31e2ac4d1706df42498d6688911dbeac3f323dfd0577dd67aebd5601508883e0dccd232a9a45 + + true node_modules/functions-have-names @@ -23170,7 +25957,7 @@ - + Jordan Harband side-channel-list 1.0.0 @@ -23196,10 +25983,14 @@ https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1422c7b510ff827a428821c48892cec1d9853fec330a60c491cf72ecdb18c5e178bbb06db27d59bb0830246c4898898789c240acb3f8474c97e1cd8a0ab32b4c + + true node_modules/side-channel-list @@ -23211,7 +26002,7 @@ - + Jordan Harband side-channel-map 1.0.1 @@ -23237,10 +26028,14 @@ https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5428c235f80cb1bcb7b53768d369db8ed33f7b0adaea33c79a94e17a7913621f291bdb9c67fd4ff12a38bb814605e93f063a4e56c0c23282c0fe2b8128815744 + + true node_modules/side-channel-map @@ -23252,7 +26047,7 @@ - + Jordan Harband side-channel-weakmap 1.0.2 @@ -23278,10 +26073,14 @@ https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 58f4bf1ef1d04d89c78ac2e8f4c72a0473899361641cefed969be5772ae77a6e1a790a7885a8b7832b61b3083aa74d684a84e5e7cadca621408c5d9baf6024d8 + + true node_modules/side-channel-weakmap @@ -23293,7 +26092,7 @@ - + Sindre Sorhus parent-module 1.0.1 @@ -23319,7 +26118,10 @@ https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 190d84591a5057cfe8f80c3c62ab5f6593df3515996246e2744f64e6ba65fe10b7bed1c705f1a6d887e2eaa595f9ca031a4ad42990311372e8b7991cb11961fa + @@ -23334,7 +26136,7 @@ - + Sindre Sorhus resolve-from 4.0.0 @@ -23360,7 +26162,10 @@ https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a5bfcc6265ecb40932b11171f2988d235b4614d408140def904dc6ab812e035745ea01e9ffebe066ab021896a9bf2f0ddd0fb8a3b170beab8f25c9d9ed1632e2 + @@ -23375,7 +26180,7 @@ - + argparse 2.0.1 CLI arguments parser. Native port of python's argparse. @@ -23400,10 +26205,14 @@ https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f3ef56a9e6db173a57f4e47e59ae8edbd6ac22881e44ccdc1ad00835da4c1c7c80835d1fd3969215505b704a867ff3d7c35123019faadbf6c4060dc3beeacadd + + true node_modules/argparse @@ -23415,7 +26224,7 @@ - + Mathias Bynens punycode 2.3.1 @@ -23441,10 +26250,14 @@ https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + bd8b7b503d54f5683ad77f2c84bb4b3af740bbef03b02fe2945b44547707fb0c9d712a4d136d007d239db9fe8c91115a84be4563b5f5a14ee7295645b5fabc16 + + true node_modules/punycode @@ -23456,7 +26269,7 @@ - + Heather Arthur color-convert 2.0.1 @@ -23482,7 +26295,10 @@ https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4511023ec8fb8aeff16f9a0a61cb051d2a6914d9ec8ffe763954d129be333f9a275f0545df3566993a0d70e7c60be0910e97cafd4e7ce1f320dfc64709a12529 + @@ -23497,7 +26313,7 @@ - + Sindre Sorhus has-flag 4.0.0 @@ -23523,10 +26339,14 @@ https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1329094ff4352a34d672da698080207d23b4b4a56e6548e180caf5ee4a93ba6325e807efdc421295e53ba99533a170c54c01d30c2e0d3a81bf67153712f94c3d + + true node_modules/has-flag @@ -23538,7 +26358,7 @@ - + Sindre Sorhus shebang-regex 3.0.0 @@ -23564,7 +26384,10 @@ https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + efef9d161b5cc77df9dee05aabc0c347836ec417ad0730bb6503a19934089c711de9b4ab5dd884cb30af1b4ed9e3851874b4a1594c97b7933fca1cfc7a471bd4 + @@ -23579,7 +26402,7 @@ - + Isaac Z. Schlueter isexe 2.0.0 @@ -23605,7 +26428,10 @@ https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 447c4c2e9f659ca1c61d19e0f5016144231b600715a67ebdb2648672addfdfac638155564e18f8aaa2db4cb96aed2b23f01f9f210d44b8210623694ab3241e23 + @@ -23620,7 +26446,7 @@ - + Andrea Giammarchi flatted 3.3.3 @@ -23646,10 +26472,14 @@ https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 197fb2b30e0f042cf43f3a2c1c37a964600d12e14230bae7453884cbd31c1a39a409063046ae00fd7efce86fdf8ccffe3a3b16494d59ad8e6ac8045998efeec2 + + true node_modules/flatted @@ -23661,7 +26491,7 @@ - + Jared Wray keyv 4.5.4 @@ -23687,15 +26517,19 @@ https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a3154790747f1097f608d5e75b144b5ba9a0ec9c82094706d03b441a62f672d528d4f3538a7d4f52297eafffb8af93295600bf7e7d648ecc7b9a34ae8caa88a7 + + true node_modules/keyv - + Sindre Sorhus p-locate 5.0.0 @@ -23721,10 +26555,14 @@ https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2da363b51594058fbecc1e6713f37071aa0cca548f93e4be647341d53cdd6cc24c9f2e9dca7a401aded7fed97f418ab74c8784ea7c47a696e8d8b1b29ab1b93f + + true node_modules/p-locate @@ -23736,7 +26574,7 @@ - + @csstools css-calc 2.1.4 @@ -23762,10 +26600,14 @@ https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + dcdf286a3fb48ee530ff51f76309830c95c281307580a53a1dcfdb079d36bbdcd1d2adaf77bf3a5c91fd41faca2048059599a1662aba7a95e5e2b1ea873b0881 + + true node_modules/@csstools/css-calc @@ -23777,7 +26619,7 @@ - + @csstools css-color-parser 3.1.0 @@ -23803,10 +26645,14 @@ https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9dbb4ac21ddaeb1355229fd546e5d5eb8c932a76f52234c01048778abcd2f8790a8c03982d318d6fda6654d9ed67c8950477160c0d83a1fd10b4f80523505a4c + + true node_modules/@csstools/css-color-parser @@ -23818,7 +26664,7 @@ - + @csstools css-parser-algorithms 3.0.5 @@ -23844,10 +26690,14 @@ https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0da0de5245d92a374686061a1cd25357da55ed8f41ddbeb8e2308bb3d52973755e34683a2d6011013e8ef90fbf08ea3eda083f6cce6b869300b5fef45aa7c175 + + true node_modules/@csstools/css-parser-algorithms @@ -23859,7 +26709,7 @@ - + @csstools css-tokenizer 3.0.4 @@ -23885,10 +26735,14 @@ https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 55dffd1150e2bba3cf26df72021eaba193fa125d711eb76f2151a3c81b07474458c0d1e02fb1493f22085b87c0349346e85b7265fbe544fa4523864cfe5b9bbf + + true node_modules/@csstools/css-tokenizer @@ -23900,7 +26754,7 @@ - + Rémi Berson tldts-core 6.1.86 @@ -23926,10 +26780,14 @@ https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 25eea9ee9924f8a33332fd975ca98013731c9a894e40577190ac3447c11836beec10b5b8e89aa735e4d7f326cf89082f835ca60a817c2d7b397f315a66f24f4c + + true node_modules/tldts-core @@ -23941,7 +26799,7 @@ - + Nikita Skovoroda safer-buffer 2.1.2 @@ -23967,10 +26825,14 @@ https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 619a372bcd920fb462ca2d04d4440fa232f3ee4a5ea6749023d2323db1c78355d75debdbe5d248eeda72376003c467106c71bbbdcc911e4d1c6f0a9c42b894b6 + + true node_modules/safer-buffer @@ -23982,7 +26844,7 @@ - + Titus Wormer decode-named-character-reference 1.2.0 @@ -24008,7 +26870,10 @@ https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 73a7dc125355e9286d6579ac80d805155e6d557d8f695e20f8c38091bf1e5c7be7eacaf2241ad96bdaf4cd5ebe76d4f2a022b1b43cb9b7243967042e89db5df9 + @@ -24023,7 +26888,7 @@ - + Titus Wormer mdast-util-to-string 3.2.0 @@ -24049,7 +26914,10 @@ https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 578667fe773237540d4aa481c53acc38ba63afe20a747976bf72952e85a60cfb1c3f8afd19c0a2ef582382f515d521522a1f76023006e29785b81976fd880226 + @@ -24064,7 +26932,7 @@ - + Titus Wormer micromark-util-decode-numeric-character-reference 1.1.0 @@ -24090,7 +26958,10 @@ https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9bd5741311afd23075393db59ab59cb9fe1084fe3aa47d4a91f5b2f5911ecea1ca031923e263c2cb79c81f5ae46dd3250a12c75f9df578eaf29a5c326487f68b + @@ -24098,7 +26969,7 @@ - + Titus Wormer micromark-util-decode-string 1.1.0 @@ -24124,7 +26995,10 @@ https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 62984b1822bc80cd6d1b56dde786b3c32ad0463085726823d92d86a090cd9e1e2f62d9cbdfc252f0ce20a71cce3cdc8774d12985ec965c24e79d30d8dcdf8d55 + @@ -24132,7 +27006,7 @@ - + Titus Wormer micromark-util-normalize-identifier 1.1.0 @@ -24158,7 +27032,10 @@ https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 37ec39be1aab0628618dda4cf3ee57b31cbbd505aa1a7ec760d52f721ef5895d8f33bf84dee586a31d50a7dd25a1ad5ea61b42c46d9fb5157f0a89e2b5ce8fd9 + @@ -24166,7 +27043,7 @@ - + Titus Wormer micromark-util-symbol 1.1.0 @@ -24192,7 +27069,10 @@ https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b848e911863a28cb3583b41f276797d5240457e653e2b503dd4705ea5e7b69c66f2cd2bb3c164bfadcbcd99d6a84ad7fc97218e1b771d3814a3204748382006a + @@ -24200,7 +27080,7 @@ - + Titus Wormer micromark-util-types 1.1.0 @@ -24226,7 +27106,10 @@ https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ba44418227bc4c801c69cb1c5474a275d1e33b893fab7a6779d9b3310e22c0370ad05b450a884a3a515b68e2ff98f81f9cfb0bdc2d59cb125ae2c6d6ac19778e + @@ -24234,7 +27117,7 @@ - + Titus Wormer micromark 3.2.0 @@ -24260,7 +27143,10 @@ https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b83ebab498f9e092d8ab40ded740215b271958640d52f0c8e79c4f824dac40ce649f52589616c2313b44793dbbfaf0215b61414312e53a64b7a6603bff6cf868 + @@ -24268,7 +27154,7 @@ - + uvu 0.5.6 uvu is an extremely fast and lightweight test runner for Node.js and the browser @@ -24293,14 +27179,17 @@ https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fa0f043517b2afc62c39ce9fbff35526cdaf15d1c19c135d7c4e3daec86b4f30d63a5531e06abb28e4b6183f1eaa1cb68fe123ab6f7e49b287f328e402a5eaa0 + node_modules/uvu - + diff 5.2.0 A JavaScript text diff implementation. @@ -24325,7 +27214,10 @@ https://registry.npmjs.org/diff/-/diff-5.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b88143c6aa5164667a4e13a4f388447ea5a81f1d9d7af445be94d97131eeafce6f2267dac546d35bd4728780a90ae0e74e838fd4212d5ca220cad1c13d57dfe4 + @@ -24350,7 +27242,7 @@ - + Titus Wormer mdast-util-definitions 5.1.2 @@ -24376,7 +27268,10 @@ https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f1254f32e1ea94f304ff3de0a95c16638cd55e7f25a8abffa40842e7b16e278d08997c81a663b9ba487df33076bfb065aa5d858878c7bfd2d5ced488aa363e30 + @@ -24391,7 +27286,7 @@ - + Titus Wormer micromark-util-sanitize-uri 1.2.0 @@ -24417,7 +27312,10 @@ https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 40ee065efd1765f59ecb8a5816774b50a10092d2a41b99194dd50d693024cdbb89c67dad3413abf90b714765e959a3216c8993d9d3f3c8bacf5cb94f869877e0 + @@ -24425,7 +27323,7 @@ - + Titus Wormer trim-lines 3.0.1 @@ -24451,7 +27349,10 @@ https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9118fc07e60764273d91061d59f241dbfa1497dac0f7da9ba3061806daf8ba2e26672010d89a6f54177fe94d989680137ea06105348c853a60047b54d0c7f746 + @@ -24466,7 +27367,7 @@ - + Titus Wormer unist-util-generated 2.0.1 @@ -24492,7 +27393,10 @@ https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a85ef690b98fc40c34a0dd9fc29588a9b5c057212a5330c732c6ed3ef3ae748954cd760521e408bb15d0091085876d81edc8b1bd4d0c1bb9b7316f054eafd2f8 + @@ -24507,7 +27411,7 @@ - + Titus Wormer unist-util-position 4.0.4 @@ -24533,7 +27437,10 @@ https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 914044f7579f3967c8541a3cc7387fb9943ba7d7df611b546cc45904d158c1fd112bc92850cc7a74651fc3294b38a99a4f672ce30496f7a42861449703212da6 + @@ -24548,7 +27455,7 @@ - + @emotion hash 0.9.2 @@ -24574,7 +27481,10 @@ https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 332aa5893646b8e9b7fb965149a68118fdd448bc3af841b2924c199ecd843c2e60f23278cfd3ab75963d6a9925dfe50ff7eb1dcfbe98624c0228fe6087c898de + @@ -24589,7 +27499,7 @@ - + Kent C. Dodds babel-plugin-macros 3.1.0 @@ -24615,14 +27525,17 @@ https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0a0ed3146a48af4d6f39034e0d738e686cf6369094e6097cc75a8915b6fa85b67147b5eb704dafb5b02c4c06c9effc7026d52e244c3c2bc66bfc01342c795eb2 + node_modules/babel-plugin-macros - + James Halliday resolve 1.22.10 @@ -24648,7 +27561,10 @@ https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 34f472fbf9dc20c78395302cbaac0a2227deae26b085e7c526d90d496d2a64912a3046fea81b7fefb07f8c679e7a4f85d2e39e374e420dae875db6c882d557e3 + @@ -24673,7 +27589,7 @@ - + jsdnxx find-root 1.1.0 @@ -24699,7 +27615,10 @@ https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 34a7d6e9b79ce867ca734486c757b4ed0658f4f13df6ed017edff4af3483e64dec3bfbf09155290d42959b91a9a7951edd87d284f1535f6d3bd2d0ece6407d36 + @@ -24714,7 +27633,7 @@ - + @emotion unitless 0.10.0 @@ -24740,7 +27659,10 @@ https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 745a0c52e400db4cefb554eec59c30e8e1e825882bcdf28cd6de76995c920c99cc4846b4f2bb84bdd6106e1bf2bbab2853e35e2d5777c8a7d37d3d0d795eaa1a + @@ -24755,7 +27677,7 @@ - + Jon Schlinkert fill-range 7.1.1 @@ -24781,7 +27703,10 @@ https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 62c1a97b75872caf19622e2d583836272dde6d1cf6ad7a300f19e57786e4401d3471cff5670f405a70b48bdced0c98ad8afb50bda23d29a2f22ab73e8415b4ca + @@ -24796,7 +27721,7 @@ - + Sindre Sorhus binary-extensions 2.3.0 @@ -24822,7 +27747,10 @@ https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 09e87eee8c79a9eecb26e2c7a18d1f7a1de91ee5031c071151ec8bd95620859c1fa64348cbffbc39c8346b752e4a86336af9b2970b8b59039fde19748e330c23 + @@ -24837,7 +27765,7 @@ - + @nodelib fs.scandir 2.1.5 @@ -24863,7 +27791,10 @@ https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + beadb806adf29b91c4426d8d282af7c970f08dceef4ec1138510e7929d832bda75baa2d1f831eeae6fcd393a34286ec760753b7a9a4a663dcccaa62e3017fada + @@ -24878,7 +27809,7 @@ - + Matteo Collina fastq 1.19.1 @@ -24904,7 +27835,10 @@ https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1b02d3cb19025e35dbc6a2214ec308d8dba2f21b8c3ed9f183b92b6a33c90239c41bf8a2392ee2fb30ad586651f46d0d04a6d72a1e97f66f5422c617fcdeafbd + @@ -24919,7 +27853,7 @@ - + Sindre Sorhus pify 2.3.0 @@ -24945,7 +27879,10 @@ https://registry.npmjs.org/pify/-/pify-2.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b9d82c018f9f4e7befee423b69ac5bab058d6f4007881d2a04ef3d3d928f9284e618e81d6eb1c3283fb40765f8b937c9fc54f5474f6bf604ec8d48cd268b6ea2 + @@ -24960,7 +27897,7 @@ - + Isaac Z. Schlueter foreground-child 3.3.1 @@ -24986,7 +27923,10 @@ https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 8085e32aab45b96120cc544903d58241e4892d90e380950e302333c6dbc5abfdfb2a88ccd41146b9faac0b2d2be2a4909982ec65831ec91ab321638cba9d37b3 + @@ -25001,7 +27941,7 @@ - + Isaac Z. Schlueter jackspeak 3.4.3 @@ -25027,7 +27967,10 @@ https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 386959429cf6c9f6a103f45dd58f0277d48812caaf5e42d5a12c3f720c219e114c0dbb1015e658a0927b6c86414bd05c6a6516f7a6acabf9e93d6ba033e45007 + @@ -25042,7 +27985,7 @@ - + Isaac Z. Schlueter minipass 7.1.2 @@ -25068,7 +28011,10 @@ https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a8e3b34b57014d6605e011fc7d578f0c138ef62a6d327194119c0d73f70c5a74d5da754b67b56835610f1e461ccd9034a5da00edd97a7bb14beb9f675fd4b66b + @@ -25083,7 +28029,7 @@ - + Isaac Z. Schlueter package-json-from-dist 1.0.1 @@ -25109,7 +28055,10 @@ https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5046484b7fdbcb8382f2f2f73f67535d1113a5e6cb236362239bc8ae3683ff952dae4157fed35bc234d2440182ffeec2028da921c05a4605a670104772c68223 + @@ -25124,7 +28073,7 @@ - + Isaac Z. Schlueter path-scurry 1.11.1 @@ -25150,14 +28099,17 @@ https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5dae0dc35ec54bd02940527dba62e2252e28ac68e6ed9cf052bc1a99c190b874b30f2b61f5ba0a0dac9c61d0dc643baa6004d7c381c55e06aa59372d5bfbf51c + node_modules/path-scurry - + Isaac Z. Schlueter lru-cache 10.4.3 @@ -25183,7 +28135,10 @@ https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 24d03365c5eb0ade365462ee633d337c0cc37c0bc9596e807d8943050c835790c2948da6e6c0262be3883bbb39f577ec46c587a74da3009ad169d3d1193b7a49 + @@ -25208,7 +28163,7 @@ - + Kevin Beaty any-promise 1.3.0 @@ -25234,7 +28189,10 @@ https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ed4be629a95646dd708232f546b1b1a12256ff44191487a0a5e1af646f648e9f2fad1bb9e574c76f09eaab61a95e6f6e2db72e8719b722a5fd381e0c651d5bd8 + @@ -25249,7 +28207,7 @@ - + Jonathan Ong thenify-all 1.6.0 @@ -25275,7 +28233,10 @@ https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 44dc501ffa88f3fb77b615c90f072cb543b8cdeaa8eb8f94cbffac355441c785e7d8e5fe399f683fe8899cd16aa6516b6b665455e28249ada85568b74f8b9598 + @@ -25290,7 +28251,7 @@ - + Greg Bergé @svgr babel-plugin-add-jsx-attribute @@ -25317,10 +28278,14 @@ https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6fd30893bca1752d6930264cf1578d7d4952295461b0764d325e4ef527da5f4974b79c23760bb8203cc607c6e99c60413a31924f7ad1155b1a684b48e16e9fee + + true node_modules/@svgr/babel-plugin-add-jsx-attribute @@ -25332,7 +28297,7 @@ - + Greg Bergé @svgr babel-plugin-remove-jsx-attribute @@ -25359,10 +28324,14 @@ https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 05c0a49bf4938a92af6c297a6fb405acc87fbf1d34bc83fade4d9e33ae8c7c72733ebe8ed94d236045625e41c95aa5ea4188dd780f5cb829792969a5c230ef6c + + true node_modules/@svgr/babel-plugin-remove-jsx-attribute @@ -25374,7 +28343,7 @@ - + Greg Bergé @svgr babel-plugin-remove-jsx-empty-expression @@ -25401,10 +28370,14 @@ https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e417060817c1c41e7e5d20d25a78534e17c8f6370ee5fd008b6576e206691bec17175e01cf0c717436f883ab6b74ebb1d2b8626c6b37f3905e14c4a6c6d4b7b8 + + true node_modules/@svgr/babel-plugin-remove-jsx-empty-expression @@ -25416,7 +28389,7 @@ - + Greg Bergé @svgr babel-plugin-replace-jsx-attribute-value @@ -25443,10 +28416,14 @@ https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 29543e3ed2236f506e613de1b7c33929bcd60617408e350f76532da6ec3f5634fc7284eb22d597e9069f97dfa38bcdf525a25cbba3c934a095d1ba74d6504dcd + + true node_modules/@svgr/babel-plugin-replace-jsx-attribute-value @@ -25458,7 +28435,7 @@ - + Greg Bergé @svgr babel-plugin-svg-dynamic-title @@ -25485,10 +28462,14 @@ https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a263622aac23366390276bfa81ee1212b05b928a15d9a016c1a3c5b36bd463ba7b1a1564cd1909d349082d742f46103a9a21e73695efecc4679d28dd4632bca2 + + true node_modules/@svgr/babel-plugin-svg-dynamic-title @@ -25500,7 +28481,7 @@ - + Greg Bergé @svgr babel-plugin-svg-em-dimensions @@ -25527,10 +28508,14 @@ https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 994447627bba230dd40536e11b013fbec9e0b4221b1c4e37c4244aee40b0e2dd35c721aa6f63ddf965de91146814e048636f59a0e85409313078331dae37e2f6 + + true node_modules/@svgr/babel-plugin-svg-em-dimensions @@ -25542,7 +28527,7 @@ - + Greg Bergé @svgr babel-plugin-transform-react-native-svg @@ -25569,10 +28554,14 @@ https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4f1f13e7c087a3eee7c09f84854c31dcb7dd3521bd47638a7da2175ece6ca22cb91ed8280049036b2f4b22298b39c1bc749407d703d9a7f72702fe92f42ad1d5 + + true node_modules/@svgr/babel-plugin-transform-react-native-svg @@ -25584,7 +28573,7 @@ - + Greg Bergé @svgr babel-plugin-transform-svg-component @@ -25611,10 +28600,14 @@ https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0c5c7cc5addc6574dd6ff93791f3de6a2c5e7102e02a1e4d5413300f4010c4ecdc65ac0ae28a35261f4b6eb7000948afb0203b4cb1bc79e5a0ac35e34cc8519b + + true node_modules/@svgr/babel-plugin-transform-svg-component @@ -25626,7 +28619,7 @@ - + Sindre Sorhus parse-json 5.2.0 @@ -25652,7 +28645,10 @@ https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6b208abe6fe98421b13a461148233cda20f072df3f1289d2120092c56c43eef7ba8c7820b059787d955004f44d810a0a8ae57fa1d845ac6cd05d9c1b89f0bc46 + @@ -25667,7 +28663,7 @@ - + Sindre Sorhus path-type 4.0.0 @@ -25693,7 +28689,10 @@ https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 80329bf1a64c0de0ffb595acf4febeab427d33091d97ac4c57c4e39c63f7a89549d3a6dd32091b0652d4f0875f3ac22c173d815b5acd553dd7b8d125f333c0bf + @@ -25708,7 +28707,7 @@ - + Blake Embrey dot-case 3.0.4 @@ -25734,10 +28733,14 @@ https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2afe672a587ac91addac6bf1789d9ee72d9e454a64528b085b8036012dfccf04b3dbbceeeee7c3c103e2e4986cdd702518d7ad9776e69c6850b0cb642899e3df + + true node_modules/dot-case @@ -25749,7 +28752,7 @@ - + Hiroki Osame resolve-pkg-maps 1.0.0 @@ -25775,10 +28778,14 @@ https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b1e4b64e3dba4c154e0b6348736ace7b6cb664eede7f1213b4b65c1923a71c734e43b0a489405fc34230d9c93ac642213f02e128d2d2f013be844a6781096acf + + true node_modules/resolve-pkg-maps @@ -25790,7 +28797,7 @@ - + Anton Korzunov get-nonce 1.0.1 @@ -25816,7 +28823,10 @@ https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1498584680da89ab5f12450af072a589c9aeff7486143e75ab78ad2831a8493cac4090677ce7315391b19e113513ab2807be8c6d3d0c06d9ca26e5f2031fbde9 + @@ -25831,7 +28841,7 @@ - + Ilya Kantor detect-node-es 1.1.0 @@ -25857,7 +28867,10 @@ https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ca9766254fd36c16f2d83c626eebfb64b5b706cd5012633b9c78c400d7e88492ef1345d5ba38ac9f5a8f25c67183ea83b9cb2bf9b3fa7cb0f5acf4b702127b11 + @@ -25872,7 +28885,7 @@ - + Ben Newman ast-types 0.16.1 @@ -25898,10 +28911,14 @@ https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + eadd74aa4f3718e1bca74bca99a0abf1e8a2959c0ed7bd40bdb44e32dbef362c2b4e5cbadadfbb5e403c45d20855ba4c84201202cc600337514b087a9f0ff90e + + true node_modules/ast-types @@ -25913,7 +28930,7 @@ - + Ariya Hidayat esprima 4.0.1 @@ -25939,10 +28956,14 @@ https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 786b85170ed4a5d6be838a7e407be75b44724d7fd255e2410ccfe00ad30044ed1c2ee4f61dc10a9d33ef86357a6867aaac207fb1b368a742acce6d23b1a594e0 + + true node_modules/esprima @@ -25954,7 +28975,7 @@ - + The Babel Team @babel plugin-transform-modules-commonjs @@ -25981,10 +29002,14 @@ https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 38982ebb095362537480164544fab0386356b2c6637c851d4bb1cc62d37c7352a6c29c07141c1378566b83d5d96be0c54e2b56396e624c01bbb720943ec082cb + + true node_modules/@babel/plugin-transform-modules-commonjs @@ -25996,7 +29021,7 @@ - + The Babel Team @babel plugin-transform-typescript @@ -26023,10 +29048,14 @@ https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e001220c404f219bcb41a5a573d96209abc4d3144cd1d35c6b8d56b4178cde3805a6d7d43921bdcf4bad78b86aebedebabe581ea322f5302834e95c41cf27656 + + true node_modules/@babel/plugin-transform-typescript @@ -26038,7 +29067,7 @@ - + Justin Ridgewell @jridgewell resolve-uri @@ -26065,7 +29094,10 @@ https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6d12128022233f6d3fb5b5923d63048b9e1054f45913192e0fd9492fe508c542adc15240f305b54eb6f58ccb354455e8d42053359ff98690bd42f98a59da292b + @@ -26080,7 +29112,7 @@ - + Isaac Z. Schlueter yallist 3.1.1 @@ -26106,10 +29138,14 @@ https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6b850641a58f1f9f663975189c01b67b09dc412e22e05e374efdc9a0033eb365430264bd36c2bc1a90cc2eb0873e4b054fb8772ba4cea14367da96fb4685f1e2 + + true node_modules/yallist @@ -26121,7 +29157,7 @@ - + Jordan Harband possible-typed-array-names 1.1.0 @@ -26147,10 +29183,14 @@ https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ffee55153721243a158f76e1a2a8ba51eca6703d340c0c1bd672706a6ccfbc712ccc9e05a45e9234d6d46ce4bcc88e7aa87cdd57c78ad2a11f3928a87644ddc6 + + true node_modules/possible-typed-array-names @@ -26162,7 +29202,7 @@ - + Jordan Harband is-date-object 1.1.0 @@ -26188,10 +29228,14 @@ https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3f0c2111a90754a4dd44d54ec3efc6ca1d3e33394297847aa8abe486ebcbb4f320808d56007b7db0ec19c502d21a951a0e7addc83b289a846036709f28d4975e + + true node_modules/is-date-object @@ -26203,7 +29247,7 @@ - + Jordan Harband is-symbol 1.1.1 @@ -26229,10 +29273,14 @@ https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f601b1e864ed09033bdc18261d05df0e62ed7e38d35034b2a314c26e9e56b688b10217e0b038ab58871543f207a6f2395607798bf27917b07d70dfd69556c2ff + + true node_modules/is-symbol @@ -26244,7 +29292,7 @@ - + Raynos for-each 0.3.5 @@ -26270,10 +29318,14 @@ https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 74ac75d9e442548cea0b1146a65c8528930fbcb11682636d52ba53889211e6ef7bcc48511bcc92aed6e83c7657c7b75a2f1415ae5eb8ddc4f36da6f6b64423c6 + + true node_modules/for-each @@ -26285,7 +29337,7 @@ - + Jordan Harband reflect.getprototypeof 1.0.10 @@ -26311,10 +29363,14 @@ https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d34a3823e0d5ade7e1bfe9d7d2e9728b76e248708f0defb22efe68fe9e9dfd45658ab8a307c135e85b5fc12022e20ded72aad0e25440a904a81446497a160473 + + true node_modules/reflect.getprototypeof @@ -26326,7 +29382,7 @@ - + Jordan Harband has-bigints 1.1.0 @@ -26352,10 +29408,14 @@ https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 477a5ba64708aafd8f9b7754c208dc943455996a53256d8370ccdc221117131d6887f08430e6cc9b728b99124e76f84cee8e2e4019f0afca7344adac25622a7e + + true node_modules/has-bigints @@ -26367,7 +29427,7 @@ - + Jordan Harband which-boxed-primitive 1.1.1 @@ -26393,10 +29453,14 @@ https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4db5f79a3f27d2874204556563c03192a707012c372fad2322e17c8c53fbf1acf70b6621986bea6c70690234d11f6ff1a98ba7ac9f60d634b28c28e9a16cc800 + + true node_modules/which-boxed-primitive @@ -26408,7 +29472,7 @@ - + Sindre Sorhus callsites 3.1.0 @@ -26434,7 +29498,10 @@ https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3fc06302c5ef652f95203508d7584709012fef8613ebb6148b924914d588a8bdb7e6c0668d7e3eab1f4cbaf96ce62bf234435cb71e3ac502d0dda4ee13bb2c69 + @@ -26449,7 +29516,7 @@ - + DY color-name 1.1.4 @@ -26475,7 +29542,10 @@ https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 74ecbedc0b96ddadb035b64722e319a537208c6b8b53fb812ffb9b71917d3976c3a3c7dfe0ef32569e417f479f4bcb84a18a39ab8171edd63d3a04065e002c40 + @@ -26490,7 +29560,7 @@ - + Dominic Tarr json-buffer 3.0.1 @@ -26516,10 +29586,14 @@ https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e1b57905f4769aa7d04c99be579b4f3dd7fe669ba1888bd3b8007983c91cad7399a534ff430c15456072c17d68cebea512e3dd6c7c70689966f46ea6236b1f49 + + true node_modules/json-buffer @@ -26531,7 +29605,7 @@ - + Sindre Sorhus p-limit 3.1.0 @@ -26557,10 +29631,14 @@ https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4d839a9ccdf01b0346b193767154d83c0af0e39e319d78f9aa6585d5b12801ce3e714fe897b19587ba1d7af8e9d4534776e1dcdca64c70576ec54e5773ab8945 + + true node_modules/p-limit @@ -26572,7 +29650,7 @@ - + @csstools color-helpers 5.1.0 @@ -26598,10 +29676,14 @@ https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4b5d445d6272cb4333e5262f46663c9c96131457752c2355fbb717c80810b4e3aecdbe04b207ea0ee7cbfbd7acc7bdbf78b86c45d199c1a95dbbf87e138b7804 + + true node_modules/@csstools/color-helpers @@ -26613,7 +29695,7 @@ - + Titus Wormer character-entities 2.0.2 @@ -26639,7 +29721,10 @@ https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b21c7ba10d00c1e9ff05121d92392fcf9e0f9c4108fc48f05c3488669f3afca29d6da7c78750dffd16060619f885b7b6fae282f459d3e540847723f3dda8bd85 + @@ -26654,7 +29739,7 @@ - + Titus Wormer micromark-util-character 1.2.0 @@ -26680,7 +29765,10 @@ https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 957ada4f0717df21ffbcc0da15609024fd6e22cccb55e6f351add91ddae0c6beca114ffd98be265600a919bca1bcd2cd95ab913a2354abb58de6eee775b63ac6 + @@ -26688,7 +29776,7 @@ - + Titus Wormer micromark-core-commonmark 1.1.0 @@ -26714,7 +29802,10 @@ https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 0601ced5a45ba2587685caf32f67752dadfb574028cfbdf2985f2b01c2a7a212f2f77b62b66bfad84d203fc1ebc7d3ca70aaea099d416cb19b3f76c48685d897 + @@ -26722,7 +29813,7 @@ - + Titus Wormer micromark-factory-space 1.1.0 @@ -26748,7 +29839,10 @@ https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 711cc48fb73438be0cc36bfa9f0cedb723997bc5d8fd9f06d2bce6590653062fe38f0cb0fd4e2ea8ab543915d0ad1e5b0196676d323f7de455fd1ee17388d061 + @@ -26756,7 +29850,7 @@ - + Titus Wormer micromark-util-chunked 1.1.0 @@ -26782,7 +29876,10 @@ https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 61ed351d7a6464f35c57a162ca85b67c6643530e1873bbd3d04f5269df37f9b103882275b97bb44b79abf162e9b33dc7686df1daad0733a093b8f75c65c96e15 + @@ -26790,7 +29887,7 @@ - + Titus Wormer micromark-util-combine-extensions 1.1.0 @@ -26816,7 +29913,10 @@ https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 436d2ca7899f35ff7212a0cbe745b0b9664752b08ee1f1327830a7306986e4faf40b3d79528eca06cea3abe76ad04817e033f0c2b87d9b45feccf575ca916f50 + @@ -26824,7 +29924,7 @@ - + Titus Wormer micromark-util-encode 1.1.0 @@ -26850,7 +29950,10 @@ https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 12e1334d6493023f4f03918e02cf7dd86ccd87674640ee7652f01bb5238cbd74f1bf70ab8aa6fa20ecc95010a612aaeb5d26e52482416c516feb33f1a6b7a227 + @@ -26858,7 +29961,7 @@ - + Titus Wormer micromark-util-resolve-all 1.1.0 @@ -26884,7 +29987,10 @@ https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6ff1ba05331283e6d7fb1542b213d33f202edad980d04e17f7c35247b7886de0bac9c0aa09e13bc237c3220cc46e4cdd11525746d386e056c49bfb866c2468b8 + @@ -26892,7 +29998,7 @@ - + Titus Wormer micromark-util-subtokenize 1.1.0 @@ -26918,7 +30024,10 @@ https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 914407cb3468c6f64ed8fb8bcccb763ff77056c4e28af08af227184de47edd681bb8fa9f1e03cfcbb9c529b7aa462bc1be7ff737718188d0be2514cc4b1102ec + @@ -26926,7 +30035,7 @@ - + Luke Edwards kleur 4.1.5 @@ -26952,7 +30061,10 @@ https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + a3e34efbc5ab462404138ffb9f044984dd475a9566266e75d690475313cbb69d015084b3941a653916129937250a726f42adad2aefec825df156991ced95ae41 + @@ -26967,7 +30079,7 @@ - + Luke Edwards sade 1.8.1 @@ -26993,7 +30105,10 @@ https://registry.npmjs.org/sade/-/sade-1.8.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c5a9770995f55e5a3f938029c0216b1d50028bd7c1a89ed5fa6c2106cb9fff520e29b072d3df057b1f966bfe5032e6f0d3da5267fbbc118f0f5a07af26c5e9d4 + @@ -27008,7 +30123,7 @@ - + David Clark cosmiconfig 7.1.0 @@ -27034,14 +30149,17 @@ https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 01d997eb153374d012b30b05b66c12b7b563f29a3d22ea979b4517cfb40a3ee11498f0785f28c67da02bd8f4ae10b3309113151f51292245f96d3646441dde08 + node_modules/cosmiconfig - + Eemeli Aro yaml 1.10.2 @@ -27067,7 +30185,10 @@ https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + af7bd7c84ad109827bc20dbccaf058e554a8005f19be5716f7f07053312d52c8ef5ff0cab36e1d224bb08edba9af02491ec6f251b2c0a5ea584d1d41378b87ae + @@ -27092,7 +30213,7 @@ - + Jon Schlinkert to-regex-range 5.0.1 @@ -27118,7 +30239,10 @@ https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + eb93fb8b3e97e7212bd5cc1c82f4316db230ed493780ecb974876d678ac3bde2ea86b7493fe2e2fc7c7ab722b43446fed860b29de08c2621aaac00c248d93cb1 + @@ -27133,7 +30257,7 @@ - + Feross Aboukhadijeh run-parallel 1.2.0 @@ -27159,7 +30283,10 @@ https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e65e15c9947ce8b67f943c594d1ea3a8bf00144d92d0814b30fdba01b8ec2d5003c4776107f734194b07fb2dfd51f0a2dddcf3f0e950b8f9a768938ca031d004 + @@ -27174,7 +30301,7 @@ - + Matteo Collina reusify 1.1.0 @@ -27200,7 +30327,10 @@ https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 83a4147dfd38a19a47b34786e69f37ac52e11de574d2e83f61ff6764ce9f2de52b3e0b814e44d039da40596b29321e794d97d54033da37735025f6d5440c5d23 + @@ -27215,7 +30345,7 @@ - + Ben Coe signal-exit 4.1.0 @@ -27241,7 +30371,10 @@ https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6f3c99d5ef3cc3d3b588d25b2a73a5bd84eb58f0e5e3a3b56c6d03dd7227bfef6d90faf1acdf235144e21650e4926296827d4ce827c8035dd2b86a8e6bd2a8af + @@ -27256,7 +30389,7 @@ - + Ben Coe @isaacs cliui @@ -27283,7 +30416,10 @@ https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3bc8dc8da6d76a578e1bd0d0d3e0115d66414df9cfe16340ab3ba224aee5978e009b118abff2763384cf8f18d8df39c109fbc15c5cee726d6dc1dc85c9b16a10 + @@ -27298,11 +30434,12 @@ - + @pkgjs parseargs 0.11.0 Polyfill of future proposal for `util.parseArgs()` + optional MIT @@ -27324,7 +30461,10 @@ https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + fb55648dd0f44012cfa1d1ab2547aa6ab1fc54022f40e0c86f087d5e93f94b28ac7fb628420b0928f345a2aa8b425bbe550fed552b21311ea5a0f327f14f9d3e + @@ -27339,7 +30479,7 @@ - + Jonathan Ong thenify 3.3.1 @@ -27365,7 +30505,10 @@ https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 455652215e481b5d079377a7a2dae1bf3d13f5e9ba7321c12e41ff60066e2aa77c85190a8527c218870fd8a518d043f19ddcc034198d965cd63f06a4f9b85e4b + @@ -27380,7 +30523,7 @@ - + error-ex 1.3.4 Easy error subclassing and stack customization @@ -27405,7 +30548,10 @@ https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b2a41a9809d1d785600abd40eb5f00dec1abca07292be1c46de9c0fc7884024914c1c648201fed816a871715a03b20e1e270782424629a1efd751e58c1cf4c0d + @@ -27420,7 +30566,7 @@ - + Kat Marchán json-parse-even-better-errors 2.3.1 @@ -27446,7 +30592,10 @@ https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c72170ca1ae8fc91287fa1a17b68b3d8d717a23dac96836c5abfd7b044432bfa223c27da36197938d7e9fa341d01945043420958dcc7f7321917b962f75921db + @@ -27461,7 +30610,7 @@ - + Blake Embrey no-case 3.0.4 @@ -27487,10 +30636,14 @@ https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7e000dde318087e468c541991d348e2c922a51cdb09a8070191e2d6e93402a69a8bc5a16ab439d4646f456495d45e3b66b68814ff384ba51bd5d251cd74af7ce + + true node_modules/no-case @@ -27502,7 +30655,7 @@ - + The Babel Team @babel helper-annotate-as-pure @@ -27529,10 +30682,14 @@ https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7d74b0310aa2b5319e1cb042d3c12ae725f3da6dfb138a495f5a80535fb670d79dcff89fbff6d55dfb7dd157926afe6714eeb511c360c2bd1a2716f23da5813e + + true node_modules/@babel/helper-annotate-as-pure @@ -27544,7 +30701,7 @@ - + The Babel Team @babel helper-create-class-features-plugin @@ -27571,10 +30728,14 @@ https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 57d7fa64521848b3446ee180ffddae3af62c18224db2e03c11267895d734f5b5a4fe3f07f132a23f0f0c935786ea89699ced002c726661f66f17830413881a8e + + true node_modules/@babel/helper-create-class-features-plugin @@ -27586,7 +30747,7 @@ - + The Babel Team @babel helper-skip-transparent-expression-wrappers @@ -27613,10 +30774,14 @@ https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 4ee6f864a117a9b3e35e058b976fb726940060127cfa292943639c8ffabfaf42f013752110d87b11469bc878f3da4084b2b458f377b0d8341d1e5bae883405ce + + true node_modules/@babel/helper-skip-transparent-expression-wrappers @@ -27628,7 +30793,7 @@ - + Jordan Harband which-builtin-type 1.2.1 @@ -27654,10 +30819,14 @@ https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ea205cce85fe90343b6b7f982419e1dd3f8a651c4cfe260d3d789caa4ebafd07e6d5bf778aefb23889a4834cc76e3e4b34e70dbf54c4003899d316b7e01e2ae9 + + true node_modules/which-builtin-type @@ -27669,7 +30838,7 @@ - + Jordan Harband is-bigint 1.1.0 @@ -27695,10 +30864,14 @@ https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 9f8653dfbc06efc8b3d37c4f44a26b1d37596dedc889ccae704b5d46c579ca09707371b251f6c07e949e0f4149e3535b50d4ade706e1a9fa757d2f81827bc315 + + true node_modules/is-bigint @@ -27710,7 +30883,7 @@ - + Jordan Harband is-boolean-object 1.2.2 @@ -27736,10 +30909,14 @@ https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c1ae7aa36fc4949318aa30a31a45eb8bb8ade456de6d6e6eb0bc3f9cf98232ce43799edece24986614a63d19f4b71a9e5b82e702641053b160a8ba6c10528ce0 + + true node_modules/is-boolean-object @@ -27751,7 +30928,7 @@ - + Jordan Harband is-number-object 1.1.1 @@ -27777,10 +30954,14 @@ https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 95985c96e984d46e95603f151dedf9c0568889ff824f2e522488b9fb7cb8a6c0e05aee303c3a01845f0dc543a29c473ba478224ec4fa31a05bf76aca8610fe5f + + true node_modules/is-number-object @@ -27792,7 +30973,7 @@ - + Sindre Sorhus yocto-queue 0.1.0 @@ -27818,10 +30999,14 @@ https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ad592cbec9cd09d27fa2119ceb180fc3237c7a1782c6c88b33c9b1b84fedfe6395a897b03ee3b59a22e94c74224604ca08b7b12f831e00555a82db3b1e6359d9 + + true node_modules/yocto-queue @@ -27833,7 +31018,7 @@ - + Titus Wormer micromark-factory-destination 1.1.0 @@ -27859,7 +31044,10 @@ https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5da34344e060c7d4a048285debda6388629b57e9df1c60cf55816ce5d3a80dded99cc004f82baef75042a6c63c453d8d3fdbe8fc1f2976cd9540d08b8aed3386 + @@ -27867,7 +31055,7 @@ - + Titus Wormer micromark-factory-label 1.1.0 @@ -27893,7 +31081,10 @@ https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 38bb727b3e2f668ff5363c4685ca4349b1d0fa6d082069d3f01a0f6a687eee3565ccb2411fdf33cee0a851e331bcce96b0d7a1f30c7c70abea2e23c71000a7d3 + @@ -27901,7 +31092,7 @@ - + Titus Wormer micromark-factory-title 1.1.0 @@ -27927,7 +31118,10 @@ https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 27b9fd477bcc9a08c338263c34fc39e638b26909c7e6405d576fd45c2b592299c71f73fa9c750a687ed75c462e5b0c7fc5425c6b06bca652c112330f536e07cd + @@ -27935,7 +31129,7 @@ - + Titus Wormer micromark-factory-whitespace 1.1.0 @@ -27961,7 +31155,10 @@ https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + bf65a59a2ca6552a79a0c83ed50d0dd4bc66b7aa4c8481c3e39ef085633bfc6525124b35848f718f9c37cdb738bae30a5c68ac92c664f03ccfd94c866c6a8db1 + @@ -27969,7 +31166,7 @@ - + Titus Wormer micromark-util-classify-character 1.1.0 @@ -27995,7 +31192,10 @@ https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 48bd302f1b4a4a79252925299689355901681a151d5982a080a522aa15fe4b06a56be06da6d182bb988f45cfb1bf32783d713f87033714d5ec7c4560a19b166f + @@ -28003,7 +31203,7 @@ - + Titus Wormer micromark-util-html-tag-name 1.2.0 @@ -28029,7 +31229,10 @@ https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 55343372e4201540fbc98cedb9014a5d3e3d2a0863b444d0f96bffcd48c6486062a199e40383f55d764f4f514778903a470457485e3bcaf275b6c25da31c0ef9 + @@ -28037,7 +31240,7 @@ - + Luke Edwards mri 1.2.0 @@ -28063,7 +31266,10 @@ https://registry.npmjs.org/mri/-/mri-1.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b73cec91bddb1bc2ef606145fe60d3a6ade3a48e90f707372c49816a086ef83742b2c77515a90dec17348553661321aad5bab74607e409bddc9902e934f3aba0 + @@ -28078,7 +31284,7 @@ - + @types parse-json 4.0.2 @@ -28104,7 +31310,10 @@ https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 7484a80d759643052aba22acc99e0d83e1d7d8ab0f2fb2f21ca1d0c20185100dc868a69ce0e6ddfa1d9afdaeb06a2b00a1ea49941731f69696aa303cfc75630b + @@ -28119,7 +31328,7 @@ - + Jon Schlinkert is-number 7.0.0 @@ -28145,7 +31354,10 @@ https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e350a27e483a7bc4f2952a5db53a5e2d532abd20445734edb47bc4443ef8d7ea6767c00dbf4d34e0c44be3740a3c394af5c1af369e8d6566540656c65d8c719e + @@ -28160,7 +31372,7 @@ - + Feross Aboukhadijeh queue-microtask 1.2.3 @@ -28186,7 +31398,10 @@ https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 36e68d49ae9f94a4f925a498433268934e09cd32f5080e9a1a1bf9adf2d6dcf82a03e3360a1a59427002f21f22e19164052f17e51aa40c11c0eebe217a3dcaf4 + @@ -28201,7 +31416,7 @@ - + Sindre Sorhus string-width 4.2.3 @@ -28227,14 +31442,17 @@ https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c0ac90450a63274b08a7ad84ad265d1ac8cc256b1aa79a1136284786ee86ec954effd8c807a5327af2feb57b8eaab9e0f23fdcc4a4d6c96530bd24eb8a2673fe + node_modules/string-width-cjs - + Mathias Bynens emoji-regex 8.0.0 @@ -28260,7 +31478,10 @@ https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3128d8cdc58d380d1ec001e9cf4331a5816fc20eb28f2d4d1b7c6d7a8ab3eb8e150a8fd13e09ebd7f186b7e89cde2253cd0f04bb74dd335e126b09d5526184e8 + @@ -28275,7 +31496,7 @@ - + Sindre Sorhus strip-ansi 6.0.1 @@ -28301,7 +31522,10 @@ https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 637f153d21dcaa416b0a916743dbee4979aabaebf9a1738aa46793e9a1abaf7a3719cf409556ba2417d448e0a76f1186645fbfd28a08ecaacfb944b3b54754e4 + @@ -28326,7 +31550,7 @@ - + Sindre Sorhus string-width 5.1.2 @@ -28352,7 +31576,10 @@ https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 1e72ce091def8dc63c6dea0d2ed723679fe7c67d9a7e6304ea586b0eb79ba24a8c6a9f976de5bc9fd4d7a4f0cea9d18ae6a708de84f418a4d6eb00bb10c895a8 + @@ -28367,7 +31594,7 @@ - + Sindre Sorhus strip-ansi 6.0.1 @@ -28393,7 +31620,10 @@ https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 637f153d21dcaa416b0a916743dbee4979aabaebf9a1738aa46793e9a1abaf7a3719cf409556ba2417d448e0a76f1186645fbfd28a08ecaacfb944b3b54754e4 + @@ -28408,7 +31638,7 @@ - + Sindre Sorhus strip-ansi 7.1.2 @@ -28434,14 +31664,17 @@ https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 826046b25a68409b609cc02f395a86669133f5dca82930b3cb69dfcff9fc68816137f8c213fac299cc5a6c1ea338e1d5fb458d9f294ec5ac4140f4af71692584 + node_modules/strip-ansi - + Sindre Sorhus ansi-regex 6.2.2 @@ -28467,7 +31700,10 @@ https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 06add2992a721476968cf93c21ff7273ab2f33c739e9d079040b56e106f0e631d3c305d77132e844c9290c9a7a54bd17ce559a0874d7ae415444c6260f4b0baa + @@ -28492,7 +31728,7 @@ - + Sindre Sorhus wrap-ansi 7.0.0 @@ -28518,14 +31754,17 @@ https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 6151888f691a98b493c70e8db198e80717d2c2c9f4c9c75eb26738a7e436d5ce733ee675a65f8d7f155dc4fb5d1ef98d54e43a5d2606e0052dcadfc58bb0f5e9 + node_modules/wrap-ansi-cjs - + Sindre Sorhus string-width 4.2.3 @@ -28551,7 +31790,10 @@ https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + c0ac90450a63274b08a7ad84ad265d1ac8cc256b1aa79a1136284786ee86ec954effd8c807a5327af2feb57b8eaab9e0f23fdcc4a4d6c96530bd24eb8a2673fe + @@ -28566,7 +31808,7 @@ - + Sindre Sorhus strip-ansi 6.0.1 @@ -28592,7 +31834,10 @@ https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 637f153d21dcaa416b0a916743dbee4979aabaebf9a1738aa46793e9a1abaf7a3719cf409556ba2417d448e0a76f1186645fbfd28a08ecaacfb944b3b54754e4 + @@ -28607,7 +31852,7 @@ - + Mathias Bynens emoji-regex 8.0.0 @@ -28633,7 +31878,10 @@ https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 3128d8cdc58d380d1ec001e9cf4331a5816fc20eb28f2d4d1b7c6d7a8ab3eb8e150a8fd13e09ebd7f186b7e89cde2253cd0f04bb74dd335e126b09d5526184e8 + @@ -28658,7 +31906,7 @@ - + Sindre Sorhus wrap-ansi 8.1.0 @@ -28684,14 +31932,17 @@ https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + b22ed0588eb350cab9e9b11216f6a0b66ccc7463ada317d1f927b3d753286df73bb66f9591472493d6d6d9479f7d319551b3a4b31992c34000da0b3c83bd4d09 + node_modules/wrap-ansi - + Sindre Sorhus ansi-styles 6.2.3 @@ -28717,7 +31968,10 @@ https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + e038fa336f0907ea001fc9059132d4a3e6b68f038592ea9bdf2b9c53408035c45151bc52d1c3f49d96021a371cdc1357c1122c5159831a0cdac267bbcef247be + @@ -28742,7 +31996,7 @@ - + Qix is-arrayish 0.2.1 @@ -28768,7 +32022,10 @@ https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cf3d3a4bcb74a33a035cc1beb9b7b6eb37824cd5dc2883c96498bc841ac5e227422e6b38086f50b4aeea065d5ba22e4e0f31698ecc1be493e61c26cca63698ce + @@ -28783,7 +32040,7 @@ - + Blake Embrey lower-case 2.0.2 @@ -28809,10 +32066,14 @@ https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + edf9b797734017d59f37a5b724e99fe5daf0a55a97efc26da0627703a5b46ba66795d338d70d9f5790f8f74a6c2854e931db3c4c9b1efde1cb145b0d1c78c782 + + true node_modules/lower-case @@ -28824,7 +32085,7 @@ - + The Babel Team @babel helper-member-expression-to-functions @@ -28851,10 +32112,14 @@ https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 13972133c7968d3a7f68da15a5c6df33b98bc6ef5718b5988ac7b678128642898093f31be17a31caa5d365bb93a216ec97c10aa9d94c8670c8d8208b7dcb3dc0 + + true node_modules/@babel/helper-member-expression-to-functions @@ -28866,7 +32131,7 @@ - + The Babel Team @babel helper-optimise-call-expression @@ -28893,10 +32158,14 @@ https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 5113061f4f0dcd8161b9b352189ae9504a6118a430310601c92cdab79700072635fd880846450b9c8cb7b4031eb3394bfeca361db7a29589685264a977b19d57 + + true node_modules/@babel/helper-optimise-call-expression @@ -28908,7 +32177,7 @@ - + The Babel Team @babel helper-replace-supers @@ -28935,10 +32204,14 @@ https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ec41f3eaa0d973c4584b91253e84a1321796bc48044689c50acec80289d62cb5135d6e7d0cfd786c266df3dfc62b2ade627f20dd2f379b6d457a51ca6de0c228 + + true node_modules/@babel/helper-replace-supers @@ -28950,7 +32223,7 @@ - + Jordan Harband is-async-function 2.1.1 @@ -28976,10 +32249,14 @@ https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + f5d80cfdc6419cdbe3cda3181d5a31c5f3e3d905eddb612fed2bae3ebb3ec5abf4ba4181d12e9de3275974488ce3c90bc7990357e4013eba559c5c9e7cbf2491 + + true node_modules/is-async-function @@ -28991,7 +32268,7 @@ - + Jordan Harband is-finalizationregistry 1.1.1 @@ -29017,10 +32294,14 @@ https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d690ba37ca9625b5a83ed12381c2f6c7285038fe3dd44423794a37a9329c995f184830c9ace7a97c6f29702ee1fd0827407612bf4989dd9fd95b199ab55af2b2 + + true node_modules/is-finalizationregistry @@ -29032,7 +32313,7 @@ - + Jordan Harband is-generator-function 1.1.2 @@ -29058,10 +32339,14 @@ https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + ba9aadd5290690e0d6f6db06346e66b574d7b440a2cf0b52da4035eb533e8093dcd7175bfc0c7adbd69fe98ad3c1c39e4076dec2b3cd944e43c7b933bd74e2cc + + true node_modules/is-generator-function @@ -29073,7 +32358,7 @@ - + Jordan Harband which-collection 1.0.2 @@ -29099,10 +32384,14 @@ https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2b88d5ca39c1760bdcf3a63a06468b64437ddf74b060eb8116476606ef597e47006dd55ba484e70e68ef67f6908d15d0aefe443e44e70f5b37f468a2a9b9e00b + + true node_modules/which-collection @@ -29114,7 +32403,7 @@ - + Sindre Sorhus is-fullwidth-code-point 3.0.0 @@ -29140,7 +32429,10 @@ https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + cf29a6e7ebbeb02b125b20fda8d69e8d5dc316f84229c94a762cd868952e1c0f3744b8dbee74ae1a775d0871afd2193e298ec130096c59e2b851e83a115e9742 + @@ -29155,7 +32447,7 @@ - + Masaki Komagata eastasianwidth 0.2.0 @@ -29181,7 +32473,10 @@ https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 23cf1361959cf578981d1438ff7739ae38df8248e12f25b696e18885e18445b350e8e63bc93c9b6a74a90d765af32ed550ff589837186be7b2ab871aee22ea58 + @@ -29189,7 +32484,7 @@ - + Mathias Bynens emoji-regex 9.2.2 @@ -29215,7 +32510,10 @@ https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2f5f03689b17494936fb8da9bfc98bb398c94f686a164144e23db5c0e9a06d4aac67684bef636c514efce60f515e0a37b3464d815978d93887a7766d3affd5ca + @@ -29230,7 +32528,7 @@ - + Jordan Harbamd async-function 1.0.0 @@ -29256,10 +32554,14 @@ https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 86c535f007bc0834d1e8a82ef4361fd046c2aff6b98862f4af2b500e86d471da5838aa2493c2c48d5a619d7903920a62d30615b2aad7b8fd1b67125a4ea760a0 + + true node_modules/async-function @@ -29271,7 +32573,7 @@ - + Jordan Harbamd generator-function 2.0.1 @@ -29297,10 +32599,14 @@ https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 485745988262fb26c2d2f8e51cdd191951877379601340f13c04f47638d583e9233a74aa725aa68f4290ef291338b3fa631a2a3afb8038319d707267fb8deade + + true node_modules/generator-function @@ -29312,7 +32618,7 @@ - + Jordan Harband is-map 2.0.3 @@ -29338,10 +32644,14 @@ https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + d5079dd3f1ebda6f98ab19ccd3d0a303677f8ba61935f17a476a1100e8f7e9e51d4baa8857f86e3c935212929bba97b016cf99b09971b238cf6dcd3f69f5ba2f + + true node_modules/is-map @@ -29353,7 +32663,7 @@ - + Jordan Harband is-weakmap 2.0.2 @@ -29379,10 +32689,14 @@ https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 2b9a5760e9bdc2a6354608e92f7613905dfdb678b55da8d42246b04cb528f446445541606b981240917c9cd4bb670250d36cbed5808d61c321f8721fd59a84fb + + true node_modules/is-weakmap @@ -29394,7 +32708,7 @@ - + Jordan Harband is-weakset 2.0.4 @@ -29420,10 +32734,14 @@ https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz - as detected from npm-ls property "resolved" + as detected from npm-ls property "resolved" and property "integrity" + + 99f7306fa23343238a4ecf3809032b3b05b881071a4ce016274cf32429765923c3ad693f3b30da2265851f77635e16f6e20e1eb9d65f2d1a3302f3c6c3877d85 + + true node_modules/is-weakset @@ -29437,2981 +32755,3033 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/desktop/src-tauri/resources/libcrypto-3-arm.dylib b/desktop/src-tauri/resources/libcrypto-3-arm.dylib deleted file mode 100755 index 506cdc4d8e9..00000000000 Binary files a/desktop/src-tauri/resources/libcrypto-3-arm.dylib and /dev/null differ diff --git a/desktop/src-tauri/resources/libcrypto-3-x64.dylib b/desktop/src-tauri/resources/libcrypto-3-x64.dylib deleted file mode 100755 index 1e93edd1d6e..00000000000 Binary files a/desktop/src-tauri/resources/libcrypto-3-x64.dylib and /dev/null differ diff --git a/desktop/src-tauri/resources/libssl-3-arm.dylib b/desktop/src-tauri/resources/libssl-3-arm.dylib deleted file mode 100755 index db13f738ca0..00000000000 Binary files a/desktop/src-tauri/resources/libssl-3-arm.dylib and /dev/null differ diff --git a/desktop/src-tauri/resources/libssl-3-x64.dylib b/desktop/src-tauri/resources/libssl-3-x64.dylib deleted file mode 100755 index 6aa7413dbd2..00000000000 Binary files a/desktop/src-tauri/resources/libssl-3-x64.dylib and /dev/null differ diff --git a/desktop/src-tauri/scripts/sign.ps1 b/desktop/src-tauri/scripts/sign.ps1 index d021d1f5ebb..ff255e52ae5 100644 --- a/desktop/src-tauri/scripts/sign.ps1 +++ b/desktop/src-tauri/scripts/sign.ps1 @@ -7,7 +7,7 @@ Expand-Archive -Path $zipPath -DestinationPath $toolDir -Force $codeSignToolPath = Join-Path $toolDir "CodeSignTool.bat" # Find all binaries in the root of the release directory -$targetDir = Join-Path $env:GITHUB_WORKSPACE "target/x86_64-pc-windows-msvc/release" +$targetDir = Join-Path $env:GITHUB_WORKSPACE "desktop/target/x86_64-pc-windows-msvc/release" $filesToSign = Get-ChildItem -Path $targetDir -Include *.exe, *.dll # Sign each file individually diff --git a/desktop/src-tauri/src/main.rs b/desktop/src-tauri/src/main.rs index f6ad04d8de0..282c217f9f2 100644 --- a/desktop/src-tauri/src/main.rs +++ b/desktop/src-tauri/src/main.rs @@ -6,10 +6,13 @@ pub mod uninstall; pub mod utils; use std::path::Path; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; + use tauri::State; use tauri::menu::{CheckMenuItemBuilder, Menu, MenuItemBuilder}; use tauri::tray::TrayIconBuilder; -use tauri::{AppHandle, Manager, Runtime}; +use tauri::{AppHandle, Manager, RESTART_EXIT_CODE, Runtime}; use tauri_plugin_dialog::DialogExt; #[cfg(target_os = "windows")] @@ -50,7 +53,6 @@ use crate::tauri_handlers::helpers::{ select_file, toggle_theme, update_openbb_settings, }; -// Import updater commands use tauri_plugin_updater::UpdaterExt; use crate::utils::process_monitor::{ @@ -60,30 +62,25 @@ use crate::utils::process_monitor::{ use crate::uninstall::uninstall_application; -// Store installation status in app state #[derive(Clone, serde::Serialize)] struct InstallationState { is_installed: bool, installation_directory: Option, } -// Define a state wrapper for process logs #[derive(Clone)] struct ProcessLogState(LogStorage); -// Register a process for stdout monitoring #[tauri::command] fn register_process_monitoring(state: State, process_id: String) -> bool { register_process(&state.0, &process_id) } -// Unregister a process from monitoring #[tauri::command] fn unregister_process_monitoring(state: State, process_id: String) -> bool { unregister_process(&state.0, &process_id) } -// Get logs for a specific process #[tauri::command] fn get_process_logs_history( state: State, @@ -94,7 +91,6 @@ fn get_process_logs_history( get_process_logs(&state.0.clone(), request) } -// Handle updater logic async fn check_and_apply_update(app: AppHandle, always_prompt: bool) { let show_error = |app: &AppHandle, title: &str, message: String| { app.dialog() @@ -103,14 +99,13 @@ async fn check_and_apply_update(app: AppHandle, always_prompt: bool) { .kind(tauri_plugin_dialog::MessageDialogKind::Error) .show(|_| {}); }; - let update_url = "https://api.github.com/repos/OpenBB-finance/OpenBB/releases/odp/latest.json"; + let update_url = "https://github.com/OpenBB-finance/OpenBB/releases/download/ODP/latest.json"; let ap_id = get_or_create_app_id(); let headers = { let mut headers = reqwest::header::HeaderMap::new(); - // Use try_from or handle potential errors properly match reqwest::header::HeaderValue::from_str("ODP-Updater") { Ok(user_agent) => { headers.insert(reqwest::header::USER_AGENT, user_agent); @@ -167,12 +162,13 @@ async fn check_and_apply_update(app: AppHandle, always_prompt: bool) { .and_then(|builder| builder.build()); match updater_res { - Ok(updater) => match updater.check().await { - Ok(Some(update)) => { - let app_clone = app.clone(); - app.dialog() + Ok(updater) => { + match updater.check().await { + Ok(Some(update)) => { + let app_clone = app.clone(); + app.dialog() .message(format!( - "A new version ({}) is available. Would you like to install it now?", + "A new version ({}) is available. Would you like to install it now? The update will close the application and restart.", update.version )) .title("Update Available") @@ -182,6 +178,11 @@ async fn check_and_apply_update(app: AppHandle, always_prompt: bool) { if install { let app_clone_inner = app_clone.clone(); tauri::async_runtime::spawn(async move { + if let Some(window) = app_clone_inner.get_webview_window("main") { + let _ = window.show(); + let _ = window.set_focus(); + } + if let Err(e) = update.download_and_install(|_, _| {}, || {}).await { log::error!("Failed to install update: {}", e); @@ -192,30 +193,58 @@ async fn check_and_apply_update(app: AppHandle, always_prompt: bool) { ); } else { log::info!("Update installed successfully, restarting..."); - app_clone_inner.restart(); + + // SET THE FLAG TO SHOW WINDOW AFTER RESTART + if let Ok(home_dir) = std::env::var("HOME").or_else(|_| std::env::var("USERPROFILE")) { + let flag_path = std::path::Path::new(&home_dir).join(".openbb_platform").join(".show_on_restart"); + let _ = std::fs::write(flag_path, "1"); + log::info!("Set flag to show window on restart"); + } + + if let Some(window) = app_clone_inner.get_webview_window("main") { + let _ = window.show(); + } + + app_clone_inner.request_restart(); + + /* #[cfg(not(target_os = "macos"))] + { + use std::process::Command; + + if let Ok(exe_path) = std::env::current_exe() { + log::debug!("Relaunching from: {}", exe_path.display()); + let _ = Command::new(exe_path).spawn(); + std::process::exit(0); + } else { + log::error!("Could not determine executable path for restart"); + app_clone_inner.restart(); + } + } + */ } }); } }); - } - Ok(None) => { - log::debug!("No updates available"); - if always_prompt { - app.dialog() - .message("You are already running the latest version.") - .title("No Updates Available") - .kind(tauri_plugin_dialog::MessageDialogKind::Info) - .show(|_| {}); + } + Ok(None) => { + log::debug!("No updates available"); + if always_prompt { + app.dialog() + .message("You are already running the latest version.") + .title("No Updates Available") + .kind(tauri_plugin_dialog::MessageDialogKind::Info) + .show(|_| {}); + } + } + Err(e) => { + let err_msg = format!("Failed to check for updates: {}", e); + log::error!("{}", err_msg); + if always_prompt { + show_error(&app, "Update Check Failed", err_msg); + } } } - Err(e) => { - let err_msg = format!("Failed to check for updates: {}", e); - log::error!("{}", err_msg); - if always_prompt { - show_error(&app, "Update Check Failed", err_msg); - } - } - }, + } Err(e) => { let err_msg = format!("Failed to build updater: {}", e); log::error!("{}", err_msg); @@ -226,12 +255,10 @@ async fn check_and_apply_update(app: AppHandle, always_prompt: bool) { } } -// This function is triggered by the tray menu and always shows a dialog. async fn trigger_update_dialog(app: AppHandle) { check_and_apply_update(app, true).await; } -// This function runs in the background on startup and only shows a dialog if an update is available. async fn background_update_check(app: AppHandle) { check_and_apply_update(app, false).await; } @@ -239,7 +266,6 @@ async fn background_update_check(app: AppHandle) { fn check_installation_on_startup() -> InstallationState { log::debug!("STARTUP: Checking installation status"); - // Get home directory let home_dir = match std::env::var("HOME").or_else(|_| std::env::var("USERPROFILE")) { Ok(dir) => dir, Err(e) => { @@ -251,7 +277,6 @@ fn check_installation_on_startup() -> InstallationState { } }; - // Check for settings file let platform_dir = Path::new(&home_dir).join(".openbb_platform"); let system_settings_path = platform_dir.join("system_settings.json"); @@ -270,7 +295,6 @@ fn check_installation_on_startup() -> InstallationState { log::debug!("STARTUP: System settings file found"); - // Read and parse settings let settings_content = match std::fs::read_to_string(&system_settings_path) { Ok(content) => content, Err(e) => { @@ -293,7 +317,6 @@ fn check_installation_on_startup() -> InstallationState { } }; - // Check for installation directory in settings let mut install_dir = None; if let Some(install_settings) = settings.get("install_settings") @@ -303,7 +326,6 @@ fn check_installation_on_startup() -> InstallationState { log::debug!("STARTUP: Found installation directory in install_settings: {dir_str}"); let conda_dir = Path::new(dir_str).join("conda"); - // Check for conda executable based on platform let conda_exe = if cfg!(target_os = "windows") { conda_dir.join("Scripts").join("conda.exe") } else { @@ -321,7 +343,6 @@ fn check_installation_on_startup() -> InstallationState { } } - // Then check installation_directory at root (old format) if install_dir.is_none() && let Some(dir) = settings.get("installation_directory") && let Some(dir_str) = dir.as_str() @@ -329,7 +350,6 @@ fn check_installation_on_startup() -> InstallationState { log::debug!("STARTUP: Found installation directory at root level: {dir_str}"); let conda_dir = Path::new(dir_str).join("conda"); - // Check for conda executable based on platform let conda_exe = if cfg!(target_os = "windows") { conda_dir.join("Scripts").join("conda.exe") } else { @@ -353,14 +373,12 @@ fn check_installation_on_startup() -> InstallationState { if is_installed { "VALID" } else { "INVALID" } ); - // Create a state that includes the installation status to be passed to frontend InstallationState { is_installed, installation_directory: install_dir, } } -// Command to get installation state that was determined at startup #[tauri::command] fn get_installation_state(state: tauri::State) -> InstallationState { state.inner().clone() @@ -369,17 +387,14 @@ fn get_installation_state(state: tauri::State) -> Installatio #[tauri::command] fn navigate_to_page(app_handle: AppHandle, page: &str) { if let Some(window) = app_handle.get_webview_window("main") { - // First make sure the window is visible and focused let _ = window.show(); let _ = window.set_focus(); - // Navigate to the specified page using window.eval let js = format!( r#" if (localStorage.getItem('environments-first-load-done') === 'true') {{ window.location.href = '{page}'; }} else {{ - // Do nothing, just keep window focused console.log('Navigation prevented: environments-first-load-done not set'); }} "# @@ -391,11 +406,7 @@ fn navigate_to_page(app_handle: AppHandle, page: &str) { #[tauri::command] async fn quit_application(app_handle: AppHandle) { log::debug!("Quit application command received, running cleanup..."); - - // Run cleanup processes cleanup_all_processes(app_handle.clone()).await; - - // Exit the application app_handle.exit(0); } @@ -403,11 +414,9 @@ async fn cleanup_all_processes(app_handle: AppHandle) { use crate::tauri_handlers::helpers::{RealEnvSystem, RealFileExtTrait, RealFileSystem}; log::debug!("Running complete application cleanup"); - // Add a timeout for the entire cleanup process let cleanup_timeout = std::time::Duration::from_secs(10); let cleanup_result = tokio::time::timeout(cleanup_timeout, async { - // Stop all Jupyter servers match tokio::time::timeout( std::time::Duration::from_secs(3), tauri_handlers::jupyter::stop_all_jupyter_servers(app_handle.clone()), @@ -419,7 +428,6 @@ async fn cleanup_all_processes(app_handle: AppHandle) { Err(_) => log::warn!("Jupyter servers shutdown timed out"), } - // Stop all backend services match tokio::time::timeout( std::time::Duration::from_secs(3), tauri_handlers::backends::stop_all_backend_services( @@ -443,7 +451,6 @@ async fn cleanup_all_processes(app_handle: AppHandle) { Err(_) => log::warn!("Cleanup process timed out after 10 seconds"), } - // Give Windows more time to clean up UI resources #[cfg(target_os = "windows")] { log::debug!("Waiting for Windows to clean up UI resources..."); @@ -535,10 +542,25 @@ fn main() { ]) .setup(|app_handle| { let install_state = check_installation_on_startup(); + + let show_after_update = { + if let Ok(home_dir) = std::env::var("HOME").or_else(|_| std::env::var("USERPROFILE")) { + let flag_path = std::path::Path::new(&home_dir).join(".openbb_platform").join(".show_on_restart"); + if flag_path.exists() { + log::info!("Found update restart flag - will show window"); + let _ = std::fs::remove_file(&flag_path); + true + } else { + false + } + } else { + false + } + }; + if install_state.is_installed { let backend_handle = app_handle.handle().clone(); tauri::async_runtime::spawn(async move { - // Add a small delay to ensure all state management is complete use crate::tauri_handlers::helpers::{RealFileExtTrait, RealFileSystem, RealEnvSystem}; tokio::time::sleep(std::time::Duration::from_millis(100)).await; log::debug!("Initializing backends after state setup delay"); @@ -548,12 +570,10 @@ fn main() { }); } - // Completely disable native window menus if let Some(window) = app_handle.get_webview_window("main") { window.set_menu(Menu::new(app_handle.handle())?)?; } - // Check current autostart state let autostart_enabled = { #[cfg(target_os = "macos")] { @@ -571,7 +591,6 @@ fn main() { log::debug!("Autostart is currently: {}", if autostart_enabled { "enabled" } else { "disabled" }); let handle = app_handle.handle().clone(); - // Create custom tray menu items let open_item = MenuItemBuilder::new("Open Window").id("open").build(&handle)?; let open_workspace = MenuItemBuilder::new("Go to Workspace").id("open_workspace").build(&handle)?; let separator1 = tauri::menu::PredefinedMenuItem::separator(&handle)?; @@ -588,7 +607,6 @@ fn main() { let uninstall_item = MenuItemBuilder::new("Uninstall").id("uninstall").build(&handle)?; let quit_item = MenuItemBuilder::new("Quit").id("quit").build(&handle)?; - // Build custom tray menu let menu = Menu::with_items(&handle, &[ &open_item, &open_workspace, @@ -604,7 +622,6 @@ fn main() { &quit_item ])?; - // Create tray with our custom menu let icon = handle.default_window_icon().unwrap().clone(); let tray_handle = handle.clone(); let tray = TrayIconBuilder::new() @@ -654,7 +671,6 @@ fn main() { }, "start_at_login" => { let app_handle = tray_handle.clone(); - // Get current state let is_enabled = { #[cfg(target_os = "macos")] { @@ -670,7 +686,6 @@ fn main() { } }; log::debug!("Current autostart status: {}", if is_enabled { "enabled" } else { "disabled" }); - // Toggle the autostart setting let target_state = !is_enabled; log::debug!("Attempting to {} autostart", if target_state { "enable" } else { "disable" }); let result = { @@ -699,12 +714,10 @@ fn main() { } } }; - // Handle potential errors if let Err(e) = result { log::error!("Failed to {} autostart: {}", if target_state { "enable" } else { "disable" }, e); return; } - // Update the menu item state if let Err(e) = start_at_login_item.set_checked(target_state) { log::error!("Failed to update menu item state: {e}"); } else { @@ -718,10 +731,8 @@ fn main() { .build(&handle) .unwrap(); - // Keep the tray icon alive app_handle.manage(tray); - // Set window close behavior to hide instead of quit if let Some(window) = app_handle.get_webview_window("main") { let window_clone = window.clone(); window.on_window_event(move |event| { @@ -730,27 +741,16 @@ fn main() { api.prevent_close(); } }); - // This sets the titlebar color as black in macOS #[cfg(target_os = "macos")] { use objc2_app_kit::{NSColor, NSWindow}; - let ns_window_ptr = window.ns_window().unwrap(); let ns_window = unsafe { &*(ns_window_ptr as *mut NSWindow) }; - - let bg_color = { - NSColor::colorWithRed_green_blue_alpha( - 0.0, - 0.0, - 0.0, - 1.0, - ) - }; + let bg_color = NSColor::colorWithRed_green_blue_alpha(0.0, 0.0, 0.0, 1.0); ns_window.setBackgroundColor(Some(&bg_color)); }; - } - // Register signal handlers for SIGINT, SIGTERM (cross-platform) + let exit_handle = app_handle.handle().clone(); ctrlc::set_handler(move || { println!("Received termination signal, running cleanup..."); @@ -761,35 +761,40 @@ fn main() { }); exit_handle.exit(0); }).unwrap_or_else(|e| log::error!("Error setting Ctrl-C handler: {e}")); - // Register applicationWillTerminate handler on macOS + #[cfg(target_os = "macos")] { let termination_handle = app_handle.handle().clone(); utils::app_termination::setup_termination_handler(termination_handle); } - // After tray and window setup, check installation status - let install_state = check_installation_on_startup(); if !install_state.is_installed { - // Installation is INVALID, show and focus the main window and navigate to setup + log::info!("Installation is INVALID - showing window and navigating to setup"); if let Some(window) = handle.get_webview_window("main") { let _ = window.show(); let _ = window.set_focus(); - // Clear localStorage before redirecting to setup let _ = window.eval("localStorage.clear(); console.log('localStorage cleared due to INVALID installation');"); let _ = window.eval("window.location.href = '/setup'"); } } else { - // Installation is valid, start update check in background + // VALID INSTALLATION + log::info!("Installation is VALID"); + let update_handle = handle.clone(); tauri::async_runtime::spawn(async move { log::debug!("Starting background update check..."); - tokio::time::sleep(std::time::Duration::from_secs(3)).await; // Wait for app to fully initialize + tokio::time::sleep(std::time::Duration::from_secs(3)).await; background_update_check(update_handle).await; }); if let Some(window) = handle.get_webview_window("main") { let _ = window.eval("localStorage.setItem('environments-first-load-done', 'true');"); + + if show_after_update { + log::info!("SHOWING WINDOW AFTER UPDATE RESTART"); + let _ = window.show(); + } + let _ = window.set_focus(); } } @@ -801,27 +806,45 @@ fn main() { std::process::exit(1); }) .run(|app_handle, event| { - if let tauri::RunEvent::ExitRequested { api, .. } = event { - // This handler catches the applicationWillTerminate event from macOS - log::debug!("Caught applicationWillTerminate event, running cleanup..."); + let is_restart_requested = Arc::new(AtomicBool::new(false)); + let is_restart_requested_clone = is_restart_requested.clone(); - // Prevent the immediate exit + if let tauri::RunEvent::ExitRequested { code, ..} = event + && code.unwrap() == RESTART_EXIT_CODE { + is_restart_requested.store(true, Ordering::SeqCst); + } + + if let tauri::RunEvent::ExitRequested { ref api, .. } = event { + log::debug!("Caught applicationWillTerminate event, running cleanup..."); api.prevent_exit(); - // Run the same cleanup as the tray's quit option let rt = tokio::runtime::Runtime::new().unwrap(); let cleanup_handle = app_handle.clone(); rt.block_on(async { cleanup_all_processes(cleanup_handle).await; }); - // Now exit cleanly - std::process::exit(0); + if is_restart_requested_clone.load(Ordering::SeqCst) { + log::debug!("Restart requested, exiting with restart code"); + tauri::process::restart(&app_handle.env()); + } else { + log::debug!("Exiting application normally"); + std::process::exit(0); + } } #[cfg(target_os = "macos")] + { if let tauri::RunEvent::Reopen { .. } = event && let Some(window) = app_handle.get_webview_window("main") { let _ = window.show(); let _ = window.set_focus(); } + } + + if let tauri::RunEvent::Exit = event + && is_restart_requested_clone.load(Ordering::SeqCst) { + app_handle.cleanup_before_exit(); + let env = app_handle.env(); + tauri::process::restart(&env); + } }); } diff --git a/desktop/src-tauri/src/tauri_handlers/backends.rs b/desktop/src-tauri/src/tauri_handlers/backends.rs index f08122509af..727ae1ff344 100644 --- a/desktop/src-tauri/src/tauri_handlers/backends.rs +++ b/desktop/src-tauri/src/tauri_handlers/backends.rs @@ -1553,7 +1553,8 @@ pub async fn open_backend_logs_window( .map(|b| b.name.clone()) .unwrap_or_else(|| id.clone()); // Create a new window with the backend id in the URL parameters - let log_viewer_window = tauri::WebviewWindowBuilder::new( + #[allow(unused_mut)] + let mut builder = tauri::WebviewWindowBuilder::new( &app_handle, &window_label, tauri::WebviewUrl::App(format!("/backend-logs?id={id}").into()), @@ -1563,9 +1564,16 @@ pub async fn open_backend_logs_window( .resizable(true) .center() .min_inner_size(600.0, 200.0) - .visible(true) - .build() - .map_err(|e| format!("Failed to create log viewer window: {e}"))?; + .visible(true); + + #[cfg(target_os = "macos")] + { + builder = builder.title_bar_style(tauri::TitleBarStyle::Transparent); + } + + let log_viewer_window = builder + .build() + .map_err(|e| format!("Failed to create log viewer window: {e}"))?; // Show and focus the newly created window log_viewer_window @@ -1587,8 +1595,6 @@ pub async fn open_backend_logs_window( #[cfg(target_os = "macos")] { use objc2_app_kit::{NSColor, NSWindow}; - - let _ = window.set_title_bar_style(tauri::TitleBarStyle::Transparent); let ns_window_ptr = window.ns_window().unwrap(); let ns_window = unsafe { &*(ns_window_ptr as *mut NSWindow) }; let bg_color = { NSColor::colorWithRed_green_blue_alpha(0.0, 0.0, 0.0, 1.0) }; diff --git a/desktop/src-tauri/src/tauri_handlers/helpers.rs b/desktop/src-tauri/src/tauri_handlers/helpers.rs index 5569e75c5a3..0b1fd1e8b2d 100644 --- a/desktop/src-tauri/src/tauri_handlers/helpers.rs +++ b/desktop/src-tauri/src/tauri_handlers/helpers.rs @@ -962,43 +962,60 @@ pub async fn open_url_in_window( ) -> Result<(), String> { log::debug!("Opening URL in a new window: {url}"); + let parsed_url = url + .parse::() + .map_err(|e| format!("Invalid URL: {e}"))?; + let app_handle = window.app_handle(); let label = format!("url_{}", chrono::Utc::now().timestamp_millis()); - let _ = tauri::WebviewWindowBuilder::new( + #[allow(unused_mut)] + let mut builder = tauri::WebviewWindowBuilder::new( app_handle, &label, - tauri::WebviewUrl::External(url.parse().map_err(|e| format!("Invalid URL: {e}"))?), + tauri::WebviewUrl::External(parsed_url), ) .title(title.unwrap_or_else(|| "Open Data Platform".to_string())) .inner_size(1200.0, 800.0) .center() .focused(true) .visible(true) - .resizable(true) - .build() - .map_err(|e| format!("Failed to create window: {e}"))?; + .resizable(true); - if let Some(window) = app_handle.get_webview_window(&label) { - let window_clone = window.clone(); - window.on_window_event(move |event| { - if let tauri::WindowEvent::CloseRequested { api, .. } = event { - window_clone.destroy().unwrap(); - api.prevent_close(); - } - }); - // This sets the titlebar color as black in macOS - #[cfg(target_os = "macos")] - { - use objc2_app_kit::{NSColor, NSWindow}; - - let _ = window.set_title_bar_style(tauri::TitleBarStyle::Transparent); - let ns_window_ptr = window.ns_window().unwrap(); - let ns_window = unsafe { &*(ns_window_ptr as *mut NSWindow) }; - let bg_color = { NSColor::colorWithRed_green_blue_alpha(0.0, 0.0, 0.0, 1.0) }; - ns_window.setBackgroundColor(Some(&bg_color)); - }; + #[cfg(target_os = "macos")] + { + builder = builder.title_bar_style(tauri::TitleBarStyle::Transparent); } + + let webview_window = builder.build().map_err(|e| { + log::error!("Failed to create window: {e}"); + format!("Failed to create window: {e}") + })?; + + // Clone the window handle for use in the closure + let window_clone = webview_window.clone(); + + // Set up window event handler + webview_window.on_window_event(move |event| { + if let tauri::WindowEvent::CloseRequested { api, .. } = event { + if let Err(e) = window_clone.destroy() { + log::error!("Failed to destroy window: {e}"); + } + api.prevent_close(); + } + }); + + #[cfg(target_os = "macos")] + { + use objc2_app_kit::{NSColor, NSWindow}; + + let ns_window_ptr = webview_window.ns_window().unwrap(); + let ns_window = unsafe { &*(ns_window_ptr as *mut NSWindow) }; + let bg_color = NSColor::colorWithRed_green_blue_alpha(0.0, 0.0, 0.0, 1.0); + ns_window.setBackgroundColor(Some(&bg_color)); + } + + log::info!("Successfully opened URL in new window: {label}"); Ok(()) } diff --git a/desktop/src-tauri/src/tauri_handlers/jupyter.rs b/desktop/src-tauri/src/tauri_handlers/jupyter.rs index 5b887acf777..f9d2ca8d356 100644 --- a/desktop/src-tauri/src/tauri_handlers/jupyter.rs +++ b/desktop/src-tauri/src/tauri_handlers/jupyter.rs @@ -80,7 +80,6 @@ pub async fn start_jupyter_server_impl( "jupyter", "lab", "--no-browser", - "--ServerApp.allow_origin='*'", "--notebook-dir", &working, ]); @@ -576,7 +575,8 @@ pub async fn open_jupyter_logs_window( return Ok(()); } - let log_viewer_window = tauri::WebviewWindowBuilder::new( + #[allow(unused_mut)] + let mut builder = tauri::WebviewWindowBuilder::new( &app_handle, &window_label, tauri::WebviewUrl::App(format!("/jupyter-logs?env={environment}").into()), @@ -586,9 +586,17 @@ pub async fn open_jupyter_logs_window( .resizable(true) .center() .min_inner_size(600.0, 200.0) - .visible(true) - .build() - .map_err(|e| format!("Failed to create log viewer window: {e}"))?; + .visible(true); + + #[cfg(target_os = "macos")] + { + builder = builder.title_bar_style(tauri::TitleBarStyle::Transparent); + } + + let log_viewer_window = builder + .build() + .map_err(|e| format!("Failed to create log viewer window: {e}"))?; + log_viewer_window .set_focus() .map_err(|e| format!("Failed to focus log viewer window: {e}"))?; @@ -606,7 +614,6 @@ pub async fn open_jupyter_logs_window( { use objc2_app_kit::{NSColor, NSWindow}; - let _ = window.set_title_bar_style(tauri::TitleBarStyle::Transparent); let ns_window_ptr = window.ns_window().unwrap(); let ns_window = unsafe { &*(ns_window_ptr as *mut NSWindow) }; let bg_color = { NSColor::colorWithRed_green_blue_alpha(0.0, 0.0, 0.0, 1.0) }; diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index a9d09e4cace..f5fd041177e 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", - "productName": "Open Data Platform", - "version": "0.4.0", + "productName": "Open Data Platform by OpenBB", + "version": "1.0.0", "identifier": "co.openbb.platform", "build": { "frontendDist": "../dist", @@ -49,7 +49,7 @@ "icons/icon.icns", "icons/icon.ico" ], - "category": "Finance", + "category": "DeveloperTool", "publisher": "OpenBB, Inc.", "copyright": "Copyright © 2025 OpenBB, Inc.", "license": "AGPLv3", @@ -57,11 +57,9 @@ }, "plugins": { "updater": { - "active": true, "endpoints": [ - "https://github.com/OpenBB-finance/OpenBB/releases/odp/download/latest.json" + "https://github.com/OpenBB-finance/OpenBB/releases/download/ODP/latest.json" ], - "dialog": true, "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDEzNEQ2NzFCNjVENDhEMgpSV1RTU0YyMmNkWTBBY0IrOHRRWlVYVkZ3S1p4cmpER2RSYXZldjVEOWxFTnVueExBTXZTeUl3Ywo=" } } diff --git a/desktop/src/components/AddExtensionSelector.tsx b/desktop/src/components/AddExtensionSelector.tsx index a1ffec03f21..2792b57bf2d 100644 --- a/desktop/src/components/AddExtensionSelector.tsx +++ b/desktop/src/components/AddExtensionSelector.tsx @@ -99,14 +99,14 @@ export const PythonVersionSelector = ({ const hasMatchingExtensions = (extensions: Extension[], categoryId: string, query: string, installedPackages: Set): boolean => { if (!query.trim()) return true; // Always show all tabs when no search let categoryExtensions = extensions.filter((ext) => ext.category === categoryId); - + // Filter out already installed packages for provider, router, and other-openbb categories if (categoryId === "provider" || categoryId === "router" || categoryId === "other-openbb") { categoryExtensions = categoryExtensions.filter( (ext) => !installedPackages.has(ext.id.toLowerCase()) ); } - + const queryLower = query.toLowerCase(); return categoryExtensions.some( (ext) => @@ -330,14 +330,14 @@ export const AddExtensionSelector = ({ // Select all in a category const selectCategory = (categoryId: string) => { let categoryExtensions = extensions.filter((ext) => ext.category === categoryId); - + // Filter out already installed packages for provider, router, and other-openbb categories if (categoryId === "provider" || categoryId === "router" || categoryId === "other-openbb") { categoryExtensions = categoryExtensions.filter( (ext) => !installedPackages.has(ext.id.toLowerCase()) ); } - + const categoryExtensionIds = categoryExtensions.map((ext) => ext.id); setSelectedExtensions((prev) => { @@ -351,14 +351,14 @@ export const AddExtensionSelector = ({ // Clear all in a category const clearCategory = (categoryId: string) => { let categoryExtensions = extensions.filter((ext) => ext.category === categoryId); - + // Filter out already installed packages for provider, router, and other-openbb categories if (categoryId === "provider" || categoryId === "router" || categoryId === "other-openbb") { categoryExtensions = categoryExtensions.filter( (ext) => !installedPackages.has(ext.id.toLowerCase()) ); } - + const categoryExtensionIds = categoryExtensions.map((ext) => ext.id); setSelectedExtensions((prev) => @@ -369,14 +369,14 @@ export const AddExtensionSelector = ({ // Get extensions for a specific category const getExtensionsByCategory = (categoryId: string) => { let categoryExtensions = extensions.filter((ext) => ext.category === categoryId); - + // Filter out already installed packages for provider, router, and other-openbb categories if (categoryId === "provider" || categoryId === "router" || categoryId === "other-openbb") { categoryExtensions = categoryExtensions.filter( (ext) => !installedPackages.has(ext.id.toLowerCase()) ); } - + return categoryExtensions; }; @@ -405,10 +405,10 @@ export const AddExtensionSelector = ({ ]; console.log("Installing extensions:", extensionsToInstall); - + // Call installation and wait for completion onInstallExtensions(extensionsToInstall); - + console.log("Extension installation completed successfully"); } catch (error) { console.error("Installation failed:", error); @@ -419,13 +419,21 @@ export const AddExtensionSelector = ({ } }; + const getCheckboxState = (categoryId: string) => { + const categoryExtensions = getExtensionsByCategory(categoryId); + const totalCount = categoryExtensions.length; + const selectedCount = countSelectedInCategory(categoryId); + if (selectedCount === 0) return 'checked'; + if (selectedCount === totalCount) return 'indeterminate'; + return 'indeterminate'; + }; // Update the useEffect to use the new hasMatchingExtensions useEffect(() => { // If current active tab has no matches, switch to first available tab if (!hasMatchingExtensions(extensions, activeCategoryTab, localSearchQuery, installedPackages)) { - const firstMatchingCategory = categories.find(category => + const firstMatchingCategory = categories.find(category => hasMatchingExtensions(extensions, category.id, localSearchQuery, installedPackages) ); if (firstMatchingCategory) { @@ -530,50 +538,25 @@ export const AddExtensionSelector = ({ {/* Select all row for applicable categories */} {(category.id === "provider" || category.id === "router" || category.id === "other-openbb") && (
- 0} + checked={(getCheckboxState(activeCategoryTab) === 'checked')} onChange={() => { - if (countSelectedInCategory(activeCategoryTab) > 0) { + if ( + countSelectedInCategory(activeCategoryTab) > 0 + ) { clearCategory(activeCategoryTab); } else { selectCategory(activeCategoryTab); } }} - className="h-4 w-4 accent-theme-accent border-accent cursor-pointer" - style={{ - appearance: "none", - border: "1.5px solid var(--border-accent)", - borderRadius: "3px", - position: "relative", - background: countSelectedInCategory(activeCategoryTab) > 0 - ? "var(--button-neutral-bg)" - : "transparent", - transition: "background 0.15s", - }} + className={`checkbox ${getCheckboxState(activeCategoryTab) === 'indeterminate' ? 'indeterminate' : ''}`} /> - {/* Horizontal line inside the checkbox when checked */} - {/* Select All Button */} 0 && (
- @@ -855,7 +838,7 @@ export const AddExtensionSelector = ({ ); })}
- + {/* Global Summary and Install button */}
diff --git a/desktop/src/components/EnvironmentActions.tsx b/desktop/src/components/EnvironmentActions.tsx index c0638d7feb2..f61f8cbf87c 100644 --- a/desktop/src/components/EnvironmentActions.tsx +++ b/desktop/src/components/EnvironmentActions.tsx @@ -167,10 +167,10 @@ export const EnvironmentActions: React.FC = ({ disabled={app.disabled} variant="secondary" size="xs" - className="button-startstop stopped shadow-sm px-2 py-1 mr-1" + className={`shadow-sm px-2 py-1 mr-1 ${app.name === 'Jupyter' && app.status === 'starting' ? 'button-outline' : 'button-startstop stopped'}`} > {app.name === 'Jupyter' && (app.status === 'starting' || app.status === 'stopping') ? ( -
+
) : app.name === 'Jupyter' && app.status === 'running' ? ( 'Open' ) : app.name === 'System Shell' ? ( diff --git a/desktop/src/components/InstallComponents.tsx b/desktop/src/components/InstallComponents.tsx index 485b6163e57..7ca73844884 100644 --- a/desktop/src/components/InstallComponents.tsx +++ b/desktop/src/components/InstallComponents.tsx @@ -317,14 +317,14 @@ export const ExtensionSelector = ({ // Select all in a category const selectCategory = (categoryId: string) => { let categoryExtensions = extensions.filter((ext) => ext.category === categoryId); - + // Filter out already installed packages for provider, router, and other-openbb categories if (categoryId === "provider" || categoryId === "router" || categoryId === "other-openbb") { categoryExtensions = categoryExtensions.filter( (ext) => !installedPackages.has(ext.id.toLowerCase()) ); } - + const categoryExtensionIds = categoryExtensions.map((ext) => ext.id); setSelectedExtensions((prev) => { @@ -338,14 +338,14 @@ export const ExtensionSelector = ({ // Clear all in a category const clearCategory = (categoryId: string) => { let categoryExtensions = extensions.filter((ext) => ext.category === categoryId); - + // Filter out already installed packages for provider, router, and other-openbb categories if (categoryId === "provider" || categoryId === "router" || categoryId === "other-openbb") { categoryExtensions = categoryExtensions.filter( (ext) => !installedPackages.has(ext.id.toLowerCase()) ); } - + const categoryExtensionIds = categoryExtensions.map((ext) => ext.id); setSelectedExtensions((prev) => @@ -356,14 +356,14 @@ export const ExtensionSelector = ({ // Get extensions for a specific category const getExtensionsByCategory = (categoryId: string) => { let categoryExtensions = extensions.filter((ext) => ext.category === categoryId); - + // Filter out already installed packages for provider, router, and other-openbb categories if (categoryId === "provider" || categoryId === "router" || categoryId === "other-openbb") { categoryExtensions = categoryExtensions.filter( (ext) => !installedPackages.has(ext.id.toLowerCase()) ); } - + return categoryExtensions; }; @@ -392,10 +392,10 @@ export const ExtensionSelector = ({ ]; console.log("Installing extensions:", extensionsToInstall); - + // Call installation and wait for completion onInstallExtensions(extensionsToInstall); - + console.log("Extension installation completed successfully"); } catch (error) { console.error("Installation failed:", error); @@ -428,11 +428,21 @@ export const ExtensionSelector = ({ }; + const getCheckboxState = (categoryId: string) => { + const categoryExtensions = getExtensionsByCategory(categoryId); + const totalCount = categoryExtensions.length; + const selectedCount = countSelectedInCategory(categoryId); + + if (selectedCount === 0) return 'checked'; + if (selectedCount === totalCount) return 'indeterminate'; + return 'indeterminate'; + }; + // Update the useEffect to use the new hasMatchingExtensions useEffect(() => { // If current active tab has no matches, switch to first available tab if (!hasMatchingExtensions(extensions, activeCategoryTab, localSearchQuery, installedPackages)) { - const firstMatchingCategory = categories.find(category => + const firstMatchingCategory = categories.find(category => hasMatchingExtensions(extensions, category.id, localSearchQuery, installedPackages) ); if (firstMatchingCategory) { @@ -443,7 +453,7 @@ export const ExtensionSelector = ({ return (
-
+
{loading ? (
@@ -547,50 +557,25 @@ export const ExtensionSelector = ({ {/* Select all row for applicable categories */} {(category.id === "provider" || category.id === "router" || category.id === "other-openbb") && (
- - 0} - onChange={() => { - if (countSelectedInCategory(activeCategoryTab) > 0) { - clearCategory(activeCategoryTab); - } else { - selectCategory(activeCategoryTab); - } - }} - className="h-4 w-4 accent-theme-accent border-accent cursor-pointer" - style={{ - appearance: "none", - border: "1.5px solid var(--border-accent)", - borderRadius: "3px", - position: "relative", - background: countSelectedInCategory(activeCategoryTab) > 0 - ? "var(--button-neutral-bg)" - : "transparent", - transition: "background 0.15s", - }} - /> - - {/* Horizontal line inside the checkbox when checked */} - + + { + if ( + countSelectedInCategory(activeCategoryTab) > 0 + ) { + clearCategory(activeCategoryTab); + } else { + selectCategory(activeCategoryTab); + } + }} + className={`checkbox ${getCheckboxState(activeCategoryTab) === 'indeterminate' ? 'indeterminate' : ''}`} + /> + {/* Select All Button */}
{condaPackages.length === 0 && ( -
+
No Conda packages added.
)} {condaPackages.length > 0 && (
-
+
{condaPackages.map((pkg) => (
{customPackages.length === 0 && ( -
+
No PyPI packages added.
)} {customPackages.length > 0 && (
-
+
{customPackages.map((pkg) => (
+
{localSearchQuery.trim() ? "No extensions in this category match the search." : "No extensions available in this category. If they have already been installed, they will not appear here."} @@ -767,7 +752,7 @@ export const ExtensionSelector = ({ ) ) : (
-
+
{categoryExtensions.map((extension) => (
0 && (
- diff --git a/desktop/src/components/Toast.tsx b/desktop/src/components/Toast.tsx new file mode 100644 index 00000000000..340d154d33f --- /dev/null +++ b/desktop/src/components/Toast.tsx @@ -0,0 +1,55 @@ +import React from "react"; +import { Button } from "@openbb/ui-pro"; +import CustomIcon from "../components/Icon"; + +interface ToastProps { + title: string; + children: React.ReactNode; + onClose: () => void; + buttonText?: string; + onButtonClick?: () => void; +} + + +const Toast: React.FC = ({ + title, + children, + onClose, + buttonText, + onButtonClick, +}) => { + return ( +
+
+
+
+ +
{title}
+
+ +
+
{children}
+ {buttonText && onButtonClick && ( +
+ +
+ )} +
+
+ ); +}; + +export default Toast; diff --git a/desktop/src/routes/api-keys.tsx b/desktop/src/routes/api-keys.tsx index c5e86a80a2e..44aaba00fb4 100644 --- a/desktop/src/routes/api-keys.tsx +++ b/desktop/src/routes/api-keys.tsx @@ -514,8 +514,10 @@ export default function ApiKeysPage() { if (hasScrollbar) { const scrollbarWidth = scrollContainer.offsetWidth - scrollContainer.clientWidth; header.style.paddingRight = `${scrollbarWidth}px`; + content.style.paddingRight = `${scrollbarWidth}px`; } else { header.style.paddingRight = "0px"; + content.style.paddingRight = "0px"; } }); @@ -657,12 +659,12 @@ export default function ApiKeysPage() {
)}
{/* API Keys List */} {filteredApiKeys.length > 0 ? ( -
+
{filteredApiKeys.map((apiKey) => { const originalIndex = apiKeys.findIndex( (k) => k.key === apiKey.key, @@ -670,7 +672,7 @@ export default function ApiKeysPage() { return (
{/* Key Name */}
{apiKey.key}
@@ -686,51 +688,50 @@ export default function ApiKeysPage() { : "Undefined"}
{/* Action Buttons */} - {/* Action Buttons */} -
- - - - - - - - + + + - -
+ + + + + +
); })} @@ -903,16 +904,36 @@ export default function ApiKeysPage() { {/* Add API Key Button */} {filteredApiKeys.length === 0 && !loading && ( - // Empty state -
+ <> {searchQuery ? ( -

- No matching API keys -

+
+
+ +

+ No API keys found +

+

+ No API keys match your search for "{searchQuery}" +

+ +
+
) : ( -

No API keys added

+
+

No API keys added

+
)} -
+ )}
diff --git a/desktop/src/routes/backends.tsx b/desktop/src/routes/backends.tsx index 433b397d014..b819aff3d2c 100644 --- a/desktop/src/routes/backends.tsx +++ b/desktop/src/routes/backends.tsx @@ -15,6 +15,7 @@ import Select, { components } from 'react-select'; import { CopyIcon, DocumentationIcon, FileIcon, FolderIcon, HelpIcon, SettingsIcon } from "../components/Icon"; import CustomIcon from "~/components/Icon"; +import Toast from "../components/Toast"; // ============== TYPES ============== @@ -574,7 +575,7 @@ const BackendServiceItem: React.FC = React.memo( }) => { const isRunning = backend.status === "running"; const canDelete = !isRunning && !isProcessing; - + // Form data state const [formData, setFormData] = useState({ id: backend.id, @@ -656,7 +657,7 @@ const BackendServiceItem: React.FC = React.memo( if (backend.status === "running" && backend.id && !urlConfirmed) { console.log(`Setting up log listener for backend ${backend.id}`); const processId = `backend-${backend.id}`; - + const logListenerPromise = listen<{ processId: string; output: string; @@ -795,7 +796,7 @@ const BackendServiceItem: React.FC = React.memo( tracebackTimeout.current = null; } logListenerPromise.then((unlisten) => unlisten()).catch(console.error); - }; + }; } }, [backend.status, backend.id, urlConfirmed, onStatusUpdate]); @@ -816,12 +817,12 @@ const BackendServiceItem: React.FC = React.memo( setFormError("Backend Name is required"); return; } - + if (!formData.command || !formData.command.trim()) { setFormError("Executable is required"); return; } - + if (!formData.environment) { setFormError("Environment selection is required"); return; @@ -856,9 +857,9 @@ const BackendServiceItem: React.FC = React.memo( useEffect(() => { console.log(`Backend ${backend.id} status updated to: ${backend.status}`); }, [backend.status]); - + return ( -
  • +
  • {/* Backend name and status indicator */} @@ -892,7 +893,7 @@ const BackendServiceItem: React.FC = React.memo( }} variant="ghost" size="icon" - className="button-ghost opacity-0 group-hover:opacity-100 transition-opacity duration-200" + className="button-ghost opacity-0 group-hover:opacity-100 transition-opacity duration-0" aria-label="delete backend" > @@ -900,7 +901,7 @@ const BackendServiceItem: React.FC = React.memo( )} - @@ -911,9 +912,9 @@ const BackendServiceItem: React.FC = React.memo( e.stopPropagation(); onSelect(isSelected ? null : backend.id); }} - className="button-ghost opacity-0 group-hover:opacity-100 transition-opacity duration-200" + className="button-ghost opacity-0 group-hover:opacity-100 transition-opacity duration-0" > - + @@ -1027,7 +1028,7 @@ const BackendServiceItem: React.FC = React.memo( ) : ( - @@ -1069,7 +1070,7 @@ const BackendServiceItem: React.FC = React.memo( {/* Header */}

    Backend Configuration

    - @@ -1357,18 +1358,18 @@ const validateCommandInput = (command: string): { isValid: boolean; error?: stri for (const pattern of dangerousPatterns) { if (pattern.test(command)) { - return { - isValid: false, - error: "Command contains potentially dangerous characters or patterns." + return { + isValid: false, + error: "Command contains potentially dangerous characters or patterns." }; } } const allowedCharsPattern = /^[a-zA-Z0-9\s.\-_/:'",[\]{}]+$/; if (!allowedCharsPattern.test(command)) { - return { - isValid: false, - error: "Command containls invalid characters." + return { + isValid: false, + error: "Command containls invalid characters." }; } @@ -1686,8 +1687,8 @@ const AutoStartToggle: React.FC = React.memo( ({ autoStart, onChange, onCancel, onSubmit, isUpdate, formData }) => { // Check if command is valid (same validation as FormActions) const commandValidation = formData?.command ? validateCommandInput(formData.command) : { isValid: false }; - const isFormValid = formData?.name?.trim() && - formData?.command?.trim() && + const isFormValid = formData?.name?.trim() && + formData?.command?.trim() && formData?.environment?.trim() && commandValidation.isValid; @@ -1698,7 +1699,7 @@ const AutoStartToggle: React.FC = React.memo( htmlFor="auto-start-toggle" className="flex items-center cursor-pointer w-full relative top-3" > - @@ -1733,7 +1734,7 @@ const AutoStartToggle: React.FC = React.memo( Cancel - @@ -1764,8 +1765,8 @@ const FormActions: React.FC = React.memo( ({ onCancel, onSubmit, isUpdate, formData }) => { // Check if required fields are filled const commandValidation = formData?.command ? validateCommandInput(formData.command) : { isValid: false }; - const isFormValid = formData?.name?.trim() && - formData?.command?.trim() && + const isFormValid = formData?.name?.trim() && + formData?.command?.trim() && formData?.environment?.trim() && commandValidation.isValid; @@ -1922,7 +1923,7 @@ const BackendListPanel = memo( // Filter backends based on search query const filteredBackends = backends.filter(backend => { if (!searchQuery.trim()) return true; - + const query = searchQuery.toLowerCase(); return ( backend.name.toLowerCase().includes(query) || @@ -1947,13 +1948,13 @@ const BackendListPanel = memo( }; checkScrollbar(); - + // Use ResizeObserver to detect changes in content size const container = scrollContainerRef.current; if (container) { const resizeObserver = new ResizeObserver(checkScrollbar); resizeObserver.observe(container); - + return () => resizeObserver.disconnect(); } }, [filteredBackends]); @@ -2050,11 +2051,11 @@ const BackendListPanel = memo( {/* Show filtered results or "no results found" message */} {filteredBackends.length === 0 && searchQuery.trim() ? ( -
    +
    -

    No backends found @@ -2074,7 +2075,7 @@ const BackendListPanel = memo(

    ) : (
    -
    @@ -2106,9 +2107,9 @@ const BackendListPanel = memo( // Empty state - no header section - ONLY show when definitely done loading
    -

    No backend services found @@ -2117,7 +2118,7 @@ const BackendListPanel = memo( Create your first backend service to get started with running server applications.

    - - @@ -166,88 +166,65 @@ function EnvironmentActionButtons({ } function ExtensionRow({ - ext, - updatingExtension, - installExtensionsLoading, - handleUpdateExtension, - setExtensionToRemove, - setShowRemoveConfirmation, + ext, + updatingExtension, + installExtensionsLoading, + handleUpdateExtension, + setExtensionToRemove, + setShowRemoveConfirmation, }: { - ext: Extension; - updatingExtension: string | null; - installExtensionsLoading: boolean; - handleUpdateExtension: (packageName: string) => void; - setExtensionToRemove: (extension: Extension | null) => void; - setShowRemoveConfirmation: (show: boolean) => void; + ext: Extension; + updatingExtension: string | null; + installExtensionsLoading: boolean; + handleUpdateExtension: (packageName: string) => void; + setExtensionToRemove: (extension: Extension | null) => void; + setShowRemoveConfirmation: (show: boolean) => void; }) { - const [isHovered, setIsHovered] = useState(false); - - return ( -
    setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - > -
    -
    -
    - {ext.package} -
    -

    - {ext.version || "unknown"} -

    -
    -
    -
    - - - - - - -
    -
    - ); + return ( +
    +
    +
    + {ext.package} +
    +

    + {ext.version || "unknown"} +

    +
    +
    + + + + + + +
    +
    + ); } export default function EnvironmentsPage() { @@ -348,9 +325,9 @@ export default function EnvironmentsPage() { const [hasScrollbar, setHasScrollbar] = useState(false); const filteredEnvironments = useMemo(() => { if (!searchQuery.trim()) return environments; - + const query = searchQuery.toLowerCase(); - return environments.filter(env => + return environments.filter(env => env.name.toLowerCase().includes(query) || env.pythonVersion.toLowerCase().includes(query) || env.path.toLowerCase().includes(query) @@ -374,17 +351,17 @@ export default function EnvironmentsPage() { setWorkingDirValid(false); } }; - + const timeoutId = setTimeout(validateDirectory, 500); // Debounce validation return () => clearTimeout(timeoutId); }, [workingDirInput]); - + const handleDirectoryInputSubmit = () => { if (workingDirValid) { setCurrentWorkingDir(workingDirInput.trim() || null); } }; - + // Handle Enter key press in input const handleDirectoryInputKeyPress = (e: React.KeyboardEvent) => { if (e.key === "Enter") { @@ -439,8 +416,8 @@ export default function EnvironmentsPage() { // Filter out the "base" environment and any marked for deletion const filteredEnvs = envs.filter( - (env) => - env.name.toLowerCase() !== "base" && + (env) => + env.name.toLowerCase() !== "base" && !deletedEnvironments.current.has(env.name) ); @@ -479,17 +456,17 @@ export default function EnvironmentsPage() { if (cachedData) { const cache = JSON.parse(cachedData); const envNames = Object.keys(cache); - + if (envNames.length > 0) { console.log("Found cached environments:", envNames); - + // Create mock Environment objects from cache const cachedEnvs: Environment[] = envNames.map(name => ({ name, pythonVersion: cache[name]?.pythonVersion || "N/A", path: `${installDir}/conda/envs/${name}` })); - + setEnvironments(cachedEnvs); hasLoadedEnvironments.current = true; console.log("Loaded environments from cache:", cachedEnvs); @@ -514,11 +491,11 @@ export default function EnvironmentsPage() { const envs: Environment[] = await invoke("list_conda_environments", { directory: installDir, }); - + // Filter environments const filteredEnvs = envs.filter( - (env) => - env.name.toLowerCase() !== "base" && + (env) => + env.name.toLowerCase() !== "base" && !deletedEnvironments.current.has(env.name) ); @@ -804,7 +781,7 @@ export default function EnvironmentsPage() { environments.forEach(env => { if (sessionStorage.getItem(`updating-env-${env.name}`)) { updating.add(env.name); - + // Set a timeout to clear stale updating states setTimeout(() => { sessionStorage.removeItem(`updating-env-${env.name}`); @@ -1150,7 +1127,7 @@ end tell "get_environment_extensions", { name: env.name } ); - + newCache[env.name] = { extensions: result?.extensions || [], pythonVersion: env.pythonVersion, @@ -1493,10 +1470,10 @@ end tell "get_environment_extensions", { name: activeEnv } ); - + if (result?.extensions) { setExtensions(result.extensions); - + // Update cache const cachedData = localStorage.getItem(ENV_EXTENSIONS_CACHE_KEY); const cache = cachedData ? JSON.parse(cachedData) : {}; @@ -1884,7 +1861,7 @@ end tell // Log servers that remain active when navigating away useEffect(() => { return () => { - + const activeServerNames = Array.from(activeServers.current); if (activeServerNames.length > 0) { console.log("Keeping Jupyter servers running while navigating away:", activeServerNames); @@ -2184,7 +2161,7 @@ end tell const filteredEnvs = environments.filter( env => !deletedEnvironments.current.has(env.name) ); - + // Only update if there's actually a change if (filteredEnvs.length !== environments.length) { setEnvironments(filteredEnvs); @@ -2233,13 +2210,13 @@ end tell }; checkScrollbar(); - + // Use ResizeObserver to detect changes in content size const container = scrollContainerRef.current; if (container) { const resizeObserver = new ResizeObserver(checkScrollbar); resizeObserver.observe(container); - + return () => resizeObserver.disconnect(); } }, [filteredEnvironments]); @@ -2348,7 +2325,7 @@ end tell

    )} - + {/* RIGHT SIDE: Action Buttons */} {environments.length > 0 && ( ("list_conda_environments", { directory: installDir }) .then((envs) => { const filteredEnvs = envs.filter( - (env) => - env.name.toLowerCase() !== "base" && + (env) => + env.name.toLowerCase() !== "base" && !deletedEnvironments.current.has(env.name) ); setEnvironments(filteredEnvs); @@ -2421,14 +2398,15 @@ end tell
    ) : ( -
    -
    +
    +
      {filteredEnvironments.map((env) => (
    • -
      {/* LEFT: Clickable area for extensions modal */} -
      {env.name} @@ -2462,7 +2440,7 @@ end tell disabled={isUpdatingEnvironment.has(env.name)} variant="ghost" size="icon" - className={`button-ghost transition-opacity duration-200 ${isUpdatingEnvironment.has(env.name) ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'}`} + className={`button-ghost transition-opacity duration-0 ${isUpdatingEnvironment.has(env.name) ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'}`} aria-label="Update Environment" > {isUpdatingEnvironment.has(env.name) ? ( @@ -2481,7 +2459,7 @@ end tell }} variant="ghost" size="icon" - className="button-ghost opacity-0 group-hover:opacity-100 transition-opacity duration-200" + className="button-ghost opacity-0 group-hover:opacity-100 transition-opacity duration-0" disabled={isUpdatingEnvironment.has(env.name)} aria-label="Remove Environment" > @@ -2613,7 +2591,7 @@ end tell
    • ))} + {filteredEnvironments.length === 0 && !environmentsError && !environmentsLoading && ( +
      +
      + +

      + No environments found +

      +

      + No environments match your search for "{searchQuery}" +

      + +
      +
      + )}
    @@ -2852,7 +2854,7 @@ end tell className="button-ghost" > - +

    Are you sure you want to remove, {environmentToRemove}? @@ -3056,13 +3058,13 @@ end tell spellCheck="false" className={`w-full p-2 border rounded-md bg-theme-secondary text-theme-primary mt-2 ${ requirementsEnvName.trim() !== "" && !/^[a-z0-9-]+$/.test(requirementsEnvName) - ? "border-red-500 focus:border-red-500" + ? "border-red-500 focus:border-red-500" : "border-theme" }`} />

    Use lowercase letters, numbers, and hyphens. No spaces. diff --git a/desktop/src/routes/installation-progress.tsx b/desktop/src/routes/installation-progress.tsx index fb4017e2adb..eec51f0276a 100644 --- a/desktop/src/routes/installation-progress.tsx +++ b/desktop/src/routes/installation-progress.tsx @@ -354,7 +354,7 @@ const ExtensionSelector = ({ const categoryExtensions = getExtensionsByCategory(categoryId); const totalCount = categoryExtensions.length; const selectedCount = countSelectedInCategory(categoryId); - + if (selectedCount === 0) return 'checked'; if (selectedCount === totalCount) return 'indeterminate'; return 'indeterminate'; @@ -1292,7 +1292,7 @@ export default function InstallationProgress() {

    )}

    Installation & Setup

    - + {(phase !== "extension_select" &&phase !== "cancelled") && (
    @@ -1335,7 +1335,7 @@ export default function InstallationProgress() { />
    )} - {phase === "cancelled" && + {phase === "cancelled" && !error && isComplete && (
    diff --git a/desktop/src/styles.css b/desktop/src/styles.css index f9f2793ca48..8a38c0c59f6 100644 --- a/desktop/src/styles.css +++ b/desktop/src/styles.css @@ -4,49 +4,12 @@ @tailwind utilities; -html { - overflow-y: auto; -} - -body { - overflow-x: hidden; - overflow-y: auto; -} - -/* Only show scrollbars when needed */ * { - scrollbar-width: thin; /* For Firefox */ + scrollbar-width: auto; } ::-webkit-scrollbar { - width: 4px; /* for vertical scrollbars */ - height: 4px; /* for horizontal scrollbars */ - display: none; /* Hide by default */ -} - -/* Only show scrollbar when hovering over scrollable element that needs scrolling */ -:hover::-webkit-scrollbar { - display: block; -} - -/* Hide scrollbar when nothing to scroll */ -::-webkit-scrollbar:vertical { - display: none; -} - -::-webkit-scrollbar:horizontal { - display: none; -} - -/* Only show when content exceeds container size */ -.overflow-auto::-webkit-scrollbar:vertical, -.overflow-y-auto::-webkit-scrollbar:vertical { - display: block; -} - -.overflow-auto::-webkit-scrollbar:horizontal, -.overflow-x-auto::-webkit-scrollbar:horizontal { - display: block; + width: 6px; } ::-webkit-scrollbar-track { @@ -62,11 +25,11 @@ body { ::-webkit-scrollbar-thumb { background: #a2a2a2; border-radius: 6px; + height: 2rem; } .dark ::-webkit-scrollbar-thumb { background: #6d6e74; - border-radius: 6px; } ::-webkit-scrollbar-thumb:hover { @@ -82,8 +45,10 @@ body { --bg-secondary: #f7f7f9; --bg-tertiary: #efeff2; --bg-accent: rgb(0, 136, 204, 0.3); + --bg-toast: rgba(212, 229, 252, 1); --text-primary: #151518; + --text-primary-inverse: #ffffff; --text-secondary: #2c2c32; --text-tertiary: #6f6d80; --text-muted: rgba(21, 21, 24, 0.35); @@ -110,6 +75,7 @@ body { --info-icon: rgba(138, 138, 144, 1); --tab-border-active: #007acc; --tag-bg: rgba(90, 89, 97, 0.3); + --info-icon: rgba(138, 138, 144, 1); } .dark { @@ -119,6 +85,7 @@ body { --bg-quartary: rgba(36, 36, 42, 1); --bg-accent: rgb(0, 136, 204, 0.3); --text-primary: #ffffff; + --text-primary-inverse: #151518; --text-secondary: #EBEBED; --text-tertiary: #9793b0; --text-muted: rgba(138, 138, 144, 1); @@ -144,6 +111,7 @@ body { --tag-bg: rgba(90, 89, 97, 0.3); --dropdown-bg: rgba(36, 36, 42, 1); --info-icon: rgba(138, 138, 144, 1); + --bg-toast: rgba(212, 229, 252, 1); } .info-icon { @@ -156,6 +124,48 @@ body { background-color: var(--tag-bg); } +.bg-theme-toast { + background-color: var(--bg-toast); +} + +.button-toast, +.button-toast:focus, +.button-toast:focus-visible, +.dark .button-toast, +.dark .button-toast:focus, +.dark .button-toast:focus-visible { + background-color: rgb(0, 136, 204, 1); + color: #ffffff; + padding: 8px; + border-radius: 0.375rem; + +} + +.button-toast:hover, +.dark .button-toast:hover { + background-color: rgb(0, 136, 204, 0.85); + color: #ffffff; +} + +.toast-container, .dark .toast-container { + background-color: var(--bg-toast); + border-radius: 0.5rem; + color: var(--text-primary-inverse); + padding-top: 10px; + padding-bottom: 20px; + padding-left: 20px; + padding-right: 0; + font-weight: medium; + box-shadow: 0 10px 12px rgba(0, 0, 0, 0.3); +} + +.toast-info-icon { + color: var(--button-neutral-bg); + width: 25px; + height: 25px; + font-weight: bold; +} + /* UTILITY CLASSES */ .text-theme-accent { color: var(--text-accent); @@ -190,6 +200,16 @@ body { .button-outline { @apply border border-theme-outline rounded-sm; + transition: background-color 0.15s ease; +} + +.button-outline:hover, +.button-outline:focus, +.button-outline:focus-visible, +.button-outline:active { + background-color: var(--button-secondary-hover); + outline: none !important; + box-shadow: none !important; } .dark .button-outline:hover, @@ -203,8 +223,6 @@ body { box-shadow: none !important; } - - /* Theme utility classes */ .bg-theme-primary { background-color: var(--bg-primary); } .bg-theme-secondary { background-color: var(--bg-secondary); } @@ -274,37 +292,11 @@ body:not(.dark) .button-stop:focus-visible { outline: none; } -/* Primary button style */ -.button-primary { - background-color: var(--button-primary-bg); - color: var(--text-primary); - transition: all 0.2s ease; - border: 1px solid var(--border-theme-outline); -} - -.button-primary:hover { - outline: none; - box-shadow: none !important; -} - -.dark .button-primary:hover, .dark .button-primary:focus, .dark .button-primary:focus-visible { - outline: none; - box-shadow: none !important; -} - - -.button-primary:focus, .button-primary:focus-visible { - background-color: #1cab21; - outline: none; - box-shadow: none !important; -} - /* Primary button - theme */ .button-primary, .dark .button-primary { color: var(--button-primary-text); background-color: var(--button-primary-bg); - border: 1px solid var(--button-primary-border); box-shadow: none !important; } @@ -315,31 +307,21 @@ body:not(.dark) .button-stop:focus-visible { } /* Secondary button */ -.button-secondary:focus, .button-secondary:focus-visible { - box-shadow: none !important; -} -.button-secondary { - background-color: var(--button-secondary-bg); - color: var(--text-secondary); - border: 1px solid var(--button-secondary-border); - box-shadow: none !important; -} - -.dark .button-secondary { +.button-secondary, .dark .button-secondary { border: none; background-color: var(--button-secondary-bg); color: var(--text-secondary); box-shadow: none !important; } -.button-secondary:hover, .button-secondary:focus, .button-secondary:focus-visible { - outline: none !important; - box-shadow: none !important; - background-color: var(--button-secondary-hover); -} -.dark .button-secondary:hover, .dark .button-secondary:focus, .dark .button-secondary:focus-visible { +.button-secondary:hover, +.button-secondary:focus, +.button-secondary:focus-visible, +.dark .button-secondary:hover, +.dark .button-secondary:focus, +.dark .button-secondary:focus-visible { outline: none !important; box-shadow: none !important; background-color: var(--button-secondary-hover); @@ -353,24 +335,19 @@ body:not(.dark) .button-stop:focus-visible { } /* Neutral button */ -.dark .button-neutral { +.button-neutral, .dark .button-neutral { background-color: var(--button-neutral-bg); color: var(--text-primary); outline: none !important; box-shadow: none !important; } -.dark .button-neutral:hover, .dark .button-neutral:focus, .dark .button-neutral:focus-visible { - background-color: var(--button-neutral-bg-hover); - outline: none !important; - box-shadow: none !important; -} - -.button-neutral { - background-color: var(--button-neutral-bg); -} - -.button-neutral:hover, .button-neutral:focus, .button-neutral:focus-visible { +.button-neutral:hover, +.button-neutral:focus, +.button-neutral:focus-visible, +.dark .button-neutral:hover, +.dark .button-neutral:focus, +.dark .button-neutral:focus-visible { background-color: var(--button-neutral-bg-hover); outline: none !important; box-shadow: none !important; @@ -591,3 +568,14 @@ input[type=number]::-webkit-outer-spin-button { input[type=number] { -moz-appearance: textfield; } + +.ext-actions { + opacity: 0; + transition: opacity 0ms; + pointer-events: none; +} + +.ext-row:hover .ext-actions { + opacity: 1; + pointer-events: auto; +} \ No newline at end of file diff --git a/desktop/src/tests/routes/installation-progress.test.tsx b/desktop/src/tests/routes/installation-progress.test.tsx index a07e25c7b06..df1910e5c63 100644 --- a/desktop/src/tests/routes/installation-progress.test.tsx +++ b/desktop/src/tests/routes/installation-progress.test.tsx @@ -227,7 +227,7 @@ describe('InstallationProgressPage', () => { await waitFor(() => expect(screen.getByText(/Installation completed successfully!/i)).toBeInTheDocument()); act(() => { - fireEvent.click(screen.getByText('Continue to Open Data Platform')); + fireEvent.click(screen.getByText('Done')); }); await waitFor(() => expect(window.location.href).toBe('/environments?directory=%2Fmock%2Finstall%2Fdir&userDataDir=%2Fmock%2Fuser%2Fdata%2Fdir')); @@ -260,7 +260,7 @@ describe('InstallationProgressPage', () => { await waitFor(() => expect(screen.getByText(/Installation completed successfully!/i)).toBeInTheDocument()); act(() => { - fireEvent.click(screen.getByText('Continue to Open Data Platform')); + fireEvent.click(screen.getByText('Done')); }); await waitFor(() => expect(window.location.href).toBe('/environments?directory=%2Fmock%2Finstall%2Fdir&userDataDir=%2Fmock%2Fuser%2Fdata%2Fdir')); diff --git a/frontend-components/plotly/package-lock.json b/frontend-components/plotly/package-lock.json index a89fcdc940d..b6c5870aa9b 100644 --- a/frontend-components/plotly/package-lock.json +++ b/frontend-components/plotly/package-lock.json @@ -35,7 +35,7 @@ "react-hotkeys-hook": "^4.4.0", "tailwindcss": "^3.2.7", "typescript": "^4.9.3", - "vite": ">=6.3.6", + "vite": ">=7.1.11", "vite-plugin-singlefile": "^0.13.3" } }, @@ -6234,9 +6234,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend-components/plotly/package.json b/frontend-components/plotly/package.json index 512f4dbaded..9198a752ae6 100644 --- a/frontend-components/plotly/package.json +++ b/frontend-components/plotly/package.json @@ -37,7 +37,7 @@ "react-hotkeys-hook": "^4.4.0", "tailwindcss": "^3.2.7", "typescript": "^4.9.3", - "vite": ">=6.3.6", + "vite": ">=7.1.11", "vite-plugin-singlefile": "^0.13.3" } } diff --git a/frontend-components/tables/package-lock.json b/frontend-components/tables/package-lock.json index 5ce98c6e4e0..799a61f18b1 100644 --- a/frontend-components/tables/package-lock.json +++ b/frontend-components/tables/package-lock.json @@ -45,7 +45,7 @@ "postcss": "^8.4.21", "tailwindcss": "^3.2.7", "typescript": "^4.9.3", - "vite": ">=6.3.6", + "vite": ">=7.1.11", "vite-plugin-singlefile": "^2.3.0" } }, @@ -7213,9 +7213,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend-components/tables/package.json b/frontend-components/tables/package.json index d940eb8830f..6b214f76420 100644 --- a/frontend-components/tables/package.json +++ b/frontend-components/tables/package.json @@ -48,7 +48,7 @@ "postcss": "^8.4.21", "tailwindcss": "^3.2.7", "typescript": "^4.9.3", - "vite": ">=6.3.6", + "vite": ">=7.1.11", "vite-plugin-singlefile": "^2.3.0" } }